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}