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.Collection; 007import java.util.HashSet; 008import java.util.LinkedList; 009import java.util.List; 010 011import org.openstreetmap.josm.Main; 012import org.openstreetmap.josm.data.osm.DataSet; 013import org.openstreetmap.josm.data.osm.OsmPrimitive; 014import org.openstreetmap.josm.data.osm.PrimitiveId; 015import org.openstreetmap.josm.data.osm.SimplePrimitiveId; 016import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask; 017import org.openstreetmap.josm.gui.util.GuiHelper; 018import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog; 019import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault; 020 021/** 022 * Loads OSM primitives using their ID 023 * similar to the "Download object" dialog (@see DownloadPrimitiveAction}. 024 * For instance, {@code /load_object?objects=n1,w2,r3[&new_layer=false&relation_members=true]}. 025 */ 026public class LoadObjectHandler extends RequestHandler { 027 028 /** 029 * The remote control command name used to load objects using their ID. 030 */ 031 public static final String command = "load_object"; 032 033 private final List<PrimitiveId> ps = new LinkedList<>(); 034 035 @Override 036 public String[] getMandatoryParams() { 037 return new String[]{"objects"}; 038 } 039 040 @Override 041 public String[] getOptionalParams() { 042 return new String[] {"new_layer", "layer_name", "addtags", "relation_members", "referrers"}; 043 } 044 045 @Override 046 public String getUsage() { 047 return "downloads the specified objects from the server"; 048 } 049 050 @Override 051 public String[] getUsageExamples() { 052 return new String[] {"/load_object?new_layer=true&objects=w106159509", 053 "/load_object?new_layer=true&objects=r2263653&relation_members=true", 054 "/load_object?objects=n100000&referrers=false" 055 }; 056 } 057 058 @Override 059 protected void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException { 060 if (!PermissionPrefWithDefault.LOAD_DATA.isAllowed()) { 061 Main.info("RemoteControl: download forbidden by preferences"); 062 } 063 if (!ps.isEmpty()) { 064 final boolean newLayer = isLoadInNewLayer(); 065 final boolean relationMembers = Boolean.parseBoolean(args.get("relation_members")); 066 final boolean referrers = Boolean.parseBoolean(args.get("referrers")); 067 final DownloadPrimitivesWithReferrersTask task = new DownloadPrimitivesWithReferrersTask( 068 newLayer, ps, referrers, relationMembers, args.get("layer_name"), null); 069 Main.worker.submit(task); 070 Main.worker.submit(new Runnable() { 071 @Override 072 public void run() { 073 final List<PrimitiveId> downloaded = task.getDownloadedId(); 074 final DataSet ds = Main.main.getCurrentDataSet(); 075 if (downloaded != null) { 076 GuiHelper.runInEDT(new Runnable() { 077 @Override 078 public void run() { 079 ds.setSelected(downloaded); 080 } 081 }); 082 Collection<OsmPrimitive> downlPrim = new HashSet<>(); 083 for (PrimitiveId id : downloaded) { 084 downlPrim.add(ds.getPrimitiveById(id)); 085 } 086 AddTagsDialog.addTags(args, sender, downlPrim); 087 } 088 ps.clear(); 089 } 090 }); 091 } 092 } 093 094 @Override 095 public String getPermissionMessage() { 096 return tr("Remote Control has been asked to load objects (specified by their id) from the API."); 097 } 098 099 @Override 100 public PermissionPrefWithDefault getPermissionPref() { 101 return PermissionPrefWithDefault.LOAD_DATA; 102 } 103 104 @Override 105 protected void validateRequest() throws RequestHandlerBadRequestException { 106 ps.clear(); 107 for (String i : (args != null ? args.get("objects") : "").split(",\\s*")) { 108 try { 109 ps.add(SimplePrimitiveId.fromString(i)); 110 } catch (IllegalArgumentException e) { 111 Main.warn("RemoteControl: invalid selection '"+i+"' ignored"); 112 } 113 } 114 } 115}