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}