Changeset 11916 in josm for trunk/src/org
- Timestamp:
- 2017-04-15T16:15:28+02:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/io/OverpassDownloadReader.java
r11627 r11916 7 7 import java.io.InputStream; 8 8 import java.util.EnumMap; 9 import java.util.Map; 9 10 import java.util.NoSuchElementException; 11 import java.util.Objects; 12 import java.util.concurrent.ConcurrentHashMap; 10 13 import java.util.concurrent.TimeUnit; 11 14 import java.util.regex.Matcher; … … 46 49 } 47 50 51 /** 52 * Possible Overpass API output format, with the {@code [out:<directive>]} statement. 53 * @since 11916 54 */ 55 enum OverpassOutpoutFormat { 56 /** Default output format: plain OSM XML */ 57 OSM_XML("xml"), 58 /** OSM JSON format (not GeoJson) */ 59 OSM_JSON("json"), 60 /** CSV, see https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL#Output_Format_.28out.29 */ 61 CSV("csv"), 62 /** Custom, see https://overpass-api.de/output_formats.html#custom */ 63 CUSTOM("custom"), 64 /** Popup, see https://overpass-api.de/output_formats.html#popup */ 65 POPUP("popup"), 66 /** PBF, see https://josm.openstreetmap.de/ticket/14653 */ 67 PBF("pbf"); 68 69 private final String directive; 70 71 OverpassOutpoutFormat(String directive) { 72 this.directive = directive; 73 } 74 75 /** 76 * Returns the directive used in {@code [out:<directive>]} statement. 77 * @return the directive used in {@code [out:<directive>]} statement 78 */ 79 public String getDirective() { 80 return directive; 81 } 82 83 /** 84 * Returns the {@code OverpassOutpoutFormat} matching the given directive. 85 * @param directive directive used in {@code [out:<directive>]} statement 86 * @return {@code OverpassOutpoutFormat} matching the given directive 87 * @throws IllegalArgumentException in case of invalid directive 88 */ 89 static OverpassOutpoutFormat from(String directive) { 90 for (OverpassOutpoutFormat oof : values()) { 91 if (oof.directive.equals(directive)) { 92 return oof; 93 } 94 } 95 throw new IllegalArgumentException(directive); 96 } 97 } 98 99 static final Pattern OUTPUT_FORMAT_STATEMENT = Pattern.compile(".*\\[out:([a-z]{3,})\\].*", Pattern.DOTALL); 100 101 static final Map<OverpassOutpoutFormat, Class<? extends OsmReader>> outputFormatReaders = new ConcurrentHashMap<>(); 102 48 103 final String overpassServer; 49 104 final String overpassQuery; … … 60 115 this.overpassServer = overpassServer; 61 116 this.overpassQuery = overpassQuery.trim(); 117 } 118 119 /** 120 * Registers an OSM reader for the given Overpass output format. 121 * @param format Overpass output format 122 * @param readerClass OSM reader class 123 * @return the previous value associated with {@code format}, or {@code null} if there was no mapping 124 */ 125 public static final Class<? extends OsmReader> registerOverpassOutpoutFormatReader( 126 OverpassOutpoutFormat format, Class<? extends OsmReader> readerClass) { 127 return outputFormatReaders.put(Objects.requireNonNull(format), Objects.requireNonNull(readerClass)); 128 } 129 130 static { 131 registerOverpassOutpoutFormatReader(OverpassOutpoutFormat.OSM_XML, OverpassOsmReader.class); 62 132 } 63 133 … … 160 230 @Override 161 231 protected DataSet parseDataSet(InputStream source, ProgressMonitor progressMonitor) throws IllegalDataException { 162 return new OverpassOsmReader().doParseDataSet(source, progressMonitor); 232 OsmReader reader = null; 233 Matcher m = OUTPUT_FORMAT_STATEMENT.matcher(overpassQuery); 234 if (m.matches()) { 235 Class<? extends OsmReader> readerClass = outputFormatReaders.get(OverpassOutpoutFormat.from(m.group(1))); 236 if (readerClass != null) { 237 try { 238 reader = readerClass.getConstructor().newInstance(); 239 } catch (ReflectiveOperationException | IllegalArgumentException | SecurityException e) { 240 Main.error(e); 241 } 242 } 243 } 244 if (reader == null) { 245 reader = new OverpassOsmReader(); 246 } 247 return reader.doParseDataSet(source, progressMonitor); 163 248 } 164 249
Note:
See TracChangeset
for help on using the changeset viewer.