All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.progressoft.brix.domino.api.server.endpoint.AbstractEndpoint Maven / Gradle / Ivy

The newest version!
package com.progressoft.brix.domino.api.server.endpoint;

import com.progressoft.brix.domino.api.server.ServerApp;
import com.progressoft.brix.domino.api.server.context.DefaultExecutionContext;
import com.progressoft.brix.domino.api.server.context.ExecutionContext;
import com.progressoft.brix.domino.api.server.entrypoint.VertxEntryPointContext;
import com.progressoft.brix.domino.api.server.request.DefaultMultiMap;
import com.progressoft.brix.domino.api.server.request.DefaultRequestContext;
import com.progressoft.brix.domino.api.server.request.MultiMap;
import com.progressoft.brix.domino.api.server.request.RequestContext;
import com.progressoft.brix.domino.api.server.response.ResponseContext;
import com.progressoft.brix.domino.api.server.response.VertxResponseContext;
import com.progressoft.brix.domino.api.shared.request.RequestBean;
import com.progressoft.brix.domino.api.shared.request.ResponseBean;
import io.vertx.core.Handler;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.json.Json;
import io.vertx.ext.web.RoutingContext;

import static java.util.Objects.isNull;

public abstract class AbstractEndpoint implements Handler {
    @Override
    public void handle(RoutingContext routingContext) {
        try {
            R requestBody = fetchBody(routingContext, routingContext.request().method());
            RequestContext requestContext = DefaultRequestContext.forRequest(requestBody)
                    .requestPath(routingContext.request().path())
                    .headers(getHeaders(routingContext))
                    .parameters(getParameters(routingContext)).build();
            ResponseContext responseContext = new VertxResponseContext<>(routingContext);
            executeRequest(routingContext, ServerApp.make(), new DefaultExecutionContext<>(requestContext, responseContext));
        } catch (Exception e) {
            routingContext.fail(e);
        }
    }

    private MultiMap getParameters(RoutingContext routingContext) {
        return asMultiValuesMap(routingContext.request().params());
    }

    private MultiMap getHeaders(RoutingContext routingContext) {
        return asMultiValuesMap(routingContext.request().headers());
    }

    private MultiMap asMultiValuesMap(io.vertx.core.MultiMap multiMap) {
        MultiMap multiValuesMap = new DefaultMultiMap<>();
        multiMap.entries().forEach(entry -> multiValuesMap.add(entry.getKey(), entry.getValue()));
        return multiValuesMap;
    }

    private R fetchBody(RoutingContext routingContext, HttpMethod method) {
        R requestBody;
        if (HttpMethod.POST.equals(method) || HttpMethod.PUT.equals(method) || HttpMethod.PATCH.equals(method)) {
            requestBody = getRequestBody(routingContext);
        } else {
            requestBody = makeNewRequest();
        }
        return requestBody;
    }

    private R getRequestBody(RoutingContext routingContext) {
        String bodyAsString = routingContext.getBodyAsString();
        if (isNull(bodyAsString) || bodyAsString.trim().isEmpty())
            return makeNewRequest();
        return Json.decodeValue(bodyAsString, getRequestClass());
    }

    private void executeRequest(RoutingContext routingContext, ServerApp serverApp, ExecutionContext requestContext) {
        serverApp.executeRequest(requestContext, new VertxEntryPointContext(routingContext, serverApp.serverContext().config(), routingContext.vertx()));
    }

    protected abstract R makeNewRequest();

    protected abstract Class getRequestClass();
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy