com.enonic.cms.server.service.admin.mvc.controller.ResourceController.java Source code

Java tutorial

Introduction

Here is the source code for com.enonic.cms.server.service.admin.mvc.controller.ResourceController.java

Source

/*
 * Copyright 2000-2013 Enonic AS
 * http://www.enonic.com/license
 */
package com.enonic.cms.server.service.admin.mvc.controller;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.joda.time.DateTime;
import org.joda.time.Interval;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.web.context.support.ServletContextResourceLoader;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import org.springframework.web.util.UrlPathHelper;

import com.enonic.cms.framework.util.HttpCacheControlSettings;
import com.enonic.cms.framework.util.HttpServletUtil;
import com.enonic.cms.framework.util.MimeTypeResolver;

/**
 * This class implements a file controller that returns the actual referenced file in
 * the servlet context.
 */
public class ResourceController extends AbstractController implements InitializingBean {
    protected MimeTypeResolver mimeTypeResolver;

    private UrlPathHelper urlPathHelper;

    private ServletContextResourceLoader resourceLoader;

    public ResourceController() {
        urlPathHelper = new UrlPathHelper();
        urlPathHelper.setUrlDecode(true);
    }

    public void afterPropertiesSet() {
        this.resourceLoader = new ServletContextResourceLoader(getServletContext());
    }

    /**
     * Handle the request.
     */
    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        String path = urlPathHelper.getPathWithinApplication(request);
        Resource resource = this.resourceLoader.getResource(path);

        if (resource.exists()) {
            DateTime now = new DateTime();
            DateTime expirationDate = now.plusHours(1);

            HttpCacheControlSettings cacheControlSettings = new HttpCacheControlSettings();
            cacheControlSettings.maxAgeSecondsToLive = new Interval(now, expirationDate).toDurationMillis() / 1000;
            cacheControlSettings.publicAccess = true;

            HttpServletUtil.setDateHeader(response, now.toDate());
            HttpServletUtil.setExpiresHeader(response, expirationDate.toDate());
            HttpServletUtil.setCacheControl(response, cacheControlSettings);

            serveResourceToResponse(request, response, resource);
        } else {
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
        }

        return null;
    }

    /**
     * Serve resource to response.
     */
    protected void serveResourceToResponse(HttpServletRequest request, HttpServletResponse response,
            Resource resource) throws Exception {
        BufferedInputStream in = new BufferedInputStream(resource.getInputStream());
        BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
        response.setContentType(mimeTypeResolver.getMimeType(resource.getFilename()));
        HttpServletUtil.copyNoCloseOut(in, out);
    }

    @Autowired
    public void setMimeTypeResolver(MimeTypeResolver mimeTypeResolver) {
        this.mimeTypeResolver = mimeTypeResolver;
    }
}