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

org.swisspush.gateleen.user.RoleProfileHandler Maven / Gradle / Ivy

Go to download

Middleware library based on Vert.x to build advanced JSON/REST communication servers

The newest version!
package org.swisspush.gateleen.user;

import org.swisspush.gateleen.core.json.JsonUtil;
import org.swisspush.gateleen.core.storage.ResourceStorage;
import org.swisspush.gateleen.core.util.StatusCode;
import io.vertx.core.Vertx;
import io.vertx.core.eventbus.EventBus;
import io.vertx.core.http.HttpServerRequest;
import io.vertx.core.json.JsonObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.regex.Pattern;

/**
 * @author https://github.com/lbovet [Laurent Bovet]
 */
public class RoleProfileHandler {

    public static final String UPDATE_ADDRESS = "gateleen.roleprofiles-updated";

    private ResourceStorage storage;

    private Logger log = LoggerFactory.getLogger(RoleProfileHandler.class);

    private Pattern uriPattern;

    private Vertx vertx;
    private EventBus eb;

    public RoleProfileHandler(Vertx vertx, ResourceStorage storage, String roleProfileUriPattern) {
        this.storage = storage;
        this.vertx = vertx;
        uriPattern = Pattern.compile(roleProfileUriPattern);
        eb = vertx.eventBus();
    }

    public boolean isRoleProfileRequest(HttpServerRequest request) {
        return uriPattern.matcher(request.path()).matches();
    }

    public void handle(final HttpServerRequest request) {

        switch (request.method()) {
        case GET:
            storage.get(request.path(), buffer -> {
                request.response().headers().set("Content-Type", "application/json");
                if (buffer != null) {
                    request.response().setStatusCode(StatusCode.OK.getStatusCode());
                    request.response().end(buffer);
                } else {
                    request.response().setStatusCode(StatusCode.NOT_FOUND.getStatusCode());
                    request.response().end();
                }
            });
            break;
        case PUT:
            request.bodyHandler(newBuffer -> {
                JsonObject roleProfileProperties = new JsonObject(newBuffer.toString("UTF-8"));
                if (JsonUtil.containsNoNestedProperties(roleProfileProperties)) {
                    storage.put(request.uri() + "?merge=true", newBuffer, status -> {
                        if (status == StatusCode.OK.getStatusCode()) {
                            scheduleUpdate();
                        } else {
                            request.response().setStatusCode(status);
                        }
                        request.response().end();
                    });
                } else {
                    request.response().setStatusCode(StatusCode.BAD_REQUEST.getStatusCode());
                    request.response().setStatusMessage(StatusCode.BAD_REQUEST.getStatusMessage());
                    request.response().end("role profiles can't take nested property values");
                }
            });
            break;
        case DELETE:
            storage.delete(request.path(), status -> {
                if (status == StatusCode.OK.getStatusCode()) {
                    eb.publish(UPDATE_ADDRESS, "*");
                } else {
                    log.warn("Could not delete '" + (request.uri() == null ? "" : request.uri()) + "'. Error code is '" + (status == null ? "" : status) + "'.");
                    request.response().setStatusCode(status);
                }
                request.response().end();
            });
            break;
        default:
            request.response().setStatusCode(StatusCode.METHOD_NOT_ALLOWED.getStatusCode());
            request.response().end(StatusCode.METHOD_NOT_ALLOWED.getStatusMessage());
        }
    }

    private long updateTimerId = -1;

    private void scheduleUpdate() {
        vertx.cancelTimer(updateTimerId);
        updateTimerId = vertx.setTimer(3000, id -> eb.publish(UPDATE_ADDRESS, "*"));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy