content: package com.github.aesteve.vertx.nubes.marshallers.impl;
  
  import com.fasterxml.jackson.databind.ObjectMapper;
  import com.github.aesteve.vertx.nubes.marshallers.PayloadMarshaller;
  import com.github.aesteve.vertx.nubes.utils.StackTracePrinter;
  import io.vertx.core.VertxException;
  import io.vertx.core.json.JsonArray;
  import io.vertx.core.json.JsonObject;
  
  import java.io.IOException;
  
  import static com.github.aesteve.vertx.nubes.marshallers.PayloadMarshaller.Constants.ERROR_CODE_KEY;
  import static com.github.aesteve.vertx.nubes.marshallers.PayloadMarshaller.Constants.ERROR_KEY;
  import static com.github.aesteve.vertx.nubes.marshallers.PayloadMarshaller.Constants.ERROR_MESSAGE_KEY;
  
  public class JacksonPayloadMarshaller implements PayloadMarshaller {
  
    protected final ObjectMapper mapper;
  
    public JacksonPayloadMarshaller() {
      this.mapper = new ObjectMapper();
    }
  
    @Override
    @SuppressWarnings("unchecked")
    public <T> T unmarshallPayload(String body, Class<T> clazz) {
      if (clazz.equals(JsonObject.class)) {
        return (T) new JsonObject(body);
      } else if (clazz.equals(JsonArray.class)) {
        return (T) new JsonArray(body);
      }
      try {
        return mapper.readValue(body, clazz);
      } catch(IOException ioe) {
        throw new VertxException(ioe);
      }
    }
  
    @Override
    public String marshallPayload(Object payload) {
      if (payload instanceof JsonObject) {
        return payload.toString();
      } else if (payload instanceof JsonArray) {
        return payload.toString();
      }
      try {
        return mapper.writeValueAsString(payload);
      } catch(IOException ioe) {
        throw new VertxException(ioe);
      }
    }
  
    @Override
    public String marshallUnexpectedError(Throwable error, boolean displayDetails) {
      JsonObject json = new JsonObject();
      JsonObject jsonError = new JsonObject();
      json.put(ERROR_KEY, jsonError);
      jsonError.put(ERROR_CODE_KEY, 500);
      if (displayDetails) {
        jsonError.put(ERROR_MESSAGE_KEY, StackTracePrinter.asLineString(new StringBuilder(), error));
      } else {
        jsonError.put(ERROR_MESSAGE_KEY, "Internal Server Error");
      }
      return json.toString();
    }
  
    @Override
    public String marshallHttpStatus(int statusCode, String errorMessage) {
      JsonObject json = new JsonObject();
      JsonObject jsonError = new JsonObject();
      json.put(ERROR_KEY, jsonError);
      jsonError.put(ERROR_CODE_KEY, statusCode);
      jsonError.put(ERROR_MESSAGE_KEY, errorMessage);
      return json.toString();
    }
  
  }
  