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