/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.web.portal.page;
import java.util.Enumeration;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.enonic.cms.core.Attribute;
import com.enonic.cms.core.Path;
import com.enonic.cms.core.portal.PortalRequest;
import com.enonic.cms.core.portal.PortalRequestService;
import com.enonic.cms.core.portal.PortalResponse;
import com.enonic.cms.core.portal.RedirectInstruction;
import com.enonic.cms.core.portal.VerticalSession;
import com.enonic.cms.core.portal.livetrace.PortalRequestTrace;
import com.enonic.cms.core.portal.livetrace.PortalRequestTracer;
import com.enonic.cms.core.portal.ticket.TicketGenerator;
import com.enonic.cms.core.security.user.User;
import com.enonic.cms.core.structure.SitePath;
import com.enonic.cms.core.structure.SiteProperties;
import com.enonic.cms.core.structure.SitePropertyNames;
import com.enonic.cms.web.portal.PortalWebContext;
import com.enonic.cms.web.portal.handler.WebHandlerBase;
@Component
public final class PageHandler
extends WebHandlerBase
{
private PortalRequestService portalRequestService;
private PortalRenderResponseService portalRenderResponseService;
@Override
protected boolean canHandle( final Path localPath )
{
return true;
}
@Override
protected void doHandle( final PortalWebContext context )
throws Exception
{
final HttpServletRequest request = context.getRequest();
final HttpServletResponse response = context.getResponse();
final SitePath sitePath = context.getSitePath();
try
{
handleDefaultRequest( request, response, sitePath );
}
catch ( Exception e )
{
SitePath originalSitePath = context.getOriginalSitePath();
throw new DefaultRequestException( originalSitePath, context.getReferrerHeader(), e );
}
}
private void handleDefaultRequest( HttpServletRequest httpRequest, HttpServletResponse httpResponse, SitePath sitePath )
throws Exception
{
HttpSession httpSession = httpRequest.getSession( true );
String httpStatusCode = sitePath.getParam( "httpResponseCode" );
if (httpStatusCode != null) {
sitePath.removeParam( "httpResponseCode" );
httpResponse.setStatus( Integer.parseInt( httpStatusCode ) );
}
if ( !sitePath.getLocalPath().startsWithSlash() )
{
redirectToRoot( httpRequest, httpResponse, sitePath );
return;
}
String originalUrl = (String) httpRequest.getAttribute( Attribute.ORIGINAL_URL );
SitePath originalSitePath = (SitePath) httpRequest.getAttribute( Attribute.ORIGINAL_SITEPATH );
final PortalRequest request;
final PortalResponse response;
final PortalRequestTrace portalRequestTrace = PortalRequestTracer.startTracing( originalUrl, livePortalTraceService );
try
{
PortalRequestTracer.traceMode( portalRequestTrace, previewService );
PortalRequestTracer.traceHttpRequest( portalRequestTrace, httpRequest );
PortalRequestTracer.traceRequestedSitePath( portalRequestTrace, sitePath );
request = new PortalRequest();
request.setRequestTime( timeService.getNowAsDateTime() );
request.setSitePath( sitePath );
request.setRequestParams( getRequestParameters( httpRequest ) );
request.setTicketId( TicketGenerator.getOrGenerate( httpRequest ) );
request.setOriginalSitePath( originalSitePath );
request.setVerticalSession( getAndEnsureVerticalSessionOnHttpSession( httpSession ) );
request.setHttpReferer( httpRequest.getHeader( "referer" ) );
request.setOriginalUrl( originalUrl );
User loggedInPortalUser = securityService.getLoggedInPortalUser();
final SiteProperties siteProperties = sitePropertiesService.getSiteProperties( sitePath.getSiteKey() );
if ( loggedInPortalUser.isAnonymous() )
{
if ( siteProperties.getPropertyAsBoolean( SitePropertyNames.AUTOLOGIN_HTTP_REMOTE_USER_ENABLED ) )
{
loggedInPortalUser =
autoLoginService.autologinWithRemoteUser( httpRequest, siteDao.findByKey( sitePath.getSiteKey() ) );
}
}
if ( loggedInPortalUser.isAnonymous() )
{
if ( siteProperties.getPropertyAsBoolean( SitePropertyNames.AUTOLOGIN_REMEMBER_ME_COOKIE_ENABLED ) )
{
loggedInPortalUser =
autoLoginService.autologinWithCookie( siteDao.findByKey( sitePath.getSiteKey() ), httpRequest, httpResponse );
}
}
request.setRequester( loggedInPortalUser.getKey() );
request.setPreviewContext( previewService.getPreviewContext() );
response = portalRequestService.processRequest( request );
}
finally
{
PortalRequestTracer.stopTracing( portalRequestTrace, livePortalTraceService );
}
portalRenderResponseService.serveResponse( request, response, httpResponse, httpRequest, portalRequestTrace );
}
private void redirectToRoot( HttpServletRequest httpRequest, HttpServletResponse httpResponse, SitePath sitePath )
throws Exception
{
sitePath = sitePath.createNewInSameSite( Path.ROOT, sitePath.getParams() );
PortalRequest request = new PortalRequest();
request.setRequestTime( new DateTime() );
request.setSitePath( sitePath );
request.setRequestParams( getRequestParameters( httpRequest ) );
RedirectInstruction redirectInstruction = new RedirectInstruction( sitePath );
redirectInstruction.setPermanentRedirect( true );
PortalResponse response = PortalResponse.createRedirect( redirectInstruction );
portalRenderResponseService.serveResponse( request, response, httpResponse, httpRequest, null );
}
private HashMap<String, Object> getRequestParameters( HttpServletRequest request )
{
HashMap<String, Object> parameters = new HashMap<String, Object>();
Enumeration parameterNames = request.getParameterNames();
while ( parameterNames.hasMoreElements() )
{
String name = (String) parameterNames.nextElement();
String[] parameterValues = request.getParameterValues( name );
if ( parameterValues.length == 1 )
{
String parameter = parameterValues[0];
parameters.put( name, parameter );
}
else
{
parameters.put( name, parameterValues );
}
}
return parameters;
}
private VerticalSession getAndEnsureVerticalSessionOnHttpSession( HttpSession httpSession )
{
VerticalSession vsession = (VerticalSession) httpSession.getAttribute( VerticalSession.VERTICAL_SESSION_OBJECT );
if ( vsession == null )
{
vsession = new VerticalSession();
httpSession.setAttribute( VerticalSession.VERTICAL_SESSION_OBJECT, vsession );
}
return vsession;
}
@Autowired
public void setPortalRequestService( final PortalRequestService portalRequestService )
{
this.portalRequestService = portalRequestService;
}
@Autowired
public void setPortalRenderResponseService( final PortalRenderResponseService portalRenderResponseService )
{
this.portalRenderResponseService = portalRenderResponseService;
}
}