<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">

    <task:executor id="auditorExecutor" pool-size="5"/>

    <bean id="expressionParser" class="org.springframework.expression.spel.standard.SpelExpressionParser"/>

    <bean id="auditWriter" class="com.armedia.acm.audit.listeners.AuditWriter" init-method="loadConfiguration">
        <property name="auditService" ref="auditService"/>
        <property name="expressionParser" ref="expressionParser"/>
        <property name="auditEventDescriptionConfig" ref="auditEventDescriptionConfig"/>
    </bean>

    <bean id="auditDao" class="com.armedia.acm.audit.dao.AuditDao"/>

    <bean id="auditSyslogLogger" class="com.armedia.acm.audit.service.systemlogger.SyslogLogger">
        <property name="auditConfig" ref="auditConfig"/>
        <property name="applicationConfig" ref="applicationProperties"/>
    </bean>

    <bean id="auditWindowsEventLogger" class="com.armedia.acm.audit.service.systemlogger.WindowsEventLogger">
        <property name="applicationConfig" ref="applicationProperties"/>
        <property name="auditConfig" ref="auditConfig"/>
    </bean>

    <bean id="auditSystemLoggerFactory" class="com.armedia.acm.audit.service.systemlogger.SystemLoggerFactory">
        <property name="syslogLogger" ref="auditSyslogLogger"/>
        <property name="windowsEventLogger" ref="auditWindowsEventLogger"/>
    </bean>

    <bean id="auditSystemLogger" factory-bean="auditSystemLoggerFactory" factory-method="getSystemLogger"/>

    <bean id="auditService" class="com.armedia.acm.audit.service.AuditServiceImpl">
        <property name="auditDao" ref="auditDao"/>
        <property name="systemLogger" ref="auditSystemLogger"/>
        <property name="auditConfig" ref="auditConfig"/>
    </bean>

    <bean class="com.armedia.acm.audit.service.PurgeAuditJobDescriptor" parent="acmJobDescriptor">
        <property name="auditService" ref="auditService"/>
    </bean>

    <bean id="acmAuditRequestInterceptor" class="com.armedia.acm.audit.listeners.AcmAuditRequestInterceptor">
        <property name="auditService" ref="auditService"/>
        <property name="auditConfig" ref="auditConfig"/>
    </bean>

    <bean id="acmAuditDatabaseListener" class="com.armedia.acm.audit.listeners.AcmAuditDatabaseListener">
        <property name="auditService" ref="auditService"/>
        <property name="auditConfig" ref="auditConfig"/>
        <property name="objectConverter" ref="objectConverter"/>
    </bean>

    <bean id="acmActivitiEntityEventAuditor" class="com.armedia.acm.audit.listeners.AcmActivitiEntityEventListener">
        <property name="auditService" ref="auditService"/>
        <property name="auditConfig" ref="auditConfig"/>
        <property name="objectConverter" ref="objectConverter"/>
    </bean>

    <bean id="acmActivitiEventAuditor" class="com.armedia.acm.audit.listeners.AcmActivitiEventListener">
        <property name="auditService" ref="auditService"/>
        <property name="auditConfig" ref="auditConfig"/>
    </bean>

    <bean id="auditConfig" class="com.armedia.acm.audit.model.AuditConfig" scope="refresh">
        <aop:scoped-proxy/>
    </bean>

    <bean id="auditEventDescriptionConfig" class="com.armedia.acm.audit.model.AuditEventDescriptionConfig" scope="refresh">
        <aop:scoped-proxy/>
        <property name="jsonUnmarshaller" ref="jsonUnmarshaller"/>
    </bean>

    <bean id="auditEventConfig" class="com.armedia.acm.audit.model.AuditEventConfig" scope="refresh">
        <property name="jsonUnmarshaller" ref="jsonUnmarshaller"/>
        <aop:scoped-proxy/>
    </bean>
</beans>