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.data.osm.OsmPrimitiveType;
012import org.openstreetmap.josm.data.osm.PrimitiveId;
013import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
014import org.openstreetmap.josm.gui.MainApplication;
015import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
016import org.openstreetmap.josm.gui.progress.ProgressMonitor;
017
018/**
019 * Specialized task for downloading OSM objects by ID.
020 * <p>
021 * It handles one URL pattern: openstreetmap website URL with {@code /(node|way|relation)/<id>} argument.
022 * @since 8240
023 */
024public class DownloadOsmIdTask extends DownloadOsmTask {
025
026    private static final String URL_ID_PATTERN = "https?://www\\.(osm|openstreetmap)\\.org/(node|way|relation)/(\\p{Digit}+).*";
027
028    @Override
029    public String[] getPatterns() {
030        return new String[]{URL_ID_PATTERN};
031    }
032
033    @Override
034    public Future<?> loadUrl(boolean newLayer, String url, ProgressMonitor progressMonitor) {
035        final Matcher matcher = Pattern.compile(URL_ID_PATTERN).matcher(url);
036        if (matcher.matches()) {
037            final OsmPrimitiveType type = OsmPrimitiveType.from(matcher.group(2));
038            final long id = Long.parseLong(matcher.group(3));
039            final PrimitiveId primitiveId = new SimplePrimitiveId(id, type);
040            final DownloadPrimitivesWithReferrersTask downloadTask = new DownloadPrimitivesWithReferrersTask(
041                    newLayer, Collections.singletonList(primitiveId), true, true, null, null);
042            return MainApplication.worker.submit(downloadTask);
043        } else {
044            throw new IllegalStateException("Failed to parse id from " + url);
045        }
046    }
047
048    @Override
049    public String getTitle() {
050        return tr("Download OSM object by ID");
051    }
052}