/*
* 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 java.util.Arrays;
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
{
/* js files that contain i18n strings. must be not cached. */
private static final String[] sorted_js_files = {
"/admin/javascript/calendar_picker.js",
"/admin/javascript/domain.js",
"/admin/javascript/groups.js",
"/admin/javascript/log_filter.js",
"/admin/javascript/resource.js",
"/admin/javascript/section.js",
"/admin/javascript/user.js",
"/admin/javascript/validate.js",
"/admin/javascript/workentry.js"
};
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() )
{
if ( Arrays.binarySearch( sorted_js_files, request.getPathInfo() ) > 0 )
{
HttpServletUtil.setCacheControlNoCache( response );
}
else
{
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;
}
}