use of io.vertx.ext.web.impl.RouteImpl in project vertx-web by vert-x3.
the class OpenAPI3RouterFactoryImpl method getRouter.
@Override
public Router getRouter() {
Router router = Router.router(vertx);
Route globalRoute = router.route();
globalRoute.handler(this.getBodyHandler());
List<Handler<RoutingContext>> globalHandlers = this.getGlobalHandlers();
for (Handler<RoutingContext> globalHandler : globalHandlers) {
globalRoute.handler(globalHandler);
}
List<Handler<RoutingContext>> globalSecurityHandlers = securityHandlers.solveSecurityHandlers(spec.getSecurity(), this.getOptions().isRequireSecurityHandlers());
for (OperationValue operation : operations.values()) {
// If user don't want 501 handlers and the operation is not configured, skip it
if (!options.isMountNotImplementedHandler() && !operation.isConfigured())
continue;
List<Handler> handlersToLoad = new ArrayList<>();
List<Handler> failureHandlersToLoad = new ArrayList<>();
// Operation specific security requirement overrides global security requirement, even if local security requirement is an empty array
if (operation.getOperationModel().getSecurity() != null) {
handlersToLoad.addAll(securityHandlers.solveSecurityHandlers(operation.getOperationModel().getSecurity(), this.getOptions().isRequireSecurityHandlers()));
} else {
handlersToLoad.addAll(globalSecurityHandlers);
}
// Generate ValidationHandler
OpenAPI3RequestValidationHandlerImpl validationHandler = new OpenAPI3RequestValidationHandlerImpl(operation.getOperationModel(), operation.getParameters(), this.spec, refsCache);
handlersToLoad.add(validationHandler);
// Check if path is set by user
if (operation.isConfigured()) {
handlersToLoad.addAll(operation.getUserHandlers());
failureHandlersToLoad.addAll(operation.getUserFailureHandlers());
if (operation.mustMountRouteToService()) {
handlersToLoad.add((operation.getEbServiceDeliveryOptions() != null) ? RouteToEBServiceHandler.build(vertx.eventBus(), operation.getEbServiceAddress(), operation.getEbServiceMethodName(), operation.getEbServiceDeliveryOptions(), this.getExtraOperationContextPayloadMapper()) : RouteToEBServiceHandler.build(vertx.eventBus(), operation.getEbServiceAddress(), operation.getEbServiceMethodName(), this.getExtraOperationContextPayloadMapper()));
}
} else {
// Check if not implemented or method not allowed
List<HttpMethod> configuredMethodsForThisPath = operations.values().stream().filter(ov -> operation.path.equals(ov.path)).filter(OperationValue::isConfigured).map(OperationValue::getMethod).collect(Collectors.toList());
if (!configuredMethodsForThisPath.isEmpty())
handlersToLoad.add(generateNotAllowedHandler(configuredMethodsForThisPath));
else
handlersToLoad.add(NOT_IMPLEMENTED_HANDLER);
}
// Now add all handlers to route
OpenAPI3PathResolver pathResolver = new OpenAPI3PathResolver(operation.getPath(), operation.getParameters());
Route route = pathResolver.solve().map(solvedRegex -> router.routeWithRegex(operation.getMethod(), solvedRegex.toString())).orElseGet(() -> router.route(operation.getMethod(), operation.getPath()));
String exposeConfigurationKey = this.getOptions().getOperationModelKey();
if (exposeConfigurationKey != null)
route.handler(context -> context.put(exposeConfigurationKey, operation.getOperationModel()).next());
// Set produces/consumes
Set<String> consumes = new HashSet<>();
Set<String> produces = new HashSet<>();
if (operation.getOperationModel().getRequestBody() != null && operation.getOperationModel().getRequestBody().getContent() != null)
consumes.addAll(operation.getOperationModel().getRequestBody().getContent().keySet());
if (operation.getOperationModel().getResponses() != null)
for (ApiResponse response : operation.getOperationModel().getResponses().values()) if (response.getContent() != null)
produces.addAll(response.getContent().keySet());
for (String ct : consumes) route.consumes(ct);
for (String ct : produces) route.produces(ct);
if (!consumes.isEmpty())
((RouteImpl) route).setEmptyBodyPermittedWithConsumes(!validationHandler.isBodyRequired());
if (options.isMountResponseContentTypeHandler() && produces.size() != 0)
route.handler(ResponseContentTypeHandler.create());
route.setRegexGroupsNames(new ArrayList<>(pathResolver.getMappedGroups().values()));
for (Handler handler : handlersToLoad) route.handler(handler);
for (Handler failureHandler : failureHandlersToLoad) route.failureHandler(failureHandler);
}
// Check validation failure handler
if (this.options.isMountValidationFailureHandler())
router.errorHandler(400, this.getValidationFailureHandler());
if (this.options.isMountNotImplementedHandler())
router.errorHandler(501, this.getNotImplementedFailureHandler());
return router;
}
use of io.vertx.ext.web.impl.RouteImpl in project vertx-web by vert-x3.
the class OpenAPI3RouterBuilderImpl method createRouter.
@Override
public Router createRouter() {
Router router = Router.router(vertx);
Route globalRoute = router.route();
if (bodyHandler != null) {
globalRoute.handler(bodyHandler);
}
globalHandlers.forEach(globalRoute::handler);
// sort paths by number of patterned fields so /pets/mine is matched first
// when there is a choice between /pets/{petId} and /pets/mine
List<ResolvedOpenAPI3Path> resolvedPaths = operations.values().stream().map(it -> new ResolvedOpenAPI3Path(it, openapi)).sorted().collect(Collectors.toList());
for (ResolvedOpenAPI3Path resolvedPath : resolvedPaths) {
OperationImpl operation = resolvedPath.operation;
// If user don't want 501 handlers and the operation is not configured, skip it
if (!options.isMountNotImplementedHandler() && !operation.isConfigured())
continue;
List<Handler<RoutingContext>> handlersToLoad = new ArrayList<>();
List<Handler<RoutingContext>> failureHandlersToLoad = new ArrayList<>();
// Authentication Handler
AuthenticationHandler authnHandler = this.securityHandlers.solveAuthenticationHandler(OpenAPI3Utils.mergeSecurityRequirements(this.openapi.getOpenAPI().getJsonArray("security"), operation.getOperationModel().getJsonArray("security")), this.options.isRequireSecurityHandlers());
if (authnHandler != null) {
handlersToLoad.add(authnHandler);
}
// Generate ValidationHandler
ValidationHandlerImpl validationHandler = validationHandlerGenerator.create(operation);
handlersToLoad.add(validationHandler);
// Check if path is set by user
if (operation.isConfigured()) {
handlersToLoad.addAll(operation.getUserHandlers());
failureHandlersToLoad.addAll(operation.getUserFailureHandlers());
if (operation.mustMountRouteToService()) {
try {
io.vertx.ext.web.api.service.RouteToEBServiceHandler routeToEBServiceHandler = (operation.getEbServiceDeliveryOptions() != null) ? io.vertx.ext.web.api.service.RouteToEBServiceHandler.build(vertx.eventBus(), operation.getEbServiceAddress(), operation.getEbServiceMethodName(), operation.getEbServiceDeliveryOptions()) : io.vertx.ext.web.api.service.RouteToEBServiceHandler.build(vertx.eventBus(), operation.getEbServiceAddress(), operation.getEbServiceMethodName());
routeToEBServiceHandler.extraPayloadMapper(serviceExtraPayloadMapper);
handlersToLoad.add(routeToEBServiceHandler);
} catch (NoClassDefFoundError exception) {
throw new IllegalStateException("You're trying to use api service without adding it to your classpath. " + "Check you have included vertx-web-api-service in your dependencies", exception);
}
}
} else {
// Check if not implemented or method not allowed
List<HttpMethod> configuredMethodsForThisPath = operations.values().stream().filter(ov -> operation.getOpenAPIPath().equals(ov.getOpenAPIPath())).filter(OperationImpl::isConfigured).map(OperationImpl::getHttpMethod).collect(Collectors.toList());
if (!configuredMethodsForThisPath.isEmpty())
handlersToLoad.add(generateNotAllowedHandler(configuredMethodsForThisPath));
else
handlersToLoad.add(NOT_IMPLEMENTED_HANDLER);
}
// Now add all handlers to route
Route route = resolvedPath.optionalPattern.map(solvedRegex -> router.routeWithRegex(operation.getHttpMethod(), solvedRegex.toString())).orElseGet(() -> router.route(operation.getHttpMethod(), operation.getOpenAPIPath())).setName(options.getRouteNamingStrategy().apply(operation));
String exposeConfigurationKey = this.getOptions().getOperationModelKey();
if (exposeConfigurationKey != null)
route.handler(context -> context.put(exposeConfigurationKey, operation.getOperationModel()).next());
// Set produces/consumes
Set<String> consumes = ((JsonObject) JsonPointer.from("/requestBody/content").queryJsonOrDefault(operation.getOperationModel(), new JsonObject())).fieldNames();
Set<String> produces = operation.getOperationModel().getJsonObject("responses", new JsonObject()).stream().map(Map.Entry::getValue).map(j -> (JsonObject) j).flatMap(j -> j.getJsonObject("content", new JsonObject()).fieldNames().stream()).collect(Collectors.toSet());
for (String ct : produces) route.produces(ct);
if (!consumes.isEmpty())
((RouteImpl) route).setEmptyBodyPermittedWithConsumes(!validationHandler.isBodyRequired());
if (options.isMountResponseContentTypeHandler() && produces.size() != 0)
route.handler(ResponseContentTypeHandler.create());
route.setRegexGroupsNames(new ArrayList<>(resolvedPath.resolver.getMappedGroups().values()));
for (Handler<RoutingContext> handler : handlersToLoad) route.handler(handler);
for (Handler<RoutingContext> failureHandler : failureHandlersToLoad) route.failureHandler(failureHandler);
}
if (this.options.getContractEndpoint() != null) {
router.get(this.options.getContractEndpoint()).handler(ContractEndpointHandler.create(this.openapi));
}
return router;
}
Aggregations