/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.server.service.admin.mvc.controller;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import com.enonic.vertical.adminweb.AdminHelper;
import com.enonic.cms.framework.util.UrlPathEncoder;
import com.enonic.cms.core.Attribute;
import com.enonic.cms.core.admin.PreviewSitePathResolver;
import com.enonic.cms.core.security.PortalSecurityHolder;
import com.enonic.cms.core.security.SecurityService;
import com.enonic.cms.core.security.user.User;
import com.enonic.cms.core.structure.SitePath;
/**
* This class implements a file controller that returns the actual referenced file in the servlet context.
*/
public class SitePreviewController
extends AbstractController
{
private PreviewSitePathResolver sitePathResolver;
private SecurityService securityService;
private String characterEncoding;
@Autowired
public void setSitePathResolver( PreviewSitePathResolver value )
{
this.sitePathResolver = value;
}
@Autowired
public void setSecurityService( SecurityService value )
{
this.securityService = value;
}
private void loginAdminWebUser( HttpServletRequest request )
{
HttpSession session = request.getSession( false );
if ( session != null )
{
User adminUser = securityService.getLoggedInAdminConsoleUser();
if ( adminUser != null )
{
PortalSecurityHolder.setLoggedInUser( adminUser.getKey() );
}
}
}
protected ModelAndView handleRequestInternal( HttpServletRequest request, HttpServletResponse response )
throws Exception
{
final User originalLoggedInPortalUser = securityService.getLoggedInPortalUser();
if ( originalLoggedInPortalUser.isAnonymous() )
{
loginAdminWebUser( request );
if ( securityService.getLoggedInPortalUser().isAnonymous() )
{
// User is not logged in, redirect to admin login
return new ModelAndView( "redirect:" + AdminHelper.getAdminPath( request, false ) );
}
}
else if ( !originalLoggedInPortalUser.equals( securityService.getLoggedInAdminConsoleUser() ) )
{
loginAdminWebUser( request );
if ( securityService.getLoggedInPortalUser().isAnonymous() )
{
// User is not logged in, redirect to admin login
return new ModelAndView( "redirect:" + AdminHelper.getAdminPath( request, false ) );
}
}
SitePath sitePath = sitePathResolver.resolveSitePath( request );
String url = "/site" + sitePath.asString();
// We need to url-encode the path again,
// since forwarding to an decoded url fails in some application servers (Oracle)
url = UrlPathEncoder.encodeUrlPath( url, this.characterEncoding );
request.setAttribute( Attribute.PREVIEW_ENABLED, "true" );
Map<String, Object> model = new HashMap<String, Object>();
model.put( "path", url );
model.put( "requestParams", sitePath.getParams() );
return new ModelAndView( new SiteCustomForwardView(), model );
}
@Value("${cms.url.characterEncoding}")
public void setCharacterEncoding( String characterEncoding )
{
this.characterEncoding = characterEncoding;
}
}