use of com.palantir.conjure.spec.HttpPath in project conjure-java by palantir.
the class Retrofit2ServiceGenerator method generateServiceMethod.
private MethodSpec generateServiceMethod(EndpointDefinition endpointDef, TypeMapper returnTypeMapper, TypeMapper argumentTypeMapper) {
TypeName returnType = endpointDef.getReturns().map(returnTypeMapper::getClassName).orElse(ClassName.VOID);
Set<ArgumentName> encodedPathArgs = extractEncodedPathArgs(endpointDef.getHttpPath());
HttpPath endpointPathWithoutRegex = replaceEncodedPathArgs(endpointDef.getHttpPath());
MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder(endpointDef.getEndpointName().get()).addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT).addAnnotation(AnnotationSpec.builder(httpMethodToClassName(endpointDef.getHttpMethod().get().name())).addMember("value", "$S", "." + endpointPathWithoutRegex).build()).addAnnotation(AnnotationSpec.builder(ClassName.get("retrofit2.http", "Headers")).addMember("value", "$S", "hr-path-template: " + endpointPathWithoutRegex).addMember("value", "$S", "Accept: " + getReturnMediaType(returnType)).build());
if (returnType.equals(BINARY_RETURN_TYPE) || returnType.equals(OPTIONAL_BINARY_RETURN_TYPE)) {
methodBuilder.addAnnotation(AnnotationSpec.builder(ClassName.get("retrofit2.http", "Streaming")).build());
}
endpointDef.getDeprecated().ifPresent(deprecatedDocsValue -> methodBuilder.addAnnotation(ClassName.get("java.lang", "Deprecated")));
methodBuilder.addAnnotations(ConjureAnnotations.getClientEndpointAnnotations(endpointDef));
ServiceGenerators.getJavaDoc(endpointDef).ifPresent(content -> methodBuilder.addJavadoc("$L", content));
methodBuilder.returns(ParameterizedTypeName.get(LISTENABLE_FUTURE_TYPE, returnType.box()));
methodBuilder.addParameters(createServiceMethodParameters(endpointDef, argumentTypeMapper, encodedPathArgs));
return methodBuilder.build();
}
use of com.palantir.conjure.spec.HttpPath 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));
}
use of com.palantir.conjure.spec.HttpPath in project conjure by palantir.
the class ConjureParserUtils method parseHttpPath.
private static HttpPath parseHttpPath(com.palantir.conjure.parser.services.EndpointDefinition def, PathString basePath) {
HttpPath httpPath = HttpPath.of(basePath.resolve(def.http().path()).toString());
HttpPathValidator.validate(httpPath);
return httpPath;
}
use of com.palantir.conjure.spec.HttpPath in project conjure by palantir.
the class ConjureParserUtils method parseEndpoint.
private static EndpointDefinition parseEndpoint(String name, com.palantir.conjure.parser.services.EndpointDefinition def, PathString basePath, Optional<AuthType> defaultAuth, ReferenceTypeResolver typeResolver, DealiasingTypeVisitor dealiasingVisitor) {
HttpPath httpPath = parseHttpPath(def, basePath);
EndpointDefinition endpoint = EndpointDefinition.builder().endpointName(EndpointName.of(name)).httpMethod(HttpMethod.valueOf(def.http().method())).httpPath(httpPath).auth(def.auth().map(ConjureParserUtils::parseAuthType).orElse(defaultAuth)).args(parseArgs(def.args(), httpPath, typeResolver)).tags(def.tags().stream().peek(tag -> Preconditions.checkArgument(!tag.isEmpty(), "tag must not be empty")).collect(Collectors.toSet())).markers(parseMarkers(def.markers(), typeResolver)).returns(def.returns().map(t -> t.visit(new ConjureTypeParserVisitor(typeResolver)))).docs(def.docs().map(Documentation::of)).deprecated(def.deprecated().map(Documentation::of)).build();
EndpointDefinitionValidator.validateAll(endpoint, dealiasingVisitor);
return endpoint;
}
use of com.palantir.conjure.spec.HttpPath 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);
}
}
Aggregations