package com.github.aesteve.vertx.nubes.handlers.impl; import com.github.aesteve.vertx.nubes.handlers.Processor; import com.github.aesteve.vertx.nubes.marshallers.Payload; import com.github.aesteve.vertx.nubes.marshallers.PayloadMarshaller; import io.vertx.core.http.HttpServerResponse; import io.vertx.ext.web.RoutingContext; import java.util.Map; public class PayloadTypeProcessor implements Processor { private final Map<String, PayloadMarshaller> marshallers; public PayloadTypeProcessor(Map<String, PayloadMarshaller> marshallers) { this.marshallers = marshallers; } @Override public void preHandle(RoutingContext context) { Payload<?> payload = new Payload<>(); context.put(Payload.DATA_ATTR, payload); context.next(); } @Override public void afterAll(RoutingContext context) { Payload<?> payload = context.get(Payload.DATA_ATTR); HttpServerResponse response = context.response(); if (response.ended()) { return; } Object userPayload = payload.get(); if (userPayload == null) { response.setStatusCode(204); response.end(); } else { String contentType = ContentTypeProcessor.getContentType(context); if (contentType == null) { context.fail(new IllegalArgumentException("No content-type defined, cannot marshall payload")); return; } PayloadMarshaller marshaller = marshallers.get(contentType); if (marshaller == null) { context.fail(new IllegalArgumentException("No marshaller found for content-type : " + contentType)); return; } String marshalled = marshaller.marshallPayload(userPayload); response.setStatusCode(200); response.end(marshalled); } } @Override public void postHandle(RoutingContext context) { context.next(); } }