Search in sources :

Example 1 with Path

use of com.palantir.util.syntacticpath.Path in project conjure-java by palantir.

the class Retrofit2ServiceGenerator method replaceEncodedPathArgs.

private HttpPath replaceEncodedPathArgs(HttpPath httpPath) {
    List<String> newSegments = new ArrayList<>();
    Pattern pattern = Pattern.compile("\\{([^:]+):(.*)}");
    Path path = Paths.get(httpPath.get());
    for (String segment : path.getSegments()) {
        Matcher matcher = pattern.matcher(segment);
        if (matcher.matches()) {
            newSegments.add("{" + matcher.group(1) + "}");
        } else {
            newSegments.add(segment);
        }
    }
    return HttpPath.of("/" + Joiner.on("/").join(newSegments));
}
Also used : HttpPath(com.palantir.conjure.spec.HttpPath) Path(com.palantir.util.syntacticpath.Path) Pattern(java.util.regex.Pattern) Matcher(java.util.regex.Matcher) ArrayList(java.util.ArrayList)

Example 2 with Path

use of com.palantir.util.syntacticpath.Path in project conjure by palantir.

the class HttpPathValidator method validate.

/**
 * validates if a new instance has the correct syntax.
 */
public static void validate(HttpPath httpPath) {
    Path path = Paths.get(httpPath.get());
    Preconditions.checkArgument(path.isAbsolute(), "Conjure paths must be absolute, i.e., start with '/': %s", path);
    Preconditions.checkArgument(path.getSegments().isEmpty() || !path.isFolder(), "Conjure paths must not end with a '/': %s", path);
    for (String segment : path.getSegments()) {
        Preconditions.checkArgument(SEGMENT_PATTERN.matcher(segment).matches() || PARAM_SEGMENT_PATTERN.matcher(segment).matches() || PARAM_REGEX_SEGMENT_PATTERN.matcher(segment).matches(), "Segment %s of path %s did not match required segment patterns %s or parameter name " + "patterns %s or %s", segment, path, SEGMENT_PATTERN, PARAM_SEGMENT_PATTERN, PARAM_REGEX_SEGMENT_PATTERN);
    }
    // verify that path template variables are unique
    Set<String> templateVars = new HashSet<>();
    new UriTemplate(path.toString()).getTemplateVariables().forEach(var -> {
        Preconditions.checkState(!templateVars.contains(var), "Path parameter %s appears more than once in path %s", var, path);
        templateVars.add(var);
    });
    UriTemplateParser uriTemplateParser = new UriTemplateParser(path.toString());
    Map<String, Pattern> nameToPattern = uriTemplateParser.getNameToPattern();
    List<String> segments = Splitter.on('/').splitToList(uriTemplateParser.getNormalizedTemplate());
    for (int i = 0; i < segments.size(); i++) {
        String segment = segments.get(i);
        if (!(segment.startsWith("{") && segment.endsWith("}"))) {
            // path literal
            continue;
        }
        // variable
        Pattern varPattern = nameToPattern.get(segment.substring(1, segment.length() - 1));
        if (varPattern.equals(UriTemplateParser.TEMPLATE_VALUE_PATTERN)) {
            // no regular expression specified -- OK
            continue;
        }
        // if regular expression was specified, it must be ".+" or ".*" based on invariant previously enforced
        Preconditions.checkState(i == segments.size() - 1 || !varPattern.pattern().equals(".*"), "Path parameter %s in path %s specifies regular expression %s, but this regular " + "expression is only permitted if the path parameter is the last segment", segment, path, varPattern);
    }
}
Also used : HttpPath(com.palantir.conjure.spec.HttpPath) Path(com.palantir.util.syntacticpath.Path) Pattern(java.util.regex.Pattern) UriTemplate(org.glassfish.jersey.uri.UriTemplate) UriTemplateParser(org.glassfish.jersey.uri.internal.UriTemplateParser) HashSet(java.util.HashSet)

Aggregations

HttpPath (com.palantir.conjure.spec.HttpPath)2 Path (com.palantir.util.syntacticpath.Path)2 Pattern (java.util.regex.Pattern)2 ArrayList (java.util.ArrayList)1 HashSet (java.util.HashSet)1 Matcher (java.util.regex.Matcher)1 UriTemplate (org.glassfish.jersey.uri.UriTemplate)1 UriTemplateParser (org.glassfish.jersey.uri.internal.UriTemplateParser)1