/*
* ****************************************************************************
* Cloud Foundry
* Copyright (c) [2009-2017] Pivotal Software, Inc. All Rights Reserved.
*
* This product is licensed to you under the Apache License, Version 2.0 (the "License").
* You may not use this product except in compliance with the License.
*
* This product includes a number of subcomponents with
* separate copyright notices and license terms. Your use of these
* subcomponents is subject to the terms and conditions of the
* subcomponent's license, as noted in the LICENSE file.
* ****************************************************************************
*/
package org.cloudfoundry.identity.uaa.login;
import nz.net.ultraq.thymeleaf.LayoutDialect;
import org.cloudfoundry.identity.uaa.web.ForwardAwareInternalResourceViewResolver;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.accept.ContentNegotiationManager;
import org.springframework.web.servlet.view.BeanNameViewResolver;
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import org.thymeleaf.dialect.IDialect;
import org.thymeleaf.extras.springsecurity4.dialect.SpringSecurityDialect;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ITemplateResolver;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
@Configuration
public class ThymeleafConfig {
@Bean
public ThymeleafViewResolver thymeleafViewResolver(ApplicationContext context) {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(webTemplateEngine(context));
return viewResolver;
}
@Bean
public SpringTemplateEngine webTemplateEngine(ApplicationContext context) {
SpringTemplateEngine springTemplateEngine = new SpringTemplateEngine();
springTemplateEngine.setTemplateResolver(webTemplateResolver(context));
Set<IDialect> additionalDialects = new HashSet<>();
additionalDialects.add(new LayoutDialect());
additionalDialects.add(new SpringSecurityDialect());
springTemplateEngine.setAdditionalDialects(additionalDialects);
return springTemplateEngine;
}
@Bean
public ITemplateResolver webTemplateResolver(ApplicationContext context) {
SpringResourceTemplateResolver templateResolver = baseHtmlTemplateResolver(context);
templateResolver.setPrefix("classpath:/templates/web/");
return templateResolver;
}
@Bean
public SpringTemplateEngine mailTemplateEngine(ApplicationContext context) {
SpringTemplateEngine springTemplateEngine = new SpringTemplateEngine();
springTemplateEngine.setTemplateResolver(mailTemplateResolver(context));
return springTemplateEngine;
}
@Bean
public ITemplateResolver mailTemplateResolver(ApplicationContext context) {
SpringResourceTemplateResolver templateResolver = baseHtmlTemplateResolver(context);
templateResolver.setPrefix("classpath:/templates/mail/");
return templateResolver;
}
@Bean
public org.springframework.web.servlet.view.ContentNegotiatingViewResolver viewResolver(ApplicationContext context,
ContentNegotiationManager contentNegotiationManager) {
ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setCharacterEncoding(StandardCharsets.UTF_8.toString());
viewResolver.setTemplateEngine(webTemplateEngine(context));
ForwardAwareInternalResourceViewResolver forwardAwareInternalResourceViewResolver = new ForwardAwareInternalResourceViewResolver();
BeanNameViewResolver beanNameViewResolver = new BeanNameViewResolver();
resolver.setViewResolvers(Arrays.asList(viewResolver, forwardAwareInternalResourceViewResolver, beanNameViewResolver));
MappingJackson2JsonView jackson2JsonView = new MappingJackson2JsonView();
jackson2JsonView.setExtractValueFromSingleKeyModel(true);
resolver.setDefaultViews(Arrays.asList(jackson2JsonView));
resolver.setContentNegotiationManager(contentNegotiationManager);
return resolver;
}
private SpringResourceTemplateResolver baseHtmlTemplateResolver(ApplicationContext context) {
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML5");
templateResolver.setApplicationContext(context);
return templateResolver;
}
}