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

pl.wrzasq.commons.aws.lambda.MultiHandler Maven / Gradle / Ivy

// Generated by delombok at Wed Mar 25 03:28:41 UTC 2020
/*
 * This file is part of the pl.wrzasq.commons.
 *
 * @license http://mit-license.org/ The MIT license
 * @copyright 2019 © by Rafał Wrzeszcz - Wrzasq.pl.
 */
package pl.wrzasq.commons.aws.lambda;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Lambda handler that chains multiple sub-handlers to allow different inputs.
 *
 * 

* Note: It's usually bad idea to handle different cases by single Lambda function. It's purpose * is to enable handling custom infrastructure-specific cases without involving real business logic (take pre-warm * as an example). *

*/ public class MultiHandler { /** * Single use-case handler. */ @FunctionalInterface public interface CallHandler { /** * Attempts to handle a payload. * * @param input JSON input tree. * @param output Output stream. * @return State of the action handling (true indicates the action was handled and propagation should stop). */ boolean handle(JsonNode input, OutputStream output); } /** * Logger. */ private Logger logger = LoggerFactory.getLogger(MultiHandler.class); /** * JSON handler. */ private ObjectMapper objectMapper; /** * Registered handlers. */ private List handlers = new ArrayList<>(); /** * Initializes Lambda handler. * * @param objectMapper JSON de-serialization handler. */ public MultiHandler(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } /** * Adds sub-handler to current context. * * @param handler Payload handler. */ public void registerHandler(MultiHandler.CallHandler handler) { this.handlers.add(handler); } /** * Handles invocation. * * @param inputStream Request input. * @param outputStream Output stream. * @throws IOException When JSON loading/dumping fails. */ public void handle(InputStream inputStream, OutputStream outputStream) throws IOException { try (outputStream) { var root = this.objectMapper.readTree(inputStream); // tries all handlers until any matches for (var handler : this.handlers) { this.logger.trace("Attempting {} to handle payload.", handlers.getClass().getName()); if (handler.handle(root, outputStream)) { this.logger.trace("Handled."); return; } else { this.logger.trace("Skipping."); } } this.logger.error("No handler was able to handle payload {}.", this.objectMapper.writeValueAsBytes(root)); } } /** * JSON handler. */ @SuppressWarnings("all") @lombok.Generated public ObjectMapper getObjectMapper() { return this.objectMapper; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy