001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.io.imagery;
003    
004    import java.awt.image.BufferedImage;
005    import java.io.ByteArrayInputStream;
006    import java.io.ByteArrayOutputStream;
007    import java.io.IOException;
008    import java.net.URL;
009    import java.text.MessageFormat;
010    import java.util.ArrayList;
011    import java.util.StringTokenizer;
012    
013    import javax.imageio.ImageIO;
014    
015    import org.openstreetmap.josm.Main;
016    import org.openstreetmap.josm.data.preferences.StringProperty;
017    import org.openstreetmap.josm.gui.MapView;
018    import org.openstreetmap.josm.gui.layer.WMSLayer;
019    import org.openstreetmap.josm.tools.Utils;
020    
021    public class HTMLGrabber extends WMSGrabber {
022        public static final StringProperty PROP_BROWSER = new StringProperty("imagery.wms.browser", "webkit-image {0}");
023    
024        public HTMLGrabber(MapView mv, WMSLayer layer, boolean localOnly) {
025            super(mv, layer, localOnly);
026        }
027    
028        @Override
029        protected BufferedImage grab(WMSRequest request, URL url, int attempt) throws IOException {
030            String urlstring = url.toExternalForm();
031    
032            System.out.println("Grabbing HTML " + (attempt > 1? "(attempt " + attempt + ") ":"") + url);
033    
034            ArrayList<String> cmdParams = new ArrayList<String>();
035            StringTokenizer st = new StringTokenizer(MessageFormat.format(PROP_BROWSER.get(), urlstring));
036            while( st.hasMoreTokens() ) {
037                cmdParams.add(st.nextToken());
038            }
039    
040            ProcessBuilder builder = new ProcessBuilder( cmdParams);
041    
042            Process browser;
043            try {
044                browser = builder.start();
045            } catch(IOException ioe) {
046                throw new IOException( "Could not start browser. Please check that the executable path is correct.\n" + ioe.getMessage() );
047            }
048    
049            ByteArrayOutputStream baos = new ByteArrayOutputStream();
050            Utils.copyStream(browser.getInputStream(), baos);
051            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
052            BufferedImage img = layer.normalizeImage(ImageIO.read(bais));
053            bais.reset();
054            layer.cache.saveToCache(layer.isOverlapEnabled()?img:null, bais, Main.getProjection(), request.getPixelPerDegree(), b.minEast, b.minNorth);
055    
056            return img;
057        }
058    }