private void findGeoCode(final String input) {
   if (input == null || StringUtils.isNotBlank(cache.getGeocode())) {
     return;
   }
   final String trimmed = input.trim();
   final MatcherWrapper matcherGeocode = new MatcherWrapper(patternGeocode, trimmed);
   if (matcherGeocode.find()) {
     final String geocode = matcherGeocode.group(1);
     // a geocode should not be part of a word
     if (geocode.length() == trimmed.length()
         || Character.isWhitespace(trimmed.charAt(geocode.length()))) {
       if (ConnectorFactory.canHandle(geocode)) {
         cache.setGeocode(geocode);
       }
     }
   }
 }
  private static cgCache parseCache(final JSONObject response) {
    final cgCache cache = new cgCache();
    cache.setReliableLatLon(true);
    try {
      cache.setGeocode(response.getString(CACHE_CODE));
      cache.setName(response.getString(CACHE_NAME));
      // not used: names
      setLocation(cache, response.getString(CACHE_LOCATION));
      cache.setType(getCacheType(response.getString(CACHE_TYPE)));

      final String status = response.getString(CACHE_STATUS);
      cache.setDisabled(status.equalsIgnoreCase("Temporarily unavailable"));
      cache.setArchived(status.equalsIgnoreCase("Archived"));

      // not used: url
      final JSONObject owner = response.getJSONObject(CACHE_OWNER);
      cache.setOwner(parseUser(owner));

      cache.getLogCounts().put(LogType.LOG_FOUND_IT, response.getInt(CACHE_FOUNDS));
      cache.getLogCounts().put(LogType.LOG_DIDNT_FIND_IT, response.getInt(CACHE_NOTFOUNDS));
      cache.setSize(getCacheSize(response));
      cache.setDifficulty((float) response.getDouble(CACHE_DIFFICULTY));
      cache.setTerrain((float) response.getDouble(CACHE_TERRAIN));
      if (!response.isNull(CACHE_RATING)) {
        cache.setRating((float) response.getDouble(CACHE_RATING));
      }
      cache.setVotes(response.getInt(CACHE_VOTES));

      cache.setFavoritePoints(response.getInt(CACHE_RECOMMENDATIONS));
      // not used: req_password
      cache.setDescription(response.getString(CACHE_DESCRIPTION));
      cache.setHint(Html.fromHtml(response.getString(CACHE_HINT)).toString());
      // not used: hints

      final JSONArray images = response.getJSONArray(CACHE_IMAGES);
      if (images != null) {
        JSONObject imageResponse;
        for (int i = 0; i < images.length(); i++) {
          imageResponse = images.getJSONObject(i);
          if (imageResponse.getBoolean(CACHE_IMAGE_IS_SPOILER)) {
            final String title = imageResponse.getString(CACHE_IMAGE_CAPTION);
            final String url =
                absoluteUrl(imageResponse.getString(CACHE_IMAGE_URL), cache.getGeocode());
            final cgImage image = new cgImage(url, title);
            if (cache.getSpoilers() == null) {
              cache.setSpoilers(new ArrayList<cgImage>());
            }
            cache.getSpoilers().add(image);
          }
        }
      }

      // not used: attrnames
      cache.setLogs(parseLogs(response.getJSONArray(CACHE_LATEST_LOGS)));
      cache.setHidden(parseDate(response.getString(CACHE_HIDDEN)));

    } catch (JSONException e) {
      Log.e(Settings.tag, "OkapiClient.parseCache", e);
    }
    return cache;
  }