net.acesinc.convergentui.ConvergentUIRequestFilter.java Source code

Java tutorial

Introduction

Here is the source code for net.acesinc.convergentui.ConvergentUIRequestFilter.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package net.acesinc.convergentui;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.netflix.zuul.context.RequestContext;
import java.awt.image.BufferedImage;
import javax.servlet.http.HttpServletRequest;
import net.acesinc.convergentui.content.ContentResponse;
import net.acesinc.convergentui.content.ContentService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.MimeType;

/**
 * The ConvergentUIRequestFilter handles special requests to get data such as
 * images, javascript, css, etc from downstream services. ConvergentUI Requests
 * must conform to a special format that looks like: /cui-req:// An example of
 * how to use this might be:
 * <pre>
 * {@code
 * <img src="/cui-req://service2/images/img.png" alt='img' ></img>
 * }
 * </pre>
 * This will request the image "img.png" from service2 at the path
 * /images/img.png
 *
 * @author andrewserff
 */
@Component
public class ConvergentUIRequestFilter extends BaseRequestFilter {

    private static final Logger log = LoggerFactory.getLogger(ConvergentUIRequestFilter.class);

    @Autowired
    private ContentService contentManager;
    private ObjectMapper mapper = new ObjectMapper();

    @Override
    public Object run() {
        //First we need to build the correct URL
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest req = ctx.getRequest();

        String path = req.getRequestURI();

        String location = path.substring("/cui-req://".length());
        log.debug("RequestFilter for [ " + location + " ] in process");

        RequestContext context = RequestContext.getCurrentContext();
        ContentResponse response = contentManager.getContentFromService(location, location, false, context);

        MimeType type = response.getContentType();

        addResponseHeaders();

        if (!response.isError()) {
            Object resp = response.getContent();
            try {

                if (String.class.isAssignableFrom(resp.getClass())) {
                    writeResponse((String) resp, type);
                } else if (BufferedImage.class.isAssignableFrom(resp.getClass())) {
                    writeResponse((BufferedImage) resp, response.getContentType());
                } else if (/*Map.class.isAssignableFrom(resp.getClass()) &&*/ type.getSubtype().contains("json")) {
                    writeResponse(mapper.writeValueAsString(resp), type);
                } else {

                    log.warn("Unknown response type [ " + response.getContentType()
                            + " ] that we can't handle yet. Content is of type: " + resp.getClass());
                }
            } catch (Exception ex) {
                log.error("Error writing response", ex);
            }
        }
        return null;

    }

}