Exemplo n.º 1
0
  private Map<String, String> getParameters(PatternBinding binding, String requestUri) {
    if (binding.getParameterNames().isEmpty()) {
      return Collections.EMPTY_MAP;
    }

    Map<String, String> parameters = new HashMap<>();
    List<String> parameterNames = binding.getParameterNames();
    Matcher matcher = binding.getPattern().matcher(requestUri);
    matcher.matches();
    int groupCount = matcher.groupCount();
    if (groupCount > 0) {
      for (int i = 0; i < parameterNames.size(); i++) {
        parameters.put(parameterNames.get(i), matcher.group(i + 1));
      }
    }

    return parameters;
  }
Exemplo n.º 2
0
  private String uriFor(PatternBinding binding, Map<String, Object> parameters) {
    String uri = binding.getRoute().getUriPattern();

    List<String> parameterNames = binding.getParameterNames();
    if (!parameters.keySet().containsAll(parameterNames)) {
      log.error(
          "You must provide values for all path parameters. {} vs {}",
          parameterNames,
          parameters.keySet());
    }

    Map<String, Object> queryParameters = new HashMap<>(parameters.size());

    for (Entry<String, Object> parameterPair : parameters.entrySet()) {
      boolean foundAsPathParameter = false;

      StringBuffer sb = new StringBuffer();
      String buffer = String.format(VARIABLE_PART_PATTERN_WITH_PLACEHOLDER, parameterPair.getKey());

      Pattern pattern = Pattern.compile(buffer);
      Matcher matcher = pattern.matcher(uri);
      while (matcher.find()) {
        String pathValue = parameterPair.getValue().toString();
        matcher.appendReplacement(sb, pathValue);
        foundAsPathParameter = true;
      }

      matcher.appendTail(sb);
      uri = sb.toString();

      if (!foundAsPathParameter) {
        queryParameters.put(parameterPair.getKey(), parameterPair.getValue());
      }
    }

    // now prepare the query string for this url if we got some query params
    if (!queryParameters.isEmpty()) {
      // add remaining parameters as query parameters
      StringBuilder query = new StringBuilder();
      Iterator<Entry<String, Object>> iterator = queryParameters.entrySet().iterator();
      while (iterator.hasNext()) {
        Entry<String, Object> parameterEntry = iterator.next();
        String parameterName = parameterEntry.getKey();
        Object parameterValue = parameterEntry.getValue();
        String encodedParameterValue = null;
        try {
          encodedParameterValue = URLEncoder.encode(parameterValue.toString(), PippoConstants.UTF8);
        } catch (UnsupportedEncodingException e) {
          throw new PippoRuntimeException(
              "Cannot encode the parameter value '" + parameterValue.toString() + "'", e);
        }
        query.append(parameterName).append("=").append(encodedParameterValue);

        if (iterator.hasNext()) {
          query.append("&");
        }
      }

      uri += "?" + query;
    }

    return uri;
  }