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