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}