001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.io.remotecontrol.handler; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.util.LinkedList; 007import java.util.List; 008 009import org.openstreetmap.josm.Main; 010import org.openstreetmap.josm.actions.DownloadPrimitiveAction; 011import org.openstreetmap.josm.data.osm.PrimitiveId; 012import org.openstreetmap.josm.data.osm.SimplePrimitiveId; 013import org.openstreetmap.josm.gui.util.GuiHelper; 014import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog; 015import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault; 016 017/** 018 * Loads OSM primitives using their ID 019 * similar to the "Download object" dialog (@see DownloadPrimitiveAction}. 020 * For instance, {@code /load_object?objects=n1,w2,r3[&new_layer=false&relation_members=true]}. 021 */ 022public class LoadObjectHandler extends RequestHandler { 023 024 /** 025 * The remote control command name used to load objects using their ID. 026 */ 027 public static final String command = "load_object"; 028 029 private final List<PrimitiveId> ps = new LinkedList<PrimitiveId>(); 030 031 @Override 032 public String[] getMandatoryParams() { 033 return new String[]{"objects"}; 034 } 035 036 @Override 037 public String[] getOptionalParams() 038 { 039 return new String[] {"new_layer", "addtags"}; 040 } 041 042 @Override 043 public String[] getUsageExamples() { 044 return new String[] {"/load_object?new_layer=true&objects=w106159509", 045 "/load_object?new_layer=true&objects=r2263653&relation_members=true" 046 }; 047 } 048 049 @Override 050 protected void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException { 051 if (!PermissionPrefWithDefault.LOAD_DATA.isAllowed()) { 052 Main.info("RemoteControl: download forbidden by preferences"); 053 } 054 if (!ps.isEmpty()) { 055 final boolean newLayer = isLoadInNewLayer(); 056 final boolean relationMembers = Boolean.parseBoolean(args.get("relation_members")); 057 GuiHelper.runInEDTAndWait(new Runnable() { 058 @Override public void run() { 059 DownloadPrimitiveAction.processItems(newLayer, ps, true, relationMembers); 060 } 061 }); 062 GuiHelper.executeByMainWorkerInEDT(new Runnable() { 063 @Override 064 public void run() { 065 Main.main.getCurrentDataSet().setSelected(ps); 066 AddTagsDialog.addTags(args, sender); 067 ps.clear(); 068 } 069 }); 070 } 071 } 072 073 @Override 074 public String getPermissionMessage() { 075 return tr("Remote Control has been asked to load objects (specified by their id) from the API."); 076 } 077 078 @Override 079 public PermissionPrefWithDefault getPermissionPref() { 080 return PermissionPrefWithDefault.LOAD_DATA; 081 } 082 083 @Override 084 protected void validateRequest() throws RequestHandlerBadRequestException { 085 ps.clear(); 086 for (String i : args.get("objects").split(",\\s*")) { 087 try { 088 ps.add(SimplePrimitiveId.fromString(i)); 089 } catch (IllegalArgumentException e) { 090 Main.warn("RemoteControl: invalid selection '"+i+"' ignored"); 091 } 092 } 093 } 094}