001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.actions.downloadtasks;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.util.Collections;
007import java.util.concurrent.Future;
008import java.util.regex.Matcher;
009import java.util.regex.Pattern;
010
011import org.openstreetmap.josm.Main;
012import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
013import org.openstreetmap.josm.data.osm.PrimitiveId;
014import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
015import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
016import org.openstreetmap.josm.gui.progress.ProgressMonitor;
017
018public class DownloadOsmIdTask extends DownloadOsmTask {
019
020    private static final String URL_ID_PATTERN = "https?://www\\.(osm|openstreetmap)\\.org/(node|way|relation)/(\\p{Digit}+).*";
021
022    @Override
023    public String[] getPatterns() {
024        return new String[]{URL_ID_PATTERN};
025    }
026
027    @Override
028    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
029        final Matcher matcher = Pattern.compile(URL_ID_PATTERN).matcher(url);
030        if (matcher.matches()) {
031            final OsmPrimitiveType type = OsmPrimitiveType.from(matcher.group(2));
032            final long id = Long.parseLong(matcher.group(3));
033            final PrimitiveId primitiveId = new SimplePrimitiveId(id, type);
034            final DownloadPrimitivesWithReferrersTask downloadTask = new DownloadPrimitivesWithReferrersTask(
035                    newLayer, Collections.singletonList(primitiveId), true, true, null, null);
036            return Main.worker.submit(downloadTask);
037        } else {
038            throw new IllegalStateException("Failed to parse id from " + url);
039        }
040    }
041
042    @Override
043    public String getTitle() {
044        return tr("Download OSM object by ID");
045    }
046}