/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.resolver.locale;
import java.util.Locale;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.enonic.cms.core.language.LanguageEntity;
import com.enonic.cms.core.localization.LocaleParsingException;
import com.enonic.cms.core.localization.LocalizationResourceBundleUtils;
import com.enonic.cms.core.resolver.ForceResolverValueService;
import com.enonic.cms.core.resolver.ForcedResolverValueLifetimeSettings;
import com.enonic.cms.core.resolver.ResolverContext;
import com.enonic.cms.core.resolver.ScriptResolverResult;
import com.enonic.cms.core.resolver.ScriptResolverService;
import com.enonic.cms.core.resource.ResourceFile;
import com.enonic.cms.core.resource.ResourceKey;
import com.enonic.cms.core.resource.ResourceService;
import com.enonic.cms.core.structure.SiteEntity;
import com.enonic.cms.core.structure.menuitem.MenuItemEntity;
@Component
public class LocaleResolverServiceImpl
implements LocaleResolverService
{
private ResourceService resourceService;
private ScriptResolverService localeScriptResolver;
private ForceResolverValueService forceResolverValueService;
public final static String LOCALE_FORCED_BASE_NAME = "ForceLocale";
public Locale getLocale( ResolverContext context )
{
if ( !context.getSite().isLocalizationEnabled() )
{
return null;
}
Locale forcedLocale = getForcedLocale( context );
if ( forcedLocale != null )
{
return forcedLocale;
}
ResourceFile localeResolverScript = getLocaleResolverScript( context.getSite() );
if ( localeResolverScript != null )
{
Locale scriptResolvedLocale = resolveLocaleFromScript( context, localeResolverScript );
if ( scriptResolvedLocale != null )
{
return scriptResolvedLocale;
}
}
Locale contextResolvedLocale = getContextResolvedLocale( context );
return contextResolvedLocale;
}
private Locale getForcedLocale( ResolverContext context )
{
String forcedLocaleCacheKey = createForcedValueKey( context.getSite() );
String forcedLocaleString = forceResolverValueService.getForcedResolverValue( context, forcedLocaleCacheKey );
return StringUtils.isNotEmpty( forcedLocaleString ) ? createLocale( forcedLocaleString ) : null;
}
private ResourceFile getLocaleResolverScript( SiteEntity site )
{
ResourceKey localeResolverResourceKey = site.getLocaleResolver();
if ( localeResolverResourceKey == null )
{
return null;
}
return getResolverScript( localeResolverResourceKey );
}
private Locale resolveLocaleFromScript( ResolverContext context, ResourceFile localeResolverScript )
{
ScriptResolverResult resolverResult = localeScriptResolver.resolveValue( context, localeResolverScript );
return (Locale) resolverResult.getResolverReturnValues().get( LocaleXsltScriptResolver.LOCALE_RETURN_VALUE_KEY );
}
private Locale getContextResolvedLocale( ResolverContext context )
{
LanguageEntity contentLanguage = context.getLanguage();
if ( contentLanguage != null && StringUtils.isNotEmpty( contentLanguage.getCode() ) )
{
return createLocale( contentLanguage.getCode() );
}
MenuItemEntity menuItem = context.getMenuItem();
if ( menuItem != null && menuItem.getLanguage() != null )
{
return createLocale( menuItem.getLanguage().getCode() );
}
SiteEntity site = context.getSite();
return site.getLanguage() != null ? createLocale( site.getLanguage().getCode() ) : null;
}
private Locale createLocale( String localeString )
{
try
{
return LocalizationResourceBundleUtils.parseLocaleString( localeString );
}
catch ( LocaleParsingException e )
{
return null;
}
}
protected ResourceFile getResolverScript( ResourceKey resourceKey )
{
return resourceService.getResourceFile( resourceKey );
}
protected String createForcedValueKey( SiteEntity site )
{
return LOCALE_FORCED_BASE_NAME + site.getKey();
}
public void setForcedLocale( ResolverContext context, HttpServletResponse response, ForcedResolverValueLifetimeSettings lifeTimeSetting,
String localeString )
{
String forcedValueKey = createForcedValueKey( context.getSite() );
forceResolverValueService.clearForcedValue( context, response, forcedValueKey );
forceResolverValueService.setForcedValue( context, response, forcedValueKey, lifeTimeSetting, localeString );
}
public void resetLocale( ResolverContext context, HttpServletResponse response )
{
forceResolverValueService.clearForcedValue( context, response, createForcedValueKey( context.getSite() ) );
}
@Autowired
public void setForceResolverValueService( ForceResolverValueService forceResolverValueService )
{
this.forceResolverValueService = forceResolverValueService;
}
@Autowired
@Qualifier("localeXsltScriptResolver")
public void setLocaleScriptResolver( ScriptResolverService localeScriptResolver )
{
this.localeScriptResolver = localeScriptResolver;
}
@Autowired
public void setResourceService( ResourceService resourceService )
{
this.resourceService = resourceService;
}
}