package io.vertx.ext.web.api.contract.impl;

import io.vertx.codegen.annotations.Fluent;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.RoutingContext;
import io.vertx.ext.web.api.contract.RouterFactory;
import io.vertx.ext.web.api.contract.RouterFactoryException;
import io.vertx.ext.web.api.contract.RouterFactoryOptions;
import io.vertx.ext.web.api.validation.ValidationException;
import io.vertx.ext.web.handler.BodyHandler;

import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

Author:Francesco Guardiani @slinkydeveloper
/** * @author Francesco Guardiani @slinkydeveloper */
abstract public class BaseRouterFactory<Specification> implements RouterFactory<Specification> {
Default validation failure handler. When ValidationException occurs, It sends a response with status code 400, status message "Bad Request" and error message as body
/** * Default validation failure handler. When ValidationException occurs, It sends a response * with status code 400, status message "Bad Request" and error message as body */
public final static Handler<RoutingContext> DEFAULT_VALIDATION_FAILURE_HANDLER = (routingContext -> { if (routingContext.failure() instanceof ValidationException) { routingContext .response() .setStatusCode(400) .setStatusMessage("Bad Request") .end(routingContext.failure().getMessage()); } else routingContext.next(); });
Default not implemented handler. It sends a response with status code 501, status message "Not Implemented" and empty body
/** * Default not implemented handler. It sends a response with status code 501, * status message "Not Implemented" and empty body */
public final static Handler<RoutingContext> DEFAULT_NOT_IMPLEMENTED_HANDLER = (routingContext) -> routingContext.response().setStatusCode(501).setStatusMessage("Not Implemented").end();
Default extra payload mapper for OperationRequest. By default, no mapper is specified
/** Default extra payload mapper for {@link io.vertx.ext.web.api.OperationRequest}. By default, no mapper is specified * */
public final static Function<RoutingContext, JsonObject> DEFAULT_EXTRA_OPERATION_CONTEXT_PAYLOAD_MAPPER = null; protected Vertx vertx; protected Specification spec; protected RouterFactoryOptions options; private Handler<RoutingContext> validationFailureHandler; private Handler<RoutingContext> notImplementedFailureHandler; private BodyHandler bodyHandler; private List<Handler<RoutingContext>> globalHandlers; private Function<RoutingContext, JsonObject> extraOperationContextPayloadMapper; public BaseRouterFactory(Vertx vertx, Specification spec, RouterFactoryOptions options) { this.vertx = vertx; this.spec = spec; this.options = options; this.validationFailureHandler = DEFAULT_VALIDATION_FAILURE_HANDLER; this.notImplementedFailureHandler = DEFAULT_NOT_IMPLEMENTED_HANDLER; this.bodyHandler = BodyHandler.create(); this.globalHandlers = new ArrayList<>(); this.extraOperationContextPayloadMapper = DEFAULT_EXTRA_OPERATION_CONTEXT_PAYLOAD_MAPPER; } public BaseRouterFactory(Vertx vertx, Specification spec) { this(vertx, spec, new RouterFactoryOptions()); } @Override public RouterFactory setOptions(RouterFactoryOptions options) { this.options = options; return this; } @Override public RouterFactoryOptions getOptions() { return options; } @Override public Handler<RoutingContext> getValidationFailureHandler() { return validationFailureHandler; } @Override @Fluent public RouterFactory setValidationFailureHandler(Handler<RoutingContext> validationFailureHandler) { this.validationFailureHandler = validationFailureHandler; return this; } protected Handler<RoutingContext> getNotImplementedFailureHandler() { return notImplementedFailureHandler; } @Override @Fluent public RouterFactory setNotImplementedFailureHandler(Handler<RoutingContext> notImplementedFailureHandler) { this.notImplementedFailureHandler = notImplementedFailureHandler; return this; } protected BodyHandler getBodyHandler() { return bodyHandler; } @Override @Fluent public RouterFactory setBodyHandler(BodyHandler bodyHandler) { this.bodyHandler = bodyHandler; return this; } protected List<Handler<RoutingContext>> getGlobalHandlers() { return globalHandlers; } @Override @Fluent public RouterFactory addGlobalHandler(Handler<RoutingContext> globalHandler) { this.globalHandlers.add(globalHandler); return this; } protected Function<RoutingContext, JsonObject> getExtraOperationContextPayloadMapper() { return extraOperationContextPayloadMapper; } @Override @Fluent public RouterFactory setExtraOperationContextPayloadMapper(Function<RoutingContext, JsonObject> extraOperationContextPayloadMapper) { this.extraOperationContextPayloadMapper = extraOperationContextPayloadMapper; return this; } }