source: josm/trunk/src/org/openstreetmap/josm/io/GeoJSONMapRouletteWriter.java@ 18365

Last change on this file since 18365 was 18365, checked in by Don-vip, 2 years ago

see #15182 - make JOSM callable as standalone validator (patch by taylor.smock)

File size: 4.1 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.io;
3
4import java.util.Objects;
5import java.util.Optional;
6import java.util.stream.Stream;
7
8import javax.json.Json;
9import javax.json.JsonArray;
10import javax.json.JsonArrayBuilder;
11import javax.json.JsonObject;
12import javax.json.JsonObjectBuilder;
13import javax.json.JsonValue;
14
15import org.openstreetmap.josm.data.osm.DataSet;
16import org.openstreetmap.josm.data.osm.OsmPrimitive;
17import org.openstreetmap.josm.data.osm.WaySegment;
18import org.openstreetmap.josm.data.validation.TestError;
19import org.openstreetmap.josm.tools.Logging;
20
21/**
22 * Convert {@link TestError} to MapRoulette Tasks
23 * @author Taylor Smock
24 * @since 18365
25 */
26public class GeoJSONMapRouletteWriter extends GeoJSONWriter {
27
28 /**
29 * Constructs a new {@code GeoJSONWriter}.
30 * @param ds The originating OSM dataset
31 */
32 public GeoJSONMapRouletteWriter(DataSet ds) {
33 super(ds);
34 super.setOptions(Options.RIGHT_HAND_RULE, Options.WRITE_OSM_INFORMATION);
35 }
36
37 /**
38 * Convert a test error to a string
39 * @param testError The test error to convert
40 * @return The MapRoulette challenge object
41 */
42 public Optional<JsonObject> write(final TestError testError) {
43 final JsonObjectBuilder jsonObjectBuilder = Json.createObjectBuilder();
44 final JsonArrayBuilder featuresBuilder = Json.createArrayBuilder();
45 final JsonObjectBuilder propertiesBuilder = Json.createObjectBuilder();
46 propertiesBuilder.add("message", testError.getMessage());
47 Optional.ofNullable(testError.getDescription()).ifPresent(description -> propertiesBuilder.add("description", description));
48 propertiesBuilder.add("code", testError.getCode());
49 propertiesBuilder.add("fixable", testError.isFixable());
50 propertiesBuilder.add("severity", testError.getSeverity().toString());
51 propertiesBuilder.add("severityInteger", testError.getSeverity().getLevel());
52 propertiesBuilder.add("test", testError.getTester().getName());
53 Stream.concat(testError.getPrimitives().stream(), testError.getHighlighted().stream()).distinct().map(p -> {
54 if (p instanceof OsmPrimitive) {
55 return p;
56 } else if (p instanceof WaySegment) {
57 return ((WaySegment) p).toWay();
58 }
59 Logging.trace("Could not convert {0} to an OsmPrimitive", p);
60 return null;
61 }).filter(Objects::nonNull).distinct().map(OsmPrimitive.class::cast)
62 .forEach(primitive -> super.appendPrimitive(primitive, featuresBuilder));
63 final JsonArray featureArray = featuresBuilder.build();
64 final JsonArrayBuilder featuresMessageBuilder = Json.createArrayBuilder();
65 if (featureArray.isEmpty()) {
66 Logging.trace("Could not generate task for {0}", testError.getMessage());
67 return Optional.empty();
68 }
69 JsonObject primitive = featureArray.getJsonObject(0);
70 JsonObjectBuilder replacementPrimitive = Json.createObjectBuilder(primitive);
71 final JsonObjectBuilder properties;
72 if (primitive.containsKey("properties") && primitive.get("properties").getValueType() == JsonValue.ValueType.OBJECT) {
73 properties = Json.createObjectBuilder(primitive.getJsonObject("properties"));
74 } else {
75 properties = Json.createObjectBuilder();
76 }
77 properties.addAll(propertiesBuilder);
78 replacementPrimitive.add("properties", properties);
79 featuresMessageBuilder.add(replacementPrimitive);
80 for (int i = 1; i < featureArray.size(); i++) {
81 featuresMessageBuilder.add(featureArray.get(i));
82 }
83 // For now, don't add any cooperativeWork objects, as JOSM should be able to find the fixes.
84 // This should change if the ValidatorCLI can use plugins (especially those introducing external data, like
85 // the ElevationProfile plugin (which provides elevation data)).
86 jsonObjectBuilder.add("type", "FeatureCollection");
87 jsonObjectBuilder.add("features", featuresMessageBuilder);
88 return Optional.of(jsonObjectBuilder.build());
89 }
90}
Note: See TracBrowser for help on using the repository browser.