<?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"
       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">

    <bean id="dataAccessPlugin" class="com.armedia.acm.pluginmanager.model.AcmPlugin">
        <property name="pluginName" value="Data Access Control Plugin"/>
        <property name="configurationPropertyService" ref="configurationPropertyService"/>
    </bean>

    <bean id="acmAssignmentBusinessRule" class="com.armedia.acm.services.dataaccess.service.impl.AcmAssignedObjectBusinessRule"
          parent="simpleStatelessSingleObjectRuleManager">
        <property name="ruleSpreadsheetFilename" value="drools-assignment-rules.xlsx"/>
    </bean>

    <bean id="acmDataAccessControlBusinessRule" class="com.armedia.acm.services.dataaccess.service.impl.AcmAssignedObjectBusinessRule"
          parent="simpleStatelessSingleObjectRuleManager">
        <property name="ruleSpreadsheetFilename" value="drools-access-control-rules.xlsx"/>
    </bean>

    <bean id="entityParticipantsChangedEventPublisher"
          class="com.armedia.acm.services.dataaccess.service.EntityParticipantsChangedEventPublisher"/>

    <bean id="dataAccessPrivilegeListener" class="com.armedia.acm.services.dataaccess.service.impl.DataAccessPrivilegeListener">
        <property name="assignmentBusinessRule" ref="acmAssignmentBusinessRule"/>
        <property name="accessControlBusinessRule" ref="acmDataAccessControlBusinessRule"/>
        <property name="participantsBusinessRule" ref="participantsBusinessRule"/>
        <property name="participantService" ref="acmParticipantService"/>
        <property name="entityParticipantsChangedEventPublisher" ref="entityParticipantsChangedEventPublisher"/>
        <property name="dacConfig" ref="dacConfig"/>
    </bean>

    <bean id="participantAccessChecker" class="com.armedia.acm.services.dataaccess.service.ParticipantAccessChecker"/>

    <bean id="searchAccessControlFields" class="com.armedia.acm.services.dataaccess.service.SearchAccessControlFields">
        <property name="participantAccessChecker" ref="participantAccessChecker"/>
        <property name="userDao" ref="userJpaDao"/>
        <property name="groupService" ref="groupService"/>
    </bean>

    <bean id="arkPermissionEvaluator" class="com.armedia.acm.services.dataaccess.service.impl.ArkPermissionEvaluator">
        <property name="executeSolrQuery" ref="executeSolrQuery"/>
        <property name="searchResults" ref="searchResults"/>
        <property name="participantDao" ref="acmParticipantDao"/>
        <property name="groupDao" ref="groupDao"/>
        <property name="userDao" ref="userJpaDao"/>
        <property name="accessControlRuleChecker" ref="accessControlRuleChecker"/>
        <property name="acmDataService" ref="acmDataService"/>
        <property name="springContextHolder" ref="acmContextHolder"/>
        <property name="jsonMarshaller" ref="jsonMarshaller"/>
        <property name="packagesToScan" value="#{dataSourceConfig.jpaModelPackages}"/>
        <property name="dataAccessControlConfig" ref="dacConfig"/>
    </bean>

    <bean id="acmDataAccessBatchUpdater" class="com.armedia.acm.services.dataaccess.service.impl.AcmDataAccessBatchUpdater">
        <property name="dataAccessPrivilegeListener" ref="dataAccessPrivilegeListener"/>
    </bean>

    <bean id="acmDataAccessBatchPolicyUpdateService"
          class="com.armedia.acm.services.dataaccess.service.impl.AcmDataAccessBatchPolicyUpdateService">
        <property name="auditPropertyEntityAdapter" ref="auditPropertyEntityAdapter"/>
        <property name="dataAccessBatchUpdater" ref="acmDataAccessBatchUpdater"/>
        <property name="springContextHolder" ref="acmContextHolder"/>
        <property name="dacConfig" ref="dacConfig"/>
    </bean>

    <bean id="dataAccessPolicyUpdateJobDescriptor"
          class="com.armedia.acm.services.dataaccess.service.AcmDataAccessPolicyUpdateJobDescriptor" parent="acmJobDescriptor">
        <property name="dataAccessBatchPolicyUpdateService" ref="acmDataAccessBatchPolicyUpdateService"/>
    </bean>

    <bean id="rulesConfigurationFile" class="java.io.File">
        <constructor-arg value="${user.home}/.arkcase/acm/accessControlRules.json"/>
    </bean>
    <bean id="spelExpressionParser" class="org.springframework.expression.spel.standard.SpelExpressionParser"/>

    <bean id="accessControlRuleChecker" class="com.armedia.acm.services.dataaccess.service.impl.AccessControlRuleCheckerImpl"
          init-method="postConstruct">
        <property name="configurationFile" ref="rulesConfigurationFile"/>
        <property name="objectConverter" ref="objectConverter"/>
        <property name="dacConfig" ref="dacConfig"/>
    </bean>

    <bean id="dataAccessControlService" class="com.armedia.acm.services.dataaccess.service.DataAccessControlService">
        <property name="configurationPropertyService" ref="configurationPropertyService"/>
        <property name="dacConfig" ref="dacConfig"/>
    </bean>

    <bean id="dacConfig" class="com.armedia.acm.services.dataaccess.model.DataAccessControlConfig" scope="refresh">
        <aop:scoped-proxy/>
    </bean>
</beans>