package org.apereo.cas.config; import org.apereo.cas.config.support.CasConfigurationEmbeddedValueResolver; import org.apereo.cas.util.SchedulingUtils; import org.apereo.cas.util.io.CommunicationsManager; import org.apereo.cas.util.spring.ApplicationContextProvider; import org.apereo.cas.util.spring.Converters; import org.apereo.cas.util.spring.SpringAwareMessageMessageInterpolator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.boot.autoconfigure.AutoConfigureOrder; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Role; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.ConverterRegistry; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.format.support.DefaultFormattingConversionService; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.util.StringValueResolver; import javax.annotation.PostConstruct; import javax.validation.MessageInterpolator; import java.time.ZonedDateTime; /** * This is {@link CasCoreUtilConfiguration}. * * @author Misagh Moayyed * @since 5.0.0 */ @Configuration("casCoreUtilConfiguration") @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @EnableScheduling public class CasCoreUtilConfiguration { @Autowired private ApplicationContext applicationContext; @Bean public ApplicationContextProvider applicationContextProvider() { return new ApplicationContextProvider(); } @Bean public MessageInterpolator messageInterpolator() { return new SpringAwareMessageMessageInterpolator(); } @Bean public CommunicationsManager communicationsManager() { return new CommunicationsManager(); } @Bean @Role(BeanDefinition.ROLE_INFRASTRUCTURE) @Order(Ordered.HIGHEST_PRECEDENCE) public StringValueResolver durationCapableStringValueResolver() { return SchedulingUtils.prepScheduledAnnotationBeanPostProcessor(applicationContext); } @Bean public Converter<ZonedDateTime, String> zonedDateTimeToStringConverter() { return new Converters.ZonedDateTimeToStringConverter(); } @PostConstruct public void init() { final ConfigurableApplicationContext ctx = applicationContextProvider().getConfigurableApplicationContext(); final DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(true); conversionService.setEmbeddedValueResolver(new CasConfigurationEmbeddedValueResolver(ctx)); ctx.getEnvironment().setConversionService(conversionService); final ConfigurableEnvironment env = (ConfigurableEnvironment) ctx.getParent().getEnvironment(); env.setConversionService(conversionService); final ConverterRegistry registry = (ConverterRegistry) DefaultConversionService.getSharedInstance(); registry.addConverter(zonedDateTimeToStringConverter()); } }