Changeset 10684 in osm for applications


Ignore:
Timestamp:
2008-09-14T14:45:47+02:00 (16 years ago)
Author:
petrdlouhy
Message:

better error handling and inheritance

Location:
applications/editors/josm/plugins/wmsplugin/src/wmsplugin
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/wmsplugin/src/wmsplugin/Grabber.java

    r10683 r10684  
    11package wmsplugin;
    22
    3 public interface Grabber extends Runnable {
    4        
     3import org.openstreetmap.josm.data.Bounds;
     4import org.openstreetmap.josm.data.projection.Projection;
     5import org.openstreetmap.josm.gui.MapView;
     6import org.openstreetmap.josm.Main;
     7import java.awt.image.BufferedImage;
     8import java.awt.Graphics;
     9import java.awt.Color;
     10import java.awt.Font;
     11import javax.swing.JOptionPane;
     12
     13abstract public class Grabber implements Runnable {
     14        protected Bounds b;
     15        protected Projection proj;
     16        protected double pixelPerDegree;
     17        protected MapView mv;
     18        protected WMSLayer layer;
     19        protected GeorefImage image;
     20
     21        Grabber(Bounds b, Projection proj,
     22                        double pixelPerDegree, GeorefImage image, MapView mv, WMSLayer layer) {
     23                this.b = b;
     24                this.proj = proj;
     25                this.pixelPerDegree = pixelPerDegree;
     26                this.image = image;
     27                this.mv = mv;
     28                this.layer = layer;
     29        }
     30
     31        abstract void fetch() throws Exception; // the image fetch code
     32
     33        int width(){
     34                return (int) ((b.max.lon() - b.min.lon()) * pixelPerDegree);
     35        }
     36        int height(){
     37                return (int) ((b.max.lat() - b.min.lat()) * pixelPerDegree);
     38        }
     39
     40        protected void grabError(Exception e){ // report error when grabing image
     41                e.printStackTrace();
     42               
     43                BufferedImage img = new BufferedImage(width(), height(), BufferedImage.TYPE_INT_ARGB);
     44                Graphics g = img.getGraphics();
     45                g.setColor(Color.RED);
     46                g.fillRect(0, 0, width(), height());
     47                Font font = g.getFont();
     48                Font tempFont = font.deriveFont(Font.PLAIN).deriveFont(36.0f);
     49                g.setFont(tempFont);
     50                g.setColor(Color.BLACK);
     51                g.drawString(e.getClass().getSimpleName() + " occured", 10, height()/2);
     52                image.image = img;
     53                g.setFont(font);
     54        }
     55
     56        protected void attempt(){ // try to fetch the image
     57                int maxTries = 5; // n tries for every image
     58                for (int i = 1; i <= maxTries; i++) {
     59                        try {
     60                                fetch();
     61                                break; // break out of the retry loop
     62                        } catch (Exception e) {
     63                                try { // sleep some time and then ask the server again
     64                                        Thread.sleep(random(1000, 2000));
     65                                } catch (InterruptedException e1) {}
     66
     67                                if(i == maxTries) grabError(e);
     68                        }
     69                }
     70        }
     71
     72        public static int random(int min, int max) {
     73            return (int)(Math.random() * ((max+1)-min) ) + min;
     74        }
    575}
  • applications/editors/josm/plugins/wmsplugin/src/wmsplugin/WMSGrabber.java

    r10683 r10684  
    11package wmsplugin;
    22
    3 import static org.openstreetmap.josm.tools.I18n.tr;
    4 
    53import java.awt.image.BufferedImage;
     4import java.io.BufferedReader;
    65import java.io.IOException;
    76import java.io.InputStream;
     7import java.io.InputStreamReader;
     8import java.net.HttpURLConnection;
    89import java.net.MalformedURLException;
    910import java.net.URL;
     11import java.net.URLConnection;
    1012import java.text.DecimalFormat;
    1113import java.text.DecimalFormatSymbols;
    1214import java.text.NumberFormat;
    1315import java.util.Locale;
    14 import java.util.ArrayList;
    1516
    1617import javax.imageio.ImageIO;
    17 import javax.swing.JOptionPane;
    1818
    1919import org.openstreetmap.josm.Main;
     
    2424
    2525
    26 public class WMSGrabber implements Grabber {
     26public class WMSGrabber extends Grabber {
    2727        protected String baseURL;
    2828
    29         protected Bounds b;
    30         protected Projection proj;
    31         protected double pixelPerDegree;
    32         protected GeorefImage image;
    33         protected MapView mv;
    34         protected WMSLayer layer;
    35 
    36         WMSGrabber(String _baseURL, Bounds _b, Projection _proj,
    37                         double _pixelPerDegree, GeorefImage _image, MapView _mv, WMSLayer _layer) {
    38                 this.baseURL = _baseURL;
    39                 b = _b;
    40                 proj = _proj;
    41                 pixelPerDegree = _pixelPerDegree;
    42                 image = _image;
    43                 mv = _mv;
    44                 layer = _layer;
     29        WMSGrabber(String baseURL, Bounds b, Projection proj,
     30                        double pixelPerDegree, GeorefImage image, MapView mv, WMSLayer layer) {
     31                super(b, proj, pixelPerDegree, image, mv, layer);
     32                this.baseURL = baseURL;
    4533        }
    4634
    4735        public void run() {
     36                attempt();
     37                mv.repaint();
     38        }
     39
     40        void fetch() throws Exception{
     41                URL url = null;
     42                try {
     43                        url = getURL(
     44                                b.min.lon(), b.min.lat(),
     45                                b.max.lon(), b.max.lat(),
     46                                width(), height());
    4847                       
    49                         int w = (int) ((b.max.lon() - b.min.lon()) * pixelPerDegree);
    50                         int h = (int) ((b.max.lat() - b.min.lat()) * pixelPerDegree);
     48                        image.min = proj.latlon2eastNorth(b.min);
     49                        image.max = proj.latlon2eastNorth(b.max);
    5150
    52                         try {
    53                                 URL url = getURL(
    54                                         b.min.lon(), b.min.lat(),
    55                                         b.max.lon(), b.max.lat(),
    56                                         w, h);
    57 
    58                                 image.min = proj.latlon2eastNorth(b.min);
    59                                 image.max = proj.latlon2eastNorth(b.max);
    60 
     51                        if(image.isVisible(mv)) //don't download, if the image isn't visible already
    6152                                image.image = grab(url);
    62                                 image.downloadingStarted = false;
    63 
    64                                 mv.repaint();
    65                         }
    66                         catch (MalformedURLException e) {
    67                                 if(layer.messageNum-- > 0)
    68                                         JOptionPane.showMessageDialog(Main.parent,tr("WMSPlugin: Illegal url.\n{0}",e.getMessage()));
    69                         }
    70                         catch (IOException e) {
    71                                 if(layer.messageNum-- > 0)
    72                                         JOptionPane.showMessageDialog(Main.parent,tr("WMSPlugin: IO exception.\n{0}",e.getMessage()));
    73                         }
     53                        image.downloadingStarted = false;
     54                } catch(Exception e) {
     55                        throw new Exception(e.getMessage() + "\nImage couldn't be fetched: " + (url != null ? url.toString() : ""));
     56                }
    7457        }
    7558
     
    9073
    9174        protected BufferedImage grab(URL url) throws IOException {
    92                 InputStream is = new ProgressInputStream(
    93                         url.openConnection(), null);
    94                 if(!image.isVisible(mv))
    95                         return null;
     75                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
     76               
     77                String contentType = conn.getHeaderField("Content-Type");
     78                if( conn.getResponseCode() != 200
     79                                || contentType != null && !contentType.startsWith("image") ) {
     80                        throw new IOException(readException(conn));
     81                }
     82               
     83                InputStream is = new ProgressInputStream(conn, null);
    9684                BufferedImage img = ImageIO.read(is);
    9785                is.close();
    9886                return img;
    9987        }
     88
     89        protected String readException(URLConnection conn) throws IOException {
     90                StringBuilder exception = new StringBuilder();
     91                InputStream in = conn.getInputStream();
     92                BufferedReader br = new BufferedReader(new InputStreamReader(in));
     93               
     94                String line = null;
     95                while( (line = br.readLine()) != null) {
     96                        exception.append(line);
     97                        exception.append('\n');
     98                }
     99                return exception.toString();
     100        }
    100101}
  • applications/editors/josm/plugins/wmsplugin/src/wmsplugin/WMSLayer.java

    r10683 r10684  
    66import java.awt.Component;
    77import java.awt.Graphics;
    8 import java.awt.Point;
    98import java.awt.Toolkit;
    109import java.awt.event.ActionEvent;
     
    1211import java.io.FileInputStream;
    1312import java.io.FileOutputStream;
    14 import java.io.IOException;
    1513import java.io.ObjectInputStream;
    1614import java.io.ObjectOutputStream;
    17 import java.util.ArrayList;
    1815
    1916import javax.swing.AbstractAction;
     
    2926import org.openstreetmap.josm.Main;
    3027import org.openstreetmap.josm.actions.ExtensionFileFilter;
    31 import org.openstreetmap.josm.actions.SaveActionBase;
    3228import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
    33 import org.openstreetmap.josm.data.projection.Projection;
    3429import org.openstreetmap.josm.data.Bounds;
    3530import org.openstreetmap.josm.data.coor.LatLon;
    3631import org.openstreetmap.josm.gui.MapView;
    37 import java.util.ArrayList;
    3832import java.util.concurrent.ExecutorService;
    3933import java.util.concurrent.Executors;
  • applications/editors/josm/plugins/wmsplugin/src/wmsplugin/YAHOOGrabber.java

    r10683 r10684  
    44
    55import java.awt.image.BufferedImage;
     6import java.awt.Image;
     7import java.net.URL;
     8import java.util.ArrayList;
    69import java.io.IOException;
    7 import java.io.InputStream;
    8 import java.io.InputStreamReader;
    9 import java.io.BufferedReader;
    10 import java.net.MalformedURLException;
    11 import java.net.URL;
    12 import java.text.DecimalFormat;
    13 import java.text.DecimalFormatSymbols;
    14 import java.text.NumberFormat;
    15 import java.util.Locale;
    16 import java.util.ArrayList;
    1710
    18 import java.awt.*;
    19 import java.awt.image.*;
    20 import java.io.*;
    21 import java.net.*;
    22 import java.util.ArrayList;
    23 import java.util.List;
    2411import java.util.StringTokenizer;
    2512
    2613import javax.imageio.ImageIO;
    27 import javax.swing.JOptionPane;
    2814
    2915import org.openstreetmap.josm.Main;
    3016import org.openstreetmap.josm.data.Bounds;
    3117import org.openstreetmap.josm.data.projection.Projection;
    32 import org.openstreetmap.josm.io.ProgressInputStream;
    3318import org.openstreetmap.josm.gui.MapView;
    3419
    3520
    36 public class YAHOOGrabber implements Grabber{
    37         protected String baseURL;
     21public class YAHOOGrabber extends WMSGrabber{
    3822        protected String browserCmd;
    3923
    40         protected Bounds b;
    41         protected Projection proj;
    42         protected double pixelPerDegree;
    43         protected GeorefImage image;
    44         protected MapView mv;
    45         protected WMSLayer layer;
    46         protected int width, height;
    47 
    48         YAHOOGrabber(String _baseURL, Bounds _b, Projection _proj,
    49                         double _pixelPerDegree, GeorefImage _image, MapView _mv, WMSLayer _layer) {
    50                 this.baseURL = "file://" + Main.pref.getPreferencesDir() + "plugins/wmsplugin/ymap.html?request=getmap&format=image/jpeg";
    51                 this.browserCmd = _baseURL.replaceFirst("yahoo://", "");
    52                 this.b = _b;
    53                 this.proj = _proj;
    54                 this.pixelPerDegree = _pixelPerDegree;
    55                 this.image = _image;
    56                 this.mv = _mv;
    57                 this.layer = _layer;
     24        YAHOOGrabber(String baseURL, Bounds b, Projection proj,
     25                        double pixelPerDegree, GeorefImage image, MapView mv, WMSLayer layer) {
     26                super("file://" + Main.pref.getPreferencesDir() + "plugins/wmsplugin/ymap.html?request=getmap&format=image/jpeg", b, proj, pixelPerDegree, image, mv, layer);
     27                this.browserCmd = baseURL.replaceFirst("yahoo://", "");
    5828        }
    5929
    60         public void run() {
    61                         Image img;
    62                        
    63                         width = (int) ((b.max.lon() - b.min.lon()) * pixelPerDegree);
    64                         height = (int) ((b.max.lat() - b.min.lat()) * pixelPerDegree);
    65 
    66                         try {
    67                                 URL url = getURL(
    68                                         b.min.lon(), b.min.lat(),
    69                                         b.max.lon(), b.max.lat(),
    70                                         width, height);
    71 
    72                                 image.min = proj.latlon2eastNorth(b.min);
    73                                 image.max = proj.latlon2eastNorth(b.max);
    74                                 if(!image.isVisible(mv)){ //don't download, if the image isn't visible already
    75                                         image.downloadingStarted = false;
    76                                         return;
    77                                 }
    78                                 Process browser = browse(url.toString());;
    79                                 image.image =  new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    80                                 img = ImageIO.read(browser.getInputStream()).getScaledInstance(width, height, Image.SCALE_FAST);
    81                                 image.image.getGraphics().drawImage(img, 0 , 0, null);
    82 
    83                                 image.downloadingStarted = false;
    84 
    85                                 mv.repaint();
    86                         }
    87                         catch (MalformedURLException e) {
    88                                 if(layer.messageNum-- > 0)
    89                                         JOptionPane.showMessageDialog(Main.parent,tr("WMSPlugin (YAHOOGrabber): Illegal url.\n{0}",e.getMessage()));
    90                         }
    91                         catch (IOException e) {
    92                                 if(layer.messageNum-- > 0)
    93                                         JOptionPane.showMessageDialog(Main.parent,tr("WMSPlugin (YAHOOGrabber): IO exception.\n{0}",e.getMessage()));
    94                         }
    95                         catch (NullPointerException e) {
    96                                 if(layer.messageNum-- > 0)
    97                                         JOptionPane.showMessageDialog(Main.parent,tr("WMSPlugin (YAHOOGrabber): Null pointer exception.\n{0}",e.getMessage()));
    98                         }
    99         }
    100 
    101 
    102         protected Process browse(String url) throws IOException {
     30        protected BufferedImage grab(URL url) throws IOException {
    10331                ArrayList<String> cmdParams = new ArrayList<String>();
    10432               
    105                 StringTokenizer st = new StringTokenizer(tr(browserCmd, url));
     33                StringTokenizer st = new StringTokenizer(tr(browserCmd, url.toString()));
    10634                while( st.hasMoreTokens() )
    10735                        cmdParams.add(st.nextToken());
     
    11038                ProcessBuilder builder = new ProcessBuilder( cmdParams);
    11139
     40
     41                Process browser;
    11242                try {
    113                         return builder.start();
     43                        browser = builder.start();
    11444                }
    11545                catch(IOException ioe) {
    116                         throw new IOException( tr("Could not start browser. Please check that the executable path is correct."));
     46                        throw new IOException( "Could not start browser. Please check that the executable path is correct.\n" + ioe.getMessage() );
    11747                }
     48
     49                BufferedImage i =  new BufferedImage(width(), height(), BufferedImage.TYPE_INT_RGB);
     50                Image img = ImageIO.read(browser.getInputStream()).getScaledInstance(width(), height(), Image.SCALE_FAST);
     51                i.getGraphics().drawImage(img, 0 , 0, null);
     52                return i;
    11853        }
    119 
    120         protected static final NumberFormat
    121                 latLonFormat = new DecimalFormat("###0.0000000",
    122                         new DecimalFormatSymbols(Locale.US));
    123 
    124         protected URL getURL(double w, double s,double e,double n,
    125                         int wi, int ht) throws MalformedURLException {
    126                 String str = baseURL + "&bbox="
    127                         + latLonFormat.format(w) + ","
    128                         + latLonFormat.format(s) + ","
    129                         + latLonFormat.format(e) + ","
    130                         + latLonFormat.format(n)
    131                         + "&width=" + wi + "&height=" + ht;
    132                 return new URL(str.replace(" ", "%20"));
    133         }
    134 
    13554}
Note: See TracChangeset for help on using the changeset viewer.