<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
    xmlns="http://www.springframework.org/schema/beans" xmlns:task="http://www.springframework.org/schema/task"
    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/util http://www.springframework.org/schema/util/spring-util-4.1.xsd
       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <bean id="outlookEventPublisher" class="com.armedia.acm.service.outlook.service.OutlookEventPublisher"/>

    <bean id="outlookService" class="com.armedia.acm.service.outlook.service.impl.OutlookServiceImpl">
        <property name="dao" ref="exchangeWebServicesOutlookDao"/>
        <property name="acmContainerDao" ref="acmContainerFolderDao"/>
        <property name="ecmFileService" ref="ecmFileService"/>
        <property name="outlookEventPublisher" ref="outlookEventPublisher"/>
        <property name="acmCryptoUtils" ref="acmCryptoUtils"/>
        <property name="outlookPasswordDao" ref="outlookPasswordDao"/>
        <property name="acmEmailContentGeneratorService" ref="acmEmailContentGeneratorService"/>
        <property name="folderCreatorDao" ref="outlookFolderCreatorDao"/>
        <property name="emailSenderConfigurationService" ref="emailSenderConfigurationService"/>
        <property name="defaultFolderAndFileConverter" ref="folderConverter"/>
        <property name="outlookConfig" ref="outlookConfig"/>
    </bean>

    <bean id="exchangeWebServicesOutlookDao" class="com.armedia.acm.service.outlook.dao.impl.ExchangeWebServicesOutlookDao">
        <property name="exchangeConfigurationService" ref="exchangeConfigurationService"/>
        <property name="outlookConfig" ref="outlookConfig"/>
        <property name="sortFields">
            <map>
                <entry key="subject" value-ref="propertyDefinitionSubject"/>
                <entry key="dateTimeCreated" value-ref="propertyDefinitionDateTimeCreated"/>
                <entry key="dateTimeReceived" value-ref="propertyDefinitionDateTimeReceived"/>
                <entry key="dateTimeSent" value-ref="propertyDefinitionDateTimeSent"/>
                <entry key="hasAttachments" value-ref="propertyDefinitionHasAttachments"/>
                <entry key="displayTo" value-ref="propertyDefinitionDisplayTo"/>
                <entry key="size" value-ref="propertyDefinitionSize"/>
                <entry key="dateTimeStart" value-ref="propertyDefinitionStart"/>
            </map>
        </property>
    </bean>

    <bean id="outlookPasswordDao" class="com.armedia.acm.service.outlook.dao.OutlookPasswordDao"/>

    <bean id="exchangeConfigurationService" class="com.armedia.acm.service.outlook.service.impl.ExchangeConfigurationServiceImpl">
        <property name="configurationPropertyService" ref="configurationPropertyService"/>
        <property name="outlookConfig" ref="outlookConfig"/>
    </bean>

    <bean id="outlookFolderCreatorDao" class="com.armedia.acm.service.outlook.dao.impl.JPAAcmOutlookFolderCreatorDao">
        <property name="cryptoUtils" ref="acmCryptoUtils"/>
        <property name="encryptionProperties" ref="acmEncryptablePropertyEncryptionProperties"/>
    </bean>

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

    <bean id="caseFileCalendarFolderHandler" class="com.armedia.acm.service.outlook.service.impl.CalendarFolderHandler">
        <property name="entityTypeForQuery" value="CaseFile"/>
        <property name="entityIdForQuery" value="id"/>
    </bean>

    <bean id="complaintCalendarFolderHandler" class="com.armedia.acm.service.outlook.service.impl.CalendarFolderHandler">
        <property name="entityTypeForQuery" value="Complaint"/>
        <property name="entityIdForQuery" value="complaintId"/>
    </bean>

    <bean id="outlookFolderRecreator" class="com.armedia.acm.service.outlook.service.impl.DefaultOutlookFolderRecreator">
        <property name="userDao" ref="userJpaDao"/>
        <property name="outlookFolderService" ref="outlookService"/>
        <property name="outlookConfig" ref="outlookConfig"/>
        <property name="folderHandlers">
            <map>
                <entry key="CASE_FILE" value-ref="caseFileCalendarFolderHandler"/>
                <entry key="COMPLAINT" value-ref="complaintCalendarFolderHandler"/>
            </map>
        </property>
    </bean>

    <bean id="outlookCalendarAdminServiceExtension" class="com.armedia.acm.service.outlook.service.impl.OutlookCalendarAdminService">
        <property name="extendedService" ref="propertyFileCalendarAdminService"/>
        <property name="recreateFoldersExecutor" ref="regenerateOutlookFoldersExecutor"/>
        <property name="verifierService" ref="calendarServiceProvider"/>
        <property name="cryptoUtils" ref="acmCryptoUtils"/>
        <property name="encryptionProperties" ref="acmEncryptablePropertyEncryptionProperties"/>
        <property name="outlookFolderCreatorDao" ref="outlookFolderCreatorDao"/>
        <property name="folderRecreator" ref="outlookFolderRecreator"/>
    </bean>

    <bean id="outlookRecreatableCalendarService" class="com.armedia.acm.service.outlook.service.impl.OutlookRecreatableCalendarServiceImpl">
        <property name="containerDao" ref="acmContainerFolderDao"/>
    </bean>

    <bean id="acmRecreateOutlookFoldersProgressNotifierMessageBuilder"
        class="com.armedia.acm.service.outlook.service.impl.AcmRecreateOutlookFoldersProgressNotifierMessageBuilder"/>

    <util:constant id="propertyDefinitionSubject"
        static-field="microsoft.exchange.webservices.data.core.service.schema.ItemSchema.Subject"/>
    <util:constant id="propertyDefinitionDateTimeCreated"
        static-field="microsoft.exchange.webservices.data.core.service.schema.ItemSchema.DateTimeCreated"/>
    <util:constant id="propertyDefinitionDateTimeReceived"
        static-field="microsoft.exchange.webservices.data.core.service.schema.ItemSchema.DateTimeReceived"/>
    <util:constant id="propertyDefinitionDateTimeSent"
        static-field="microsoft.exchange.webservices.data.core.service.schema.ItemSchema.DateTimeSent"/>
    <util:constant id="propertyDefinitionHasAttachments"
        static-field="microsoft.exchange.webservices.data.core.service.schema.ItemSchema.HasAttachments"/>
    <util:constant id="propertyDefinitionDisplayTo"
        static-field="microsoft.exchange.webservices.data.core.service.schema.ItemSchema.DisplayTo"/>
    <util:constant id="propertyDefinitionSize" static-field="microsoft.exchange.webservices.data.core.service.schema.ItemSchema.Size"/>
    <util:constant id="propertyDefinitionStart"
        static-field="microsoft.exchange.webservices.data.core.service.schema.AppointmentSchema.Start"/>

    <bean id="outlookConfig" class="com.armedia.acm.service.outlook.model.OutlookConfig" scope="refresh">
        <aop:scoped-proxy/>
    </bean>

</beans>