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/(?:browse/)?(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(DownloadParams settings, 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 settings.isNewLayer(), 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}