// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.io.remotecontrol.handler; import static org.openstreetmap.josm.tools.I18n.tr; import java.util.Arrays; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.imagery.ImageryInfo; import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType; import org.openstreetmap.josm.data.imagery.ImageryLayerInfo; import org.openstreetmap.josm.gui.layer.ImageryLayer; import org.openstreetmap.josm.gui.util.GuiHelper; import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault; import org.openstreetmap.josm.tools.Utils; /** * Adds an imagery (WMS/TMS) layer. For instance, {@code /imagery?title=...&type=...&url=...}. * @since 3715 */ public class ImageryHandler extends RequestHandler.RawURLParseRequestHandler { /** * The remote control command name used to add an imagery layer. */ public static final String command = "imagery"; @Override public String getPermissionMessage() { return tr("Remote Control has been asked to load an imagery layer from the following URL:") + "<br>" + args.get("url"); } @Override public String[] getMandatoryParams() { return new String[]{"url"}; } @Override public String[] getOptionalParams() { return new String[] {"title", "type", "cookies", "min_zoom", "max_zoom"}; } @Override public PermissionPrefWithDefault getPermissionPref() { return PermissionPrefWithDefault.LOAD_IMAGERY; } protected static ImageryInfo findBingEntry() { for (ImageryInfo i : ImageryLayerInfo.instance.getDefaultLayers()) { if (ImageryType.BING.equals(i.getImageryType())) { return i; } } return null; } protected ImageryInfo buildImageryInfo() { String url = args.get("url"); String title = args.get("title"); String type = args.get("type"); final ImageryInfo bing = ImageryType.BING.getTypeString().equals(type) ? findBingEntry() : null; if ((title == null || title.isEmpty()) && bing != null) { title = bing.getName(); } if (title == null || title.isEmpty()) { title = tr("Remote imagery"); } String cookies = args.get("cookies"); final ImageryInfo imgInfo = new ImageryInfo(title, url, type, null, cookies); if (bing != null) { imgInfo.setIcon(bing.getIcon()); } String minZoom = args.get("min_zoom"); if (minZoom != null && !minZoom.isEmpty()) { try { imgInfo.setDefaultMinZoom(Integer.parseInt(minZoom)); } catch (NumberFormatException e) { Main.error(e); } } String maxZoom = args.get("max_zoom"); if (maxZoom != null && !maxZoom.isEmpty()) { try { imgInfo.setDefaultMaxZoom(Integer.parseInt(maxZoom)); } catch (NumberFormatException e) { Main.error(e); } } return imgInfo; } @Override protected void handleRequest() throws RequestHandlerErrorException { final ImageryInfo imgInfo = buildImageryInfo(); if (Main.isDisplayingMapView()) { for (ImageryLayer layer : Main.getLayerManager().getLayersOfType(ImageryLayer.class)) { if (layer.getInfo().equals(imgInfo)) { Main.info("Imagery layer already exists: "+imgInfo); return; } } } GuiHelper.runInEDT(() -> { try { Main.getLayerManager().addLayer(ImageryLayer.create(imgInfo)); } catch (IllegalArgumentException e) { Main.error(e, false); } }); } @Override protected void validateRequest() throws RequestHandlerBadRequestException { String url = args != null ? args.get("url") : null; String type = args != null ? args.get("type") : null; String cookies = args != null ? args.get("cookies") : null; try { ImageryLayer.create(new ImageryInfo(null, url, type, null, cookies)); } catch (IllegalArgumentException e) { throw new RequestHandlerBadRequestException(e.getMessage(), e); } } @Override public String getUsage() { return "adds an imagery layer (e.g. WMS, TMS)"; } @Override public String[] getUsageExamples() { final String types = Utils.join("|", Utils.transform(Arrays.asList(ImageryInfo.ImageryType.values()), ImageryType::getTypeString)); return new String[] { "/imagery?title=osm&type=tms&url=https://a.tile.openstreetmap.org/%7Bzoom%7D/%7Bx%7D/%7By%7D.png", "/imagery?title=landsat&type=wms&url=http://irs.gis-lab.info/?" + "layers=landsat&SRS=%7Bproj%7D&WIDTH=%7Bwidth%7D&HEIGHT=%7Bheight%7D&BBOX=%7Bbbox%7D", "/imagery?title=...&type={"+types+"}&url=....[&cookies=...][&min_zoom=...][&max_zoom=...]" }; } }