use of io.cdap.cdap.api.service.http.ServiceHttpEndpoint in project cdap by caskdata.
the class ServiceEndpointExtractor method visit.
@Override
public void visit(Object instance, Type inspectType, Type declareType, Method method) throws Exception {
if (!Modifier.isPublic(method.getModifiers())) {
return;
}
Path classPathAnnotation = TypeToken.of(inspectType).getRawType().getAnnotation(Path.class);
Path methodPathAnnotation = method.getAnnotation(Path.class);
if (methodPathAnnotation == null && classPathAnnotation == null) {
return;
}
// Find one or more request type annotations present on the method.
Set<Class<? extends Annotation>> acceptedMethodTypes = ImmutableSet.of(GET.class, POST.class, DELETE.class, PUT.class, OPTIONS.class, HEAD.class);
Set<Class<? extends Annotation>> methodAnnotations = Sets.newHashSet();
for (Annotation annotation : method.getAnnotations()) {
Class<? extends Annotation> annotationClz = annotation.annotationType();
if (acceptedMethodTypes.contains(annotationClz)) {
methodAnnotations.add(annotationClz);
}
}
for (Class<? extends Annotation> methodTypeClz : methodAnnotations) {
String methodType = methodTypeClz.getAnnotation(HttpMethod.class).value();
String endpoint = "/";
endpoint = classPathAnnotation == null ? endpoint : endpoint + classPathAnnotation.value();
endpoint = methodPathAnnotation == null ? endpoint : endpoint + "/" + methodPathAnnotation.value();
// Replace consecutive instances of / with a single instance.
endpoint = endpoint.replaceAll("/+", "/");
endpoints.add(new ServiceHttpEndpoint(methodType, endpoint));
}
}
use of io.cdap.cdap.api.service.http.ServiceHttpEndpoint in project cdap by caskdata.
the class ProgramLifecycleHttpHandlerTest method testServiceSpecification.
@Test
public void testServiceSpecification() throws Exception {
deploy(AppWithServices.class, 200);
HttpResponse response = doGet("/v3/namespaces/default/apps/AppWithServices/services/NoOpService");
Assert.assertEquals(200, response.getResponseCode());
Set<ServiceHttpEndpoint> expectedEndpoints = ImmutableSet.of(new ServiceHttpEndpoint("GET", "/ping"), new ServiceHttpEndpoint("POST", "/multi"), new ServiceHttpEndpoint("GET", "/multi"), new ServiceHttpEndpoint("GET", "/multi/ping"));
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(ServiceSpecification.class, new ServiceSpecificationCodec());
Gson gson = gsonBuilder.create();
ServiceSpecification specification = readResponse(response, ServiceSpecification.class, gson);
Set<ServiceHttpEndpoint> returnedEndpoints = new HashSet<>();
for (HttpServiceHandlerSpecification httpServiceHandlerSpecification : specification.getHandlers().values()) {
returnedEndpoints.addAll(httpServiceHandlerSpecification.getEndpoints());
}
Assert.assertEquals("NoOpService", specification.getName());
Assert.assertEquals(returnedEndpoints, expectedEndpoints);
}
use of io.cdap.cdap.api.service.http.ServiceHttpEndpoint in project cdap by caskdata.
the class ServiceClient method getEndpoints.
/**
* Gets a list of {@link ServiceHttpEndpoint} that a {@link Service} exposes.
*
* @param service ID of the service
* @return A list of {@link ServiceHttpEndpoint}
* @throws IOException if a network error occurred
* @throws UnauthenticatedException if the request is not authorized successfully in the gateway server
* @throws NotFoundException if the app or service could not be found
*/
public List<ServiceHttpEndpoint> getEndpoints(ServiceId service) throws IOException, UnauthenticatedException, NotFoundException, UnauthorizedException {
ServiceSpecification specification = get(service);
ImmutableList.Builder<ServiceHttpEndpoint> builder = new ImmutableList.Builder<>();
for (HttpServiceHandlerSpecification handlerSpecification : specification.getHandlers().values()) {
builder.addAll(handlerSpecification.getEndpoints());
}
return builder.build();
}
use of io.cdap.cdap.api.service.http.ServiceHttpEndpoint in project cdap by cdapio.
the class GetServiceEndpointsCommand method perform.
@Override
public void perform(Arguments arguments, PrintStream output) throws Exception {
ServiceId serviceId = new ServiceId(parseProgramId(arguments, ElementType.SERVICE));
List<ServiceHttpEndpoint> endpoints = serviceClient.getEndpoints(serviceId);
Table table = Table.builder().setHeader("method", "path").setRows(endpoints, new RowMaker<ServiceHttpEndpoint>() {
@Override
public List<?> makeRow(ServiceHttpEndpoint endpoint) {
return Lists.newArrayList(endpoint.getMethod(), endpoint.getPath());
}
}).build();
cliConfig.getTableRenderer().render(cliConfig, output, table);
}
use of io.cdap.cdap.api.service.http.ServiceHttpEndpoint in project cdap by cdapio.
the class DefaultHttpServiceHandlerConfigurer method createSpecification.
/**
* Creates a {@link HttpServiceHandlerSpecification} from the parameters stored in this class.
*
* @return a new specification from the parameters stored in this instance
*/
public HttpServiceHandlerSpecification createSpecification() {
List<ServiceHttpEndpoint> endpoints = new ArrayList<>();
// Inspect the handler to grab all @UseDataset, @Property and endpoints.
Reflections.visit(handler, handler.getClass(), new DataSetFieldExtractor(datasets), new PropertyFieldExtractor(properties), new ServiceEndpointExtractor(endpoints));
return new HttpServiceHandlerSpecification(handler.getClass().getName(), name, "", properties, datasets, endpoints);
}
Aggregations