<?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:tx="http://www.springframework.org/schema/tx"
    xmlns:plugins="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
			http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/tx
			http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
			http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context-2.5.xsd">
      
    <plugins:annotation-config />
    
    <!--
        // Replaces ${...} with corresponding values found in 'location' property. A value
        // can be overridden by setting a corresponding system property.
    -->
    <bean id="propertyConfigurer"
        class="ch.systemsx.cisd.common.spring.ExposablePropertyPlaceholderConfigurer">
        <property name="location" value="file:etc/service.properties" />
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
        <property name="ignoreUnresolvablePlaceholders" value="true" />
    </bean>
    
    <bean id="configProperties" factory-bean="propertyConfigurer"   
        factory-method="getResolvedProps">
    </bean>
    
	<bean id="memory-monitor" class="ch.systemsx.cisd.common.monitoring.JMXMemoryMonitorSpringBean" />

    <bean id="data-set-path-infos-provider" class="ch.systemsx.cisd.openbis.dss.generic.server.DatabaseBasedDataSetPathInfoProvider"/>

	  <bean id="plugin-tasks" class="ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.PluginTaskInfoProvider"
        factory-method="create" />

	  <bean id="etl-lims-service" class="ch.systemsx.cisd.openbis.dss.generic.server.EncapsulatedOpenBISService"
	      factory-method="createOpenBisService">
	      <constructor-arg value="${server-url}"/>
	      <constructor-arg value="${server-timeout-in-minutes}"/>
	  </bean>
  
	  <bean id="general-information-service" class="ch.systemsx.cisd.openbis.dss.generic.server.EncapsulatedOpenBISService"
	      factory-method="createGeneralInformationService">
	      <constructor-arg value="${server-url}"/>
	      <constructor-arg value="${server-timeout-in-minutes}"/>
	  </bean>
	  
	  <bean id="sessionHolder" class="ch.systemsx.cisd.openbis.generic.shared.dto.OpenBISSessionHolder">
	      <property name="dataStoreCode" value="${data-store-server-code}"/>
	  </bean>
	  
	  <bean id="reauthenticateInterceptor" class="ch.systemsx.cisd.openbis.dss.generic.server.openbisauth.OpenBISAuthenticationInterceptor">
	        <constructor-arg ref="session-token-manager"/>
	        <constructor-arg ref="etl-lims-service"/>
	        <constructor-arg ref="plugin-tasks" />
	        <constructor-arg ref="sessionHolder" />
	        <property name="username" value="${username}"/>
	        <property name="password" value="${password}"/>
	        <property name="port" value="${port}"/>
	        <property name="useSSL" value="${use-ssl}"/>
	        <property name="downloadUrl" value="${download-url}"/>
	        <property name="timeoutInMinutes" value="${server-timeout-in-minutes}"/>
	  </bean>
	  
	  <bean id="reauthenticateAdvisor" class="ch.systemsx.cisd.openbis.dss.generic.server.openbisauth.OpenBISAuthenticationAdvisor">
	      <constructor-arg ref="reauthenticateInterceptor"/>
	  </bean>
   
    <bean id="openBIS-service" class="ch.systemsx.cisd.openbis.dss.generic.server.EncapsulatedOpenBISService">
       <constructor-arg ref="etl-lims-service"/>
       <constructor-arg ref="sessionHolder"/>
       <constructor-arg value="${download-url}"/>
       <property name="conversationClient" ref="data-store-service-conversation-client-manager"/>
    </bean>
    
    <bean id="search-service" class="ch.systemsx.cisd.etlserver.registrator.api.v1.impl.SearchService">
        <constructor-arg ref="openBIS-service"/>
    </bean>
    
    <bean id="authorization-service" class="ch.systemsx.cisd.etlserver.registrator.api.v1.impl.AuthorizationService">
        <constructor-arg ref="openBIS-service"/>
    </bean>
        
    <bean id="share-id-manager" class="ch.systemsx.cisd.openbis.dss.generic.server.ShareIdManager">
        <constructor-arg ref="openBIS-service"/>
        <constructor-arg value="86400"/>
    </bean>
    
    <bean id="data-store-service" class="ch.systemsx.cisd.openbis.dss.generic.server.DataStoreService">
        <constructor-arg ref="session-token-manager" />
        <constructor-arg>
            <bean class="ch.systemsx.cisd.common.mail.MailClientParameters">
                <property name="from" value="${mail.from}"/>
                <property name="smtpHost" value="${mail.smtp.host}"/>
                <property name="smtpUser" value="${mail.smtp.user}"/>
                <property name="smtpPassword" value="${mail.smtp.password}"/>
            </bean>
        </constructor-arg>
        <constructor-arg ref="plugin-tasks" />
        
        <property name="cifexAdminUserOrNull" value="${cifex-admin-username}" />
        <property name="cifexAdminPasswordOrNull" value="${cifex-admin-password}" />
        <property name="commandQueueDir" value="${commandqueue-dir}"/>
    </bean>
    
    <bean id="data-store-server"
        class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
        <property name="service" ref="data-store-service"/>
        <property name="serviceInterface" value="ch.systemsx.cisd.openbis.generic.shared.IDataStoreService" />
    </bean>
    
    <bean id="stream-repository" class="ch.systemsx.cisd.openbis.dss.generic.server.StreamRepository"> 
        <constructor-arg ref="config-provider" />
    </bean>
    
    <bean id="dss-service-rpc-generic" 
          class="ch.systemsx.cisd.openbis.dss.generic.server.api.v1.DssServiceRpcGeneric">
        <constructor-arg ref="openBIS-service" /> 
        <constructor-arg ref="plugin-tasks" />
        <property name="downloadUrl" value="${download-url}"/>
    </bean>
    
     <bean id="data-store-rpc-service-generic"
        class="com.marathon.util.spring.StreamSupportingHttpInvokerServiceExporter">
        <property name="service">
            <bean class="org.springframework.aop.framework.ProxyFactoryBean">
                <property name="proxyInterfaces">
                    <list>
                        <value>ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.authorization.IDssServiceRpcGenericInternal</value>
                    </list>
                </property>
                <property name="interceptorNames">
                    <list>
                        <value>rpc-authorization-advisor</value>
                    </list>
                </property>
                <property name="target" ref="dss-service-rpc-generic"/> 
            </bean>
        </property>
        <property name="serviceInterface" value="ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.IDssServiceRpcGeneric" />
    </bean>
    
    <bean id="rpc-name-server" class="ch.systemsx.cisd.openbis.common.api.server.RpcServiceNameServer" />
    
    <bean id="data-store-rpc-name-server"
        class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
        <property name="service" ref="rpc-name-server" />
        <property name="serviceInterface" value="ch.systemsx.cisd.common.api.IRpcServiceNameServer" />
    </bean>

    <!-- 
        // Service conversation client manager
    -->
    
    <bean id="data-store-service-conversation-client-manager" class="ch.systemsx.cisd.openbis.dss.generic.server.ServiceConversationClientManager">
        <property name="dataStoreCode" value="${data-store-server-code}" />
        <property name="applicationServerUrl" value="${server-url}" />
        <property name="applicationServerTimeout" value="${server-timeout-in-minutes}" />
    </bean>
    
    <bean id="data-store-service-conversation-client-manager-server" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
        <property name="service" ref="data-store-service-conversation-client-manager" />
        <property name="serviceInterface" value="ch.systemsx.cisd.openbis.common.conversation.manager.IServiceConversationClientManagerRemote" />
    </bean>

    <!-- 
        // Service conversation server manager
    -->
    
    <bean id="data-store-service-conversation-server-manager" class="ch.systemsx.cisd.openbis.dss.generic.server.ServiceConversationServerManager">
        <property name="dataStoreService" ref="data-store-service" />
        <property name="applicationServerUrl" value="${server-url}" />
        <property name="applicationServerTimeout" value="${server-timeout-in-minutes}" />
    </bean>
    
    <bean id="data-store-service-conversation-server-manager-server" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
        <property name="service" ref="data-store-service-conversation-server-manager" />
        <property name="serviceInterface" value="ch.systemsx.cisd.openbis.common.conversation.manager.IServiceConversationServerManagerRemote" />
    </bean>
    
    <bean id="session-token-manager" class="ch.systemsx.cisd.openbis.dss.generic.server.SessionTokenManager"/>
    
    <bean id="data-source-provider" class="ch.systemsx.cisd.openbis.dss.generic.shared.DataSourceProvider" />
    
    <bean id="config-provider" class="ch.systemsx.cisd.etlserver.ConfigProvider"/>

    <bean id="hierarchical-content-provider" 
        class="ch.systemsx.cisd.openbis.dss.generic.shared.HierarchicalContentProvider">
        <constructor-arg ref="openBIS-service" />
        <constructor-arg ref="share-id-manager" />
        <constructor-arg ref="config-provider" />
    </bean>

    <bean id="objectMapper" class="ch.systemsx.cisd.openbis.generic.shared.api.json.GenericObjectMapper">
    </bean>

    <!-- 
        // This discovers on-the-fly all <code>org.springframework.aop.Advisor</code> implementations.
    -->
    <bean id="bean-post-processor"
        class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
        
    <!-- 
        // Authorization
    -->

    <bean id="rpc-authorization-advisor" class="ch.systemsx.cisd.openbis.dss.generic.server.DssServiceRpcAuthorizationAdvisor" />

    <!-- 
        // Logging
    -->

    <bean class="ch.systemsx.cisd.openbis.common.spring.LogAdvisor" />
  
    <!-- 
        // FTP server
     -->
    
    <!-- Adapts the openBIS users for the FTP server -->
    <bean id="adapted-ftp-user-manager" class="ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpUserManager">
        <constructor-arg ref="etl-lims-service"/>
    </bean>

    <!-- 
        Optionally starts an FTP server.
    -->
    <bean id="ftp-server" class="ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpServer" destroy-method="stop">
        <constructor-arg ref="etl-lims-service"/>
        <constructor-arg ref="general-information-service"/>
        <constructor-arg ref="adapted-ftp-user-manager"/>
        <constructor-arg ref="configProperties" />
    </bean>
    
</beans>