/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.resolver; import java.util.Enumeration; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Component; import com.enonic.esl.net.URLUtil; import com.enonic.esl.servlet.http.CookieUtil; import com.enonic.cms.core.DeploymentPathResolver; import com.enonic.cms.core.portal.rendering.tracing.RenderTrace; @Component public class ForceResolverValueServiceImpl implements ForceResolverValueService { public static final int FORCED_VALUE_COOKIE_MAX_AGE_SECONDS = 60 * 60 * 24 * 365 * 50; // 50 years public String getForcedResolverValue( ResolverContext context, String forcedValueKey ) { String forcedDeviceClass = getForcedResolverValueFromCookie( context.getRequest(), forcedValueKey ); if ( StringUtils.isNotEmpty( forcedDeviceClass ) ) { return forcedDeviceClass; } return getForcedDeviceClassFromSession( context.getRequest(), forcedValueKey ); } public void setForcedValue( ResolverContext context, HttpServletResponse response, String forcedValueKey, ForcedResolverValueLifetimeSettings lifeTimeSettings, String forcedValue ) { switch ( lifeTimeSettings ) { case permanent: setForcedValueInCookie( context.getRequest(), response, forcedValueKey, forcedValue ); break; case session: setForcedValueInSession( context.getRequest(), forcedValueKey, forcedValue ); } } public void clearForcedValue( ResolverContext context, HttpServletResponse response, String forcedValueKey ) { removeSessionAttribute( context.getRequest(), forcedValueKey ); if ( CookieUtil.getCookie( context.getRequest(), forcedValueKey ) != null ) { CookieUtil.setCookie( response, forcedValueKey, "", 0, getCookiePath( context.getRequest() ) ); } } private void removeSessionAttribute( HttpServletRequest request, String toBeRemoved ) { Enumeration attributeNames = request.getSession().getAttributeNames(); while ( attributeNames != null && attributeNames.hasMoreElements() ) { String attributeName = (String) attributeNames.nextElement(); if ( attributeName.startsWith( toBeRemoved ) ) { request.getSession().removeAttribute( attributeName ); } } } private void setForcedValueInCookie( HttpServletRequest request, HttpServletResponse response, String cookieName, String forcedValue ) { CookieUtil.setCookie( response, cookieName, encodeCookieValue( forcedValue ), FORCED_VALUE_COOKIE_MAX_AGE_SECONDS, getCookiePath( request ) ); } private void setForcedValueInSession( HttpServletRequest request, String sessionKey, String deviceClass ) { request.getSession().setAttribute( sessionKey, deviceClass ); } private String getForcedDeviceClassFromSession( HttpServletRequest request, String sessionKey ) { return (String) request.getSession().getAttribute( sessionKey ); } private String getForcedResolverValueFromCookie( HttpServletRequest request, String forcedValueKey ) { Cookie cookie = CookieUtil.getCookie( request, forcedValueKey ); return cookie == null || cookie.getMaxAge() == 0 ? null : decodeCookieValue( cookie.getValue() ); } protected String encodeCookieValue( String value ) { return URLUtil.encode( value ); } protected String decodeCookieValue( String value ) { return URLUtil.decode( value ); } protected String getCookiePath( HttpServletRequest request ) { if ( RenderTrace.isExecutingInDebugMode() ) { final String siteDeploymentPath = DeploymentPathResolver.getRelativeSiteDeploymentPath( request ); final String adminDeploymentPath = DeploymentPathResolver.getAdminDeploymentPath( request ); return adminDeploymentPath + siteDeploymentPath; } else { return DeploymentPathResolver.getSiteDeploymentPath( request ); } } }