package org.apereo.cas.config;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.web.Log4jServletContextListener;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.mvc.ParameterizableViewController;
import org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter;
import org.springframework.web.servlet.theme.ThemeChangeInterceptor;
import org.springframework.web.servlet.view.RedirectView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/**
* This is {@link CasWebAppConfiguration}.
*
* @author Misagh Moayyed
* @since 5.0.0
*/
@Configuration("casWebAppConfiguration")
@EnableConfigurationProperties(CasConfigurationProperties.class)
public class CasWebAppConfiguration extends WebMvcConfigurerAdapter {
@Autowired
private CasConfigurationProperties casProperties;
@RefreshScope
@Bean
public ThemeChangeInterceptor themeChangeInterceptor() {
final ThemeChangeInterceptor bean = new ThemeChangeInterceptor();
bean.setParamName(casProperties.getTheme().getParamName());
return bean;
}
@Bean
public CookieLocaleResolver localeResolver() {
final CookieLocaleResolver bean = new CookieLocaleResolver() {
@Override
protected Locale determineDefaultLocale(final HttpServletRequest request) {
final Locale locale = request.getLocale();
if (StringUtils.isBlank(casProperties.getLocale().getDefaultValue())
|| !locale.getLanguage().equals(casProperties.getLocale().getDefaultValue())) {
return locale;
}
return new Locale(casProperties.getLocale().getDefaultValue());
}
};
return bean;
}
@Bean
public Map serviceThemeResolverSupportedBrowsers() {
final Map<String, String> map = new HashMap<>();
map.put(".*iPhone.*", "iphone");
map.put(".*Android.*", "android");
map.put(".*Safari.*Pre.*", "safari");
map.put(".*iPhone.*", "iphone");
map.put(".*Nokia.*AppleWebKit.*", "nokiawebkit");
return map;
}
@Bean
protected Controller rootController() {
return new ParameterizableViewController() {
@Override
protected ModelAndView handleRequestInternal(final HttpServletRequest request,
final HttpServletResponse response)
throws Exception {
final String queryString = request.getQueryString();
final String url = request.getContextPath() + "/login"
+ (queryString != null ? '?' + queryString : StringUtils.EMPTY);
return new ModelAndView(new RedirectView(response.encodeURL(url)));
}
};
}
@Bean
public ServletListenerRegistrationBean log4jServletContextListener() {
final ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean();
bean.setEnabled(true);
bean.setName("log4jServletContextListener");
bean.setListener(new Log4jServletContextListener());
return bean;
}
@Bean
public SimpleUrlHandlerMapping handlerMapping() {
final SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
final Controller root = rootController();
mapping.setOrder(1);
mapping.setAlwaysUseFullPath(true);
mapping.setRootHandler(root);
final Map urls = new HashMap();
urls.put("/", root);
mapping.setUrlMap(urls);
return mapping;
}
@Bean
public SimpleControllerHandlerAdapter simpleControllerHandlerAdapter() {
return new SimpleControllerHandlerAdapter();
}
}