001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.plugins.streetside.utils.api; 003 004import javax.json.JsonArray; 005import javax.json.JsonObject; 006import javax.json.JsonValue; 007 008import org.openstreetmap.josm.data.coor.LatLon; 009import org.openstreetmap.josm.plugins.streetside.model.MapObject; 010import org.openstreetmap.josm.plugins.streetside.utils.StreetsideURL.APIv3; 011 012/** 013 * Decodes the JSON returned by {@link APIv3} into Java objects. 014 * Takes a {@link JsonObject} and {@link #decodeMapObject(JsonObject)} tries to convert it to a {@link MapObject}. 015 */ 016public final class JsonMapObjectDecoder { 017 private JsonMapObjectDecoder() { 018 // Private constructor to avoid instantiation 019 } 020 021 public static MapObject decodeMapObject(final JsonObject json) { 022 if (json == null || !"Feature".equals(json.getString("type", null))) { 023 return null; 024 } 025 026 final JsonValue properties = json.get("properties"); 027 final JsonValue geometry = json.get("geometry"); 028 if (properties instanceof JsonObject && geometry instanceof JsonObject) { 029 final String key = ((JsonObject) properties).getString("key", null); 030 final String packg = ((JsonObject) properties).getString("package", null); 031 final String value = ((JsonObject) properties).getString("value", null); 032 final Long firstSeenTime = JsonDecoder.decodeTimestamp(((JsonObject) properties).getString("first_seen_at", null)); 033 final Long lastSeenTime = JsonDecoder.decodeTimestamp(((JsonObject) properties).getString("last_seen_at", null)); 034 final Long updatedTime = JsonDecoder.decodeTimestamp(((JsonObject) properties).getString("updated_at", null)); 035 036 final JsonValue coordVal = "Point".equals(((JsonObject) geometry).getString("type", null)) 037 ? ((JsonObject) geometry).get("coordinates") 038 : null; 039 final LatLon coordinate = coordVal instanceof JsonArray ? JsonDecoder.decodeLatLon((JsonArray) coordVal) : null; 040 041 if ( 042 key != null && 043 packg != null && 044 value != null && 045 firstSeenTime != null && 046 lastSeenTime != null && 047 updatedTime != null && 048 coordinate != null 049 ) { 050 return new MapObject( 051 coordinate, 052 key, 053 packg, 054 value, 055 firstSeenTime, lastSeenTime, updatedTime 056 ); 057 } 058 } 059 return null; 060 } 061}