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 }