<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans"
    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="changeCaseStatusDao" class="com.armedia.acm.plugins.casefile.dao.ChangeCaseStatusDao"/>
    <bean id="dispositionDao" class="com.armedia.acm.plugins.casefile.dao.DispositionDao"/>

    <bean id="caseFileEventListener" class="com.armedia.acm.plugins.casefile.service.CaseFileEventListener">
        <property name="acmObjectHistoryService" ref="acmObjectHistoryService"/>
        <property name="acmObjectHistoryEventPublisher" ref="acmObjectHistoryEventPublisher"/>
        <property name="caseFileEventUtility" ref="caseFileEventUtility"/>
        <property name="acmAssignmentDao" ref="acmAssignmentDao"/>
        <property name="calendarService" ref="outlookContainerService"/>
        <property name="shouldDeleteCalendarFolder" value="#{caseConfig.deleteCalendarFolderAfterCaseClosed}"/>
        <property name="caseFileStatusClosed" value="#{caseConfig.statusClosed}"/>
        <property name="calendarAdminService" ref="outlookCalendarAdminServiceExtension"/>
        <property name="objectConverter" ref="objectConverter"/>
        <property name="folderCreatorDao" ref="outlookFolderCreatorDao"/>
        <property name="dateTimeService" ref="dateTimeService"/>
    </bean>

    <bean id="changeCaseStatusTaskName" class="java.lang.String">
        <constructor-arg>
            <value>Request to Change Case Status '%s'</value>
        </constructor-arg>
    </bean>

    <bean id="pdfChangeCaseFileStateDocumentGenerator"
        class="com.armedia.acm.plugins.casefile.service.PDFChangeCaseFileStateDocumentGenerator"
        parent="pdfDocumentGenerator">
        <property name="dao" ref="caseFileDao"/>
    </bean>

    <bean id="changeCaseStatusWorkflowListener123"
        class="com.armedia.acm.plugins.casefile.service.ChangeCaseStatusWorkflowListener">
        <property name="fileWorkflowBusinessRule" ref="fileWorkflowBusinessRule"/>
        <property name="changeCaseStatusTaskName" ref="changeCaseStatusTaskName"/>
        <property name="taskDao" ref="acmTaskDao"/>
    </bean>

    <bean id="checkChangeCaseFileState"
        class="com.armedia.acm.plugins.casefile.pipeline.presave.CheckChangeCaseFileState">
        <property name="caseFileDao" ref="caseFileDao"/>
    </bean>

    <bean id="changeCaseFileStateHandler"
        class="com.armedia.acm.plugins.casefile.pipeline.postsave.ChangeCaseFileStateHandler">
        <property name="userActionExecutor" ref="userActionExecutor"/>
        <property name="caseFileDao" ref="caseFileDao"/>
    </bean>

    <bean id="createTaskChangeCaseFileHandler"
        class="com.armedia.acm.plugins.casefile.pipeline.postsave.CreateTaskChangeCaseFileHandler">
        <property name="ecmFileDao" ref="ecmFileDao"/>
    </bean>

    <bean id="changeCaseFileStatusPipelineManager" class="com.armedia.acm.services.pipeline.PipelineManager">
        <property name="preSaveHandlers">
            <list value-type="com.armedia.acm.services.pipeline.handler.PipelineHandler">
                <ref bean="checkChangeCaseFileState"/>
            </list>
        </property>
        <property name="postSaveHandlers">
            <list>
                <ref bean="pdfChangeCaseFileStateDocumentGeneratorHandler"/>
                <ref bean="changeCaseFileStateHandler"/>
                <ref bean="createTaskChangeCaseFileHandler"/>
            </list>
        </property>
    </bean>

    <bean id="changeCaseFileStateService"
        class="com.armedia.acm.plugins.casefile.service.ChangeCaseFileStateService">
        <property name="caseFileEventUtility" ref="caseFileEventUtility"/>
        <property name="dao" ref="caseFileDao"/>
        <property name="changeCaseStatusDao" ref="changeCaseStatusDao"/>
        <property name="pipelineManager" ref="changeCaseFileStatusPipelineManager"/>
    </bean>

    <bean id="pdfChangeCaseFileStateDocumentGeneratorHandler"
        class="com.armedia.acm.plugins.casefile.pipeline.postsave.PDFChangeCaseFileStateDocumentGeneratorHandler"
        parent="pdfChangeCaseFileStateDocumentGenerator">
        <property name="pdfChangeCaseFileStateDocumentGenerator" ref="pdfChangeCaseFileStateDocumentGenerator"/>
        <property name="dao" ref="caseFileDao"/>
        <property name="formsTypeCheckService" ref="formsTypeCheckService"/>
    </bean>

    <bean id="caseFileToSolrTransformer" class="com.armedia.acm.plugins.casefile.service.CaseFileToSolrTransformer">
        <property name="userDao" ref="userJpaDao"/>
        <property name="caseFileDao" ref="caseFileDao"/>
        <property name="businessProcessDao" ref="businessProcessDao"/>
        <property name="searchAccessControlFields" ref="searchAccessControlFields"/>
        <property name="fileAclSolrUpdateHelper" ref="fileAclSolrUpdateHelper"/>
    </bean>

    <bean id="dispositionToSolrTransformer"
        class="com.armedia.acm.plugins.casefile.service.DispositionToSolrTransformer">
        <property name="dispositionDao" ref="dispositionDao"/>
    </bean>

    <bean id="acmCasePlugin" class="com.armedia.acm.pluginmanager.model.AcmPlugin">
        <property name="pluginName" value="ACM Case Files"/>
        <property name="pluginConfig" ref="caseConfig"/>
        <property name="suportedObjectTypesNames">
            <list>
                <value>CASE_FILE</value>
            </list>
        </property>
        <property name="configurationPropertyService" ref="configurationPropertyService"/>
    </bean>

    <!-- post-save handlers -->
    <bean id="caseFileEventHandler" class="com.armedia.acm.plugins.casefile.pipeline.postsave.CaseFileEventHandler">
        <property name="caseFileEventUtility" ref="caseFileEventUtility"/>
    </bean>

    <bean id="changeCaseStatusProcessEndListener"
        class="com.armedia.acm.plugins.casefile.service.ChangeCaseStatusProcessEndListener">
        <property name="changeCaseFileStateService" ref="changeCaseFileStateService"/>
    </bean>

    <bean id="caseFileHistoryListener" class="com.armedia.acm.plugins.casefile.service.CaseFileHistoryListener">
        <property name="acmObjectHistoryService" ref="acmObjectHistoryService"/>
        <property name="nonHistoryGeneratingEvents">
            <list>
                <value>com.armedia.acm.casefile.search</value>
                <value>com.armedia.acm.casefile.viewed</value>
            </list>
        </property>
    </bean>

    <bean id="changeCaseStatusOnBuckslipEventListener"
        class="com.armedia.acm.plugins.casefile.listener.ChangeCaseStatusOnBuckslipEventListener">
        <property name="caseFileDao" ref="caseFileDao"/>
    </bean>

    <bean id="caseFileBillingInvoiceCreatedHandler"
        class="com.armedia.acm.plugins.casefile.listener.CaseFileBillingInvoiceCreatedHandler">
        <property name="caseFileBillingInvoiceDocumentGenerator" ref="billingInvoiceDocumentGenerator"/>
        <property name="caseFileDao" ref="caseFileDao"/>
    </bean>

    <bean id="caseFileDataAccessUpdateLocator"
        class="com.armedia.acm.plugins.casefile.service.CaseFileDataAccessUpdateLocator">
        <property name="caseFileDao" ref="caseFileDao"/>
    </bean>

    <bean id="acmQueueNamesProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <!-- note: must leave "file:" at the start of the file name for spring 
            to be able to read the file; otherwise it will try to read from the classpath -->
        <property name="location" value="file:${user.home}/.arkcase/acm/queueNames.properties"/>
        <property name="ignoreResourceNotFound" value="true"/>
        <property name="localOverride" value="false"/>
        <property name="properties">
            <props/>
        </property>
    </bean>

    <bean id="queuePropertyFileChangeWatcher"
        class="com.armedia.acm.plugins.casefile.dao.QueuePropertyFileChangeWatcher">
        <property name="acmQueueDao" ref="acmQueueDao"/>
        <property name="txManager" ref="transactionManager"/>
        <property name="auditPropertyEntityAdapter" ref="auditPropertyEntityAdapter"/>
        <property name="queueNamesProperties" ref="acmQueueNamesProperties"/>
    </bean>

    <bean id="acmQueueService" class="com.armedia.acm.plugins.casefile.service.AcmQueueServiceImpl">
        <property name="acmQueueDao" ref="acmQueueDao"/>
    </bean>

    <bean id="queueToSolrTranformer" class="com.armedia.acm.plugins.casefile.service.QueueToSolrTransformer">
        <property name="acmQueueDao" ref="acmQueueDao"/>
        <property name="userDao" ref="userJpaDao"/>
    </bean>

    <bean id="caseFileNextPossibleQueuesBusinessRule"
        class="com.armedia.acm.plugins.casefile.service.CaseFileNextPossibleQueuesBusinessRule"
        parent="simpleStatelessSingleObjectRuleManager">
        <property name="ruleSpreadsheetFilename" value="drools-next-possible-queues-rules.xlsx"/>
    </bean>

    <bean id="leaveCurrentQueueBusinessRule"
        class="com.armedia.acm.plugins.casefile.service.LeaveCurrentQueueBusinessRule"
        parent="simpleStatelessSingleObjectRuleManager">
        <property name="ruleSpreadsheetFilename" value="drools-leave-current-queue-rules.xlsx"/>
    </bean>

    <bean id="enterQueueBusinessRule" class="com.armedia.acm.plugins.casefile.service.EnterQueueBusinessRule"
        parent="simpleStatelessSingleObjectRuleManager">
        <property name="ruleSpreadsheetFilename" value="drools-enter-queue-rules.xlsx"/>
    </bean>
    <bean id="systemConfigurationService" class="com.armedia.acm.plugins.casefile.service.SystemConfigurationService">

    </bean>

    <bean id="onLeaveQueueBusinessRule" class="com.armedia.acm.plugins.casefile.service.OnLeaveQueueBusinessRule"
        parent="simpleStatelessSingleObjectRuleManager">
        <property name="ruleSpreadsheetFilename" value="drools-on-leave-queue-rules.xlsx"/>
    </bean>

    <bean id="onEnterQueueBusinessRule" class="com.armedia.acm.plugins.casefile.service.OnEnterQueueBusinessRule"
        parent="simpleStatelessSingleObjectRuleManager">
        <property name="ruleSpreadsheetFilename" value="drools-on-enter-queue-rules.xlsx"/>
    </bean>

    <bean id="enqueueCaseFileService" class="com.armedia.acm.plugins.casefile.service.EnqueueCaseFileServiceImpl">
        <property name="caseFileDao" ref="caseFileDao"/>
        <property name="leaveCurrentQueueBusinessRule" ref="leaveCurrentQueueBusinessRule"/>
        <property name="caseFileNextPossibleQueuesBusinessRule" ref="caseFileNextPossibleQueuesBusinessRule"/>
        <property name="enterQueueBusinessRule" ref="enterQueueBusinessRule"/>
        <property name="onLeaveQueueBusinessRule" ref="onLeaveQueueBusinessRule"/>
        <property name="onEnterQueueBusinessRule" ref="onEnterQueueBusinessRule"/>
        <property name="queueService" ref="queueService"/>
        <property name="acmBpmnService" ref="processDefinitionManagementService"/>
        <property name="saveCaseFileBusinessRule" ref="saveCaseFileBusinessRule"/>
        <property name="acmObjectLockService" ref="objectLockService"/>
        <property name="systemConfigurationService" ref="systemConfigurationService"/>
        <property name="timesheetService" ref="timesheetService"/>
    </bean>

    <bean id="getCaseByNumberService" class="com.armedia.acm.plugins.casefile.service.GetCaseByNumberServiceImpl">
        <property name="caseFileDao" ref="caseFileDao"/>
    </bean>

    <bean id="acmCasesStateProvider" class="com.armedia.acm.plugins.casefile.state.AcmCasesStateProvider">
        <property name="caseFileDao" ref="caseFileDao"/>
    </bean>

    <bean id="caseFileTemplateModelProvider" class="com.armedia.acm.plugins.casefile.model.provider.CaseFileTemplateModelProvider">
    </bean>

    <bean id="caseConfig" class="com.armedia.acm.plugins.casefile.model.CaseFileConfig" scope="refresh">
        <aop:scoped-proxy/>
    </bean>

    <bean id="getCaseService" class="com.armedia.acm.plugins.casefile.service.GetCaseServiceImpl">
        <property name="caseFileDao" ref="caseFileDao"/>
    </bean>

    <bean id="caseFileTasksService" class="com.armedia.acm.plugins.casefile.service.CaseFileTasksServiceImpl">
        <property name="childDocumentsSearchService" ref="childDocumentsSearchService"/>
    </bean>

    <bean id="activeCaseFileByQueueService" class="com.armedia.acm.plugins.casefile.service.ActiveCaseFileByQueueServiceImpl">
        <property name="executeSolrQuery" ref="executeSolrQuery"/>
    </bean>

    <bean id="caseFileUpdatedNotifier" class="com.armedia.acm.plugins.casefile.service.CaseFileUpdatedNotifier">
        <property name="notificationService" ref="notificationService"/>
        <property name="caseFileDao" ref="caseFileDao"/>
        <property name="templateManager" ref="correspondenceTemplateManager"/>
    </bean>
</beans>
