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 }