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

de.bund.bva.isyfact.logging.autoconfigure.IsyLoggingAutoConfiguration Maven / Gradle / Ivy

package de.bund.bva.isyfact.logging.autoconfigure;


import de.bund.bva.isyfact.logging.config.AbstractBoundaryLoggerProperties;
import de.bund.bva.isyfact.logging.config.IsyLoggingApplicationLoggerProperties;
import de.bund.bva.isyfact.logging.config.IsyLoggingBoundaryLoggerProperties;
import de.bund.bva.isyfact.logging.config.IsyLoggingComponentLoggerProperties;
import de.bund.bva.isyfact.logging.util.LogApplicationListener;
import de.bund.bva.isyfact.logging.util.LoggingMethodInterceptor;
import org.aopalliance.intercept.MethodInterceptor;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * Spring autoconfiguration for including the isy-logging library in the Spring context.
 */
@Configuration
@ConditionalOnProperty(name = "isy.logging.autoconfiguration.enabled", matchIfMissing = true)
@EnableAspectJAutoProxy
@EnableConfigurationProperties
public class IsyLoggingAutoConfiguration {

    /**
     * Creates a bean for the configuration parameters of the application logger.
     *
     * @return Bean isyLoggingApplicationLoggerProperties.
     */
    @Bean
    @ConfigurationProperties(prefix = "isy.logging.anwendung")
    public IsyLoggingApplicationLoggerProperties isyLoggingApplicationLoggerProperties() {
        return new IsyLoggingApplicationLoggerProperties();
    }

    /**
     * Creates a bean for the boundary logger configuration parameters.
     *
     * @return Bean isyLoggingBoundaryLoggerProperties.
     */
    @Bean
    @ConfigurationProperties(prefix = "isy.logging.boundary")
    public IsyLoggingBoundaryLoggerProperties isyLoggingBoundaryLoggerProperties() {
        return new IsyLoggingBoundaryLoggerProperties();
    }

    /**
     * Creates a bean for the configuration parameters of the component logger.
     *
     * @return Bean isyMessageKafkaHealthIndicatorProperties.
     */
    @Bean
    @ConfigurationProperties(prefix = "isy.logging.component")
    public IsyLoggingComponentLoggerProperties isyLoggingComponentLoggerProperties() {
        return new IsyLoggingComponentLoggerProperties();
    }

    /**
     * Listener for logging during startup/shutdown.
     *
     * @param properties Parameters for the configuration of the status logger.
     * @return Listener for logging during startup/shutdown.
     */
    @Bean
    public LogApplicationListener statusLogger(IsyLoggingApplicationLoggerProperties properties) {
        return new LogApplicationListener(properties.getName(), properties.getTyp(), properties.getVersion());
    }

    /**
     * Interceptor for logging at system boundaries.
     *
     * @param properties Parameters for the configuration of the interceptor.
     * @return Interceptor for logging at system boundaries.
     */
    @Bean
    public LoggingMethodInterceptor boundaryLogInterceptor(IsyLoggingBoundaryLoggerProperties properties) {
        return createLoggingMethodInterceptor(properties);
    }

    /**
     * Interceptor for logging at component boundaries.
     *
     * @param properties Parameters for the configuration of the interceptor.
     * @return Interceptor for logging at component boundaries.
     */
    @Bean
    public LoggingMethodInterceptor componentLogInterceptor(IsyLoggingComponentLoggerProperties properties) {
        return createLoggingMethodInterceptor(properties);
    }

    private LoggingMethodInterceptor createLoggingMethodInterceptor(AbstractBoundaryLoggerProperties properties) {
        LoggingMethodInterceptor interceptor;

        if (properties.getConverterExcludes().isEmpty() && properties.getConverterIncludes().isEmpty()) {
            interceptor = new LoggingMethodInterceptor();
        } else {
            interceptor = new LoggingMethodInterceptor(properties.getConverterIncludes(), properties.getConverterExcludes());
        }

        interceptor.setLoggeDauer(properties.isLoggeDauer());
        interceptor.setLoggeAufruf(properties.isLoggeAufruf());
        interceptor.setLoggeErgebnis(properties.isLoggeErgebnis());
        interceptor.setLoggeDaten(properties.isLoggeDaten());
        interceptor.setLoggeDatenBeiException(properties.isLoggeDatenBeiException());
        return interceptor;
    }

    /**
     * Advisor for logging at system boundaries.
     *
     * @param properties             Properties for the configuration of the pointcut.
     * @param boundaryLogInterceptor Interceptor for logging.
     * @return Advisor for logging at system boundaries.
     */
    @Bean
    public Advisor boundaryLogAdvisorByAnnotation(IsyLoggingBoundaryLoggerProperties properties,
        @Qualifier("boundaryLogInterceptor") LoggingMethodInterceptor boundaryLogInterceptor) {
        return setupAdvisor(properties, boundaryLogInterceptor);
    }

    /**
     * Advisor for logging at component boundaries.
     *
     * @param properties              Properties for the configuration of the pointcut.
     * @param componentLogInterceptor Interceptor for logging.
     * @return Advisor for logging at component boundaries.
     */
    @Bean
    public Advisor componentLogAdvisorByAnnotation(IsyLoggingComponentLoggerProperties properties,
        @Qualifier("componentLogInterceptor") LoggingMethodInterceptor componentLogInterceptor) {
        return setupAdvisor(properties, componentLogInterceptor);
    }

    private Advisor setupAdvisor(AbstractBoundaryLoggerProperties properties, MethodInterceptor interceptor) {
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression(properties.getPointcut());
        DefaultPointcutAdvisor adv = new DefaultPointcutAdvisor(pointcut, interceptor);
        adv.setOrder(1000);
        return adv;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy