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

io.higgs.http.server.transformers.JsonTransformer Maven / Gradle / Ivy

package io.higgs.http.server.transformers;

import com.fasterxml.jackson.core.JsonProcessingException;
import io.higgs.core.ConfigUtil;
import io.higgs.http.server.HttpRequest;
import io.higgs.http.server.HttpResponse;
import io.higgs.http.server.HttpStatus;
import io.higgs.http.server.protocol.HttpMethod;
import io.higgs.http.server.protocol.mediaTypeDecoders.JsonDecoder;
import io.higgs.http.server.resource.MediaType;
import io.higgs.http.server.transformers.conf.JsonConfig;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.HttpResponseStatus;
import org.kohsuke.MetaInfServices;

import java.net.URI;
import java.net.URISyntaxException;

import static io.higgs.http.server.resource.MediaType.APPLICATION_JSON_TYPE;
import static io.higgs.http.server.transformers.JsonResponseError.EMPTY_JSON_OBJECT;

/**
 * @author Courtney Robinson 
 */
//@ProviderFor(ResponseTransformer.class)
@MetaInfServices(ResponseTransformer.class)
public class JsonTransformer extends BaseTransformer {
    protected JsonConfig conf;

    public JsonTransformer() {
        conf = ConfigUtil.loadYaml("json_config.yml", JsonConfig.class);
        setPriority(conf.priority);
        addSupportedTypes(APPLICATION_JSON_TYPE);
    }

    @Override
    public boolean canTransform(Object response, HttpRequest request, MediaType mediaType,
                                HttpMethod method, ChannelHandlerContext ctx) {
        return method != null && pathIsJson(request.getUri())
                || super.canTransform(response, request, mediaType, method, ctx);
    }

    private boolean pathIsJson(String uri) {
        if (uri == null || uri.isEmpty()) {
            return false;
        }
        try {
            String path = new URI(uri).getPath();
            if (path == null || path.isEmpty()) {
                return false;
            }
            if (path.endsWith(".json")) {
                return true;
            }
        } catch (URISyntaxException e) {
            return false;
        }
        return false;
    }

    @Override
    public void transform(Object response, HttpRequest request, HttpResponse res, MediaType mediaType,
                          HttpMethod method,
                          ChannelHandlerContext ctx) {
        byte[] data = null;
        if (response == null) {
            data = EMPTY_JSON_OBJECT.getBytes();
        } else {
            if (isError(response)) {
                response = convertErrorToResponseObject(res, (Throwable) response);
            }
            try {
                data = JsonDecoder.mapper.writeValueAsBytes(response);
            } catch (JsonProcessingException e) {
                log.warn("Unable to transform response to JSON", e);
                res.setStatus(HttpStatus.INTERNAL_SERVER_ERROR);
            }
        }
        setResponseContent(res, data);
    }

    protected Object convertErrorToResponseObject(HttpResponse res, Throwable response) {
        determineErrorStatus(res, response);
        if (response instanceof JsonResponseError) {
            JsonResponseError je = (JsonResponseError) response;
            res.setStatus(HttpResponseStatus.valueOf(je.getResponse().getStatus()));
            return je.getContent();
        }
        log.warn("Unable to convert exception to response", response);
        //never JSON encode an exception, user can set it as content to JsonResponseError if they want
        return EMPTY_JSON_OBJECT;
    }

    @Override
    public JsonTransformer instance() {
        return this; //we can return this, instead of a new instance because the JSON transformer isn't stateful
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy