All Downloads are FREE. Search and download functionalities are using the official Maven repository.

es.sandbox.ui.messages.spring.config.annotation.FlashMessagesConfigurationSupport Maven / Gradle / Ivy

package es.sandbox.ui.messages.spring.config.annotation;

import es.sandbox.ui.messages.Context;
import es.sandbox.ui.messages.ContextBuilder;
import es.sandbox.ui.messages.CssClassesByLevel;
import es.sandbox.ui.messages.Level;
import es.sandbox.ui.messages.StoreAccessorFactory;
import es.sandbox.ui.messages.resolver.MessageResolverStrategy;
import es.sandbox.ui.messages.spring.config.FlashMessagesHandlerInterceptor;
import es.sandbox.ui.messages.spring.config.FlashMessagesMethodArgumentResolver;
import es.sandbox.ui.messages.spring.config.MessageSourceMessageResolverAdapter;
import es.sandbox.ui.messages.spring.scope.flash.FlashScopeStoreAccessorFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.handler.HandlerExceptionResolverComposite;
import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;


public class FlashMessagesConfigurationSupport
    extends WebMvcConfigurerAdapter
    implements ApplicationContextAware {

    private static final Logger LOG = LoggerFactory.getLogger(FlashMessagesConfigurationSupport.class);

    private HandlerExceptionResolver handlerExceptionResolver;
    private MessageSource messageSource;
    private ApplicationContext applicationContext;

    private Context context;

    @Autowired(required = true)
    void setMessageSource(MessageSource messageSource) {
        this.messageSource = messageSource;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        LOG.info("Using application context: {}", applicationContext);
        this.applicationContext = applicationContext;
    }

    /**
     * adds a FlashMessagesMethodArgumentResolver to handlerExceptionResolver's argument resolvers
     */
    @PostConstruct
    private void configureMessagesExceptionArgumentResolvers() {
        this.handlerExceptionResolver = this.applicationContext.getBean("handlerExceptionResolver", HandlerExceptionResolver.class);

        for (final HandlerExceptionResolver resolver : ((HandlerExceptionResolverComposite) this.handlerExceptionResolver).getExceptionResolvers()) {
            if (resolver instanceof ExceptionHandlerExceptionResolver) {
                configureCustomHandlerMethodArgumentResolver((ExceptionHandlerExceptionResolver) resolver);
            }
        }
    }

    private void configureCustomHandlerMethodArgumentResolver(final ExceptionHandlerExceptionResolver exceptionHandlerExceptionResolver) {
        final List resolvers = new ArrayList();
        resolvers.addAll(exceptionHandlerExceptionResolver.getArgumentResolvers().getResolvers());
        resolvers.add(flashMessagesMethodArgumentResolver());

        exceptionHandlerExceptionResolver.setArgumentResolvers(resolvers);
        exceptionHandlerExceptionResolver.setApplicationContext(this.applicationContext);
        exceptionHandlerExceptionResolver.afterPropertiesSet();
    }

    /*
     * (non-Javadoc)
     * @see
     * org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter#addArgumentResolvers(java.util.List)
     */
    @Override
    public void addArgumentResolvers(List argumentResolvers) {
        argumentResolvers.add(flashMessagesMethodArgumentResolver());
    }


    private FlashMessagesMethodArgumentResolver flashMessagesMethodArgumentResolver() {
        return new FlashMessagesMethodArgumentResolver(flashMessagesContext());
    }


    /*
     * (non-Javadoc)
     * @see
     * org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter#addInterceptors(org.springframework.
     * web.servlet.config.annotation.InterceptorRegistry)
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new FlashMessagesHandlerInterceptor(flashMessagesContext()));
    }


    /**
     * @return
     */
    @Bean
    Context flashMessagesContext() {
        if (this.context == null) {
            this.context = new ContextBuilder(configureFlashStoreAccessorFactory())
                .withMessageResolverStrategy(configureMessageResolverStrategy())
                .withLevels(includedLevels())
                .withCssClassesByLevel(cssClassesByLevel())
                .build();
        }
        return this.context;
    }


    /**
     * Override this method to add a custom {@link StoreAccessorFactory}
     *
     * @return
     */
    protected StoreAccessorFactory configureFlashStoreAccessorFactory() {
        return new FlashScopeStoreAccessorFactory();
    }

    /**
     * Override this method to add a custom {@link MessageResolverStrategy}
     *
     * @return
     */
    protected MessageResolverStrategy configureMessageResolverStrategy() {
        return new MessageSourceMessageResolverAdapter(this.messageSource);
    }


    private Level[] includedLevels() {
        return configureIncludedLevels();
    }

    /**
     * Override this method to configure {@link Level} values
     * that will be used.
     *
     * @return
     */
    protected Level[] configureIncludedLevels() {
        return Level.values();
    }


    private CssClassesByLevel cssClassesByLevel() {
        final CssClassesByLevel cssClassesByLevel = new CssClassesByLevel();
        configureCssClassesByLevel(cssClassesByLevel);
        return cssClassesByLevel;
    }

    /**
     * Override this method to configure custom css classes in each {@link Level}
     *
     * @param cssClassesByLevel
     */
    protected void configureCssClassesByLevel(CssClassesByLevel cssClassesByLevel) {

    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy