@Override public String toPlaceToken(PlaceRequest placeRequest) throws TokenFormatException { return placeTokenToUnescapedString(placeRequest); }
@Override public PlaceRequest toPlaceRequest(String placeToken) throws TokenFormatException { return unescapedStringToPlaceRequest(urlUtils.decodeQueryString(placeToken)); }
/** * Converts a place token to an unescaped string. If the name token or the parameters contain any * of the separator symbols, they will be escaped with our custom escaping mechanism. * * @param placeRequest The place request to convert. * @return The unescaped string for the place token corresponding to that place request. * @throws TokenFormatException if there is an error converting. */ private String placeTokenToUnescapedString(PlaceRequest placeRequest) throws TokenFormatException { StringBuilder out = new StringBuilder(); out.append(customEscape(placeRequest.getNameToken())); Set<String> params = placeRequest.getParameterNames(); if (params != null) { for (String name : params) { out.append(paramSeparator).append(customEscape(name)).append(valueSeparator).append( customEscape(placeRequest.getParameter(name, null))); } } return out.toString(); }
} else if (split == -1) { return new PlaceRequest.Builder().nameToken(customUnescape(unescapedPlaceToken)).build(); } else if (split >= 0) { PlaceRequest.Builder reqBuilder = new PlaceRequest.Builder().nameToken(customUnescape(unescapedPlaceToken .substring(0, split))); String paramsChunk = unescapedPlaceToken.substring(split + 1); throw new TokenFormatException("Bad parameter: Need exactly one key and one value."); String key = customUnescape(param[0]); String value = param.length == 2 ? customUnescape(param[1]) : ""; reqBuilder = reqBuilder.with(key, value);
@Override public List<PlaceRequest> toPlaceRequestHierarchy(String historyToken) throws TokenFormatException { String unescapedHistoryToken = urlUtils.decodeQueryString(historyToken); int split = unescapedHistoryToken.indexOf(hierarchySeparator); List<PlaceRequest> result = new ArrayList<>(); if (split == -1) { // History token consists of a single place token. result.add(unescapedStringToPlaceRequest(unescapedHistoryToken)); } else { String[] unescapedPlaceTokens = unescapedHistoryToken.split(hierarchySeparator); if (unescapedPlaceTokens.length == 0) { throw new TokenFormatException("Bad parameter: nothing in the history token."); } for (String unescapedPlaceToken : unescapedPlaceTokens) { if (unescapedPlaceToken.isEmpty()) { throw new TokenFormatException("Bad parameter: Successive place tokens require a single '" + hierarchySeparator + "' between them."); } result.add(unescapedStringToPlaceRequest(unescapedPlaceToken)); } } return result; }
@Override public String toHistoryToken(List<PlaceRequest> placeRequestHierarchy) throws TokenFormatException { StringBuilder out = new StringBuilder(); for (int i = 0; i < placeRequestHierarchy.size(); ++i) { if (i != 0) { out.append(hierarchySeparator); } out.append(placeTokenToUnescapedString(placeRequestHierarchy.get(i))); } return out.toString(); }