/** * Get user rating for a given guid or geocode. For a guid first the ratings cache is checked * before a request to gcvote.com is made. * * @param guid * @param geocode * @return */ public static GCVoteRating getRating(final String guid, final String geocode) { if (StringUtils.isNotBlank(guid) && RATINGS_CACHE.containsKey(guid)) { return RATINGS_CACHE.get(guid); } final Map<String, GCVoteRating> ratings = getRating(singletonOrNull(guid), singletonOrNull(geocode)); return MapUtils.isNotEmpty(ratings) ? ratings.values().iterator().next() : null; }
static Map<String, GCVoteRating> getRatingsFromXMLResponse( @NonNull final InputStream response, final boolean requestByGuids) { try { final XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); final XmlPullParser xpp = factory.newPullParser(); xpp.setInput(response, Charsets.UTF_8.name()); boolean loggedIn = false; final Map<String, GCVoteRating> ratings = new HashMap<>(); int eventType = xpp.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_TAG) { final String tagName = xpp.getName(); if (StringUtils.equals(tagName, "vote")) { final String guid = xpp.getAttributeValue(null, "cacheId"); final String id = requestByGuids ? guid : xpp.getAttributeValue(null, "waypoint"); final float myVote = loggedIn ? Float.parseFloat(xpp.getAttributeValue(null, "voteUser")) : 0; final GCVoteRating voteRating = new GCVoteRating( Float.parseFloat(xpp.getAttributeValue(null, "voteAvg")), Integer.parseInt(xpp.getAttributeValue(null, "voteCnt")), myVote); ratings.put(id, voteRating); } else if (StringUtils.equals(tagName, "votes")) { loggedIn = StringUtils.equals(xpp.getAttributeValue(null, "loggedIn"), "true"); } } eventType = xpp.next(); } RATINGS_CACHE.putAll(ratings); return ratings; } catch (final Exception e) { Log.e("Cannot parse GC vote result", e); return Collections.emptyMap(); } }
/** * @param data Retrieved data. * @return SearchResult. Never null. */ public static SearchResult parseMapJSON( final String data, final Tile tile, final Bitmap bitmap, final LivemapStrategy strategy) { final SearchResult searchResult = new SearchResult(); try { final LeastRecentlyUsedMap<String, String> nameCache = new LeastRecentlyUsedMap.LruCache<>(2000); // JSON id, cache name if (StringUtils.isEmpty(data)) { throw new ParserException("No page given"); } // Example JSON information // {"grid":[....], // // "keys":["","55_55","55_54","17_25","55_53","17_27","17_26","57_53","57_55","3_62","3_61","57_54","3_60","15_27","15_26","15_25","4_60","4_61","4_62","16_25","16_26","16_27","2_62","2_60","2_61","56_53","56_54","56_55"], // "data":{"55_55":[{"i":"gEaR","n":"Spiel & Sport"}],"55_54":[{"i":"gEaR","n":"Spiel & // Sport"}],"17_25":[{"i":"Rkzt","n":"EDSSW: Rathaus "}],"55_53":[{"i":"gEaR","n":"Spiel & // Sport"}],"17_27":[{"i":"Rkzt","n":"EDSSW: Rathaus "}],"17_26":[{"i":"Rkzt","n":"EDSSW: // Rathaus "}],"57_53":[{"i":"gEaR","n":"Spiel & Sport"}],"57_55":[{"i":"gEaR","n":"Spiel & // Sport"}],"3_62":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was // -"}],"3_61":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was // -"}],"57_54":[{"i":"gEaR","n":"Spiel & Sport"}],"3_60":[{"i":"gOWz","n":"Baumarktserie - // Wer Wo Was -"}],"15_27":[{"i":"Rkzt","n":"EDSSW: Rathaus // "}],"15_26":[{"i":"Rkzt","n":"EDSSW: Rathaus "}],"15_25":[{"i":"Rkzt","n":"EDSSW: Rathaus // "}],"4_60":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was // -"}],"4_61":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was // -"}],"4_62":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was // -"}],"16_25":[{"i":"Rkzt","n":"EDSSW: Rathaus "}],"16_26":[{"i":"Rkzt","n":"EDSSW: // Rathaus "}],"16_27":[{"i":"Rkzt","n":"EDSSW: Rathaus // "}],"2_62":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was // -"}],"2_60":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was // -"}],"2_61":[{"i":"gOWz","n":"Baumarktserie - Wer Wo Was // -"}],"56_53":[{"i":"gEaR","n":"Spiel & Sport"}],"56_54":[{"i":"gEaR","n":"Spiel & // Sport"}],"56_55":[{"i":"gEaR","n":"Spiel & Sport"}]} // } final ObjectNode json = (ObjectNode) JsonUtils.reader.readTree(data); final ArrayNode grid = (ArrayNode) json.get("grid"); if (grid == null || grid.size() != (UTFGrid.GRID_MAXY + 1)) { throw new ParserException("No grid inside JSON"); } final ArrayNode keys = (ArrayNode) json.get("keys"); if (keys == null) { throw new ParserException("No keys inside JSON"); } final ObjectNode dataObject = (ObjectNode) json.get("data"); if (dataObject == null) { throw new ParserException("No data inside JSON"); } // iterate over the data and construct all caches in this tile final Map<String, List<UTFGridPosition>> positions = new HashMap<>(); // JSON id as key final Map<String, List<UTFGridPosition>> singlePositions = new HashMap<>(); // JSON id as key for (final JsonNode rawKey : keys) { final String key = rawKey.asText(); if (StringUtils.isNotBlank(key)) { // index 0 is empty final UTFGridPosition pos = UTFGridPosition.fromString(key); final ArrayNode dataForKey = (ArrayNode) dataObject.get(key); for (final JsonNode cacheInfo : dataForKey) { final String id = cacheInfo.get("i").asText(); nameCache.put(id, cacheInfo.get("n").asText()); List<UTFGridPosition> listOfPositions = positions.get(id); List<UTFGridPosition> singleListOfPositions = singlePositions.get(id); if (listOfPositions == null) { listOfPositions = new ArrayList<>(); positions.put(id, listOfPositions); singleListOfPositions = new ArrayList<>(); singlePositions.put(id, singleListOfPositions); } listOfPositions.add(pos); if (dataForKey.size() == 1) { singleListOfPositions.add(pos); } } } } final List<Geocache> caches = new ArrayList<>(); for (final Entry<String, List<UTFGridPosition>> entry : positions.entrySet()) { final String id = entry.getKey(); final List<UTFGridPosition> pos = entry.getValue(); final UTFGridPosition xy = UTFGrid.getPositionInGrid(pos); final Geocache cache = new Geocache(); cache.setDetailed(false); cache.setReliableLatLon(false); cache.setGeocode(id); cache.setName(nameCache.get(id)); cache.setCoords(tile.getCoord(xy), tile.getZoomLevel()); if (strategy.flags.contains(LivemapStrategy.Flag.PARSE_TILES) && bitmap != null) { for (final UTFGridPosition singlePos : singlePositions.get(id)) { if (IconDecoder.parseMapPNG(cache, bitmap, singlePos, tile.getZoomLevel())) { break; // cache parsed } } } else { cache.setType(CacheType.UNKNOWN, tile.getZoomLevel()); } boolean exclude = false; if (Settings.isExcludeMyCaches() && (cache.isFound() || cache.isOwner())) { // workaround for BM exclude = true; } if (Settings.isExcludeDisabledCaches() && cache.isDisabled()) { exclude = true; } if (!Settings.getCacheType().contains(cache) && cache.getType() != CacheType.UNKNOWN) { // workaround for BM exclude = true; } if (!exclude) { caches.add(cache); } } searchResult.addAndPutInCache(caches); Log.d("Retrieved " + searchResult.getCount() + " caches for tile " + tile.toString()); } catch (RuntimeException | ParserException | IOException e) { Log.e("GCMap.parseMapJSON", e); } return searchResult; }