<?xml version="1.0" encoding="UTF-8"?>
	<!--
		Copyright 2008 Federal Chancellery Austria and Graz University of
		Technology Licensed under the Apache License, Version 2.0 (the
		"License"); you may not use this file except in compliance with the
		License. You may obtain a copy of the License at
		http://www.apache.org/licenses/LICENSE-2.0 Unless required by
		applicable law or agreed to in writing, software distributed under the
		License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
		CONDITIONS OF ANY KIND, either express or implied. See the License for
		the specific language governing permissions and limitations under the
		License.
	-->
<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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

	<!-- configuration -->
	<bean id="configurationResource"
		class="org.springframework.web.context.support.ServletContextParameterFactoryBean">
		<property name="initParamName" value="configurationResource" />
	</bean>

	<bean id="configuration" class="at.gv.egiz.bku.spring.ConfigurationFactoryBean">
		<property name="configurationResource" ref="configurationResource" />
	</bean>

  <bean id="smccConfiguration" class="at.gv.egiz.bku.local.spring.SMCCConfigurationFactoryBean">
    <property name="configuration" ref="configuration"/>
  </bean>

  <bean id="readerFactory" class="at.gv.egiz.smcc.reader.ReaderFactory">
      <property name="configuration" ref="smccConfiguration"/>
  </bean>
  
  <bean id="sslPKIProfile" class="at.gv.egiz.bku.spring.PKIProfileFactoryBean">
    <property name="configuration" ref="configuration"/>
    <property name="trustProfileId" value="SSL"/>
  </bean>

  <bean id="sslSocketFactory" class="at.gv.egiz.bku.spring.SSLSocketFactoryBean">
    <property name="configuration" ref="configuration"/>
    <property name="pkiProfile" ref="sslPKIProfile"/>
  </bean>

  <bean id="hostnameVerifier" class="at.gv.egiz.bku.spring.ConfigurableHostnameVerifier">
    <property name="configuration" ref="configuration"/>
  </bean>
  
  <bean id="urlDereferencer" class="at.gv.egiz.bku.utils.urldereferencer.URLDereferencerImpl"
    factory-method="getInstance">
    <property name="SSLSocketFactory" ref="sslSocketFactory"/>
    <property name="hostnameVerifier" ref="hostnameVerifier"/>
  </bean>
  
	<!-- security manager for the command invoker -->
	<bean id="securityManager" class="at.gv.egiz.bku.spring.SecurityManagerFactoryBean">
		<property name="configuration" ref="configuration" />
	</bean>

	<!-- command invoker -->
	<bean id="slCommandInvoker" class="at.gv.egiz.bku.binding.SLCommandInvokerImpl">
		<property name="securityManager" ref="securityManager" />
	</bean>

	<!-- Security Layer command factory -->

	<bean id="abstractCommandFactory" class="at.gv.egiz.bku.slcommands.AbstractSLCommandFactory"
		abstract="true">
    <property name="configuration" ref="configuration"/>
  </bean>

	<bean id="certificatesInfoboxFactory"
		class="at.gv.egiz.bku.slcommands.impl.CertificatesInfoboxFactory" />
	<bean id="identityLinkInfoboxFactory"
		class="at.gv.egiz.bku.slcommands.impl.IdentityLinkInfoboxFactory">
		<property name="identityLinkTransformer">
		  <bean class="at.gv.egiz.idlink.IdentityLinkTransformer">
		    <property name="urlDereferencer" ref="urlDereferencer"/>
		  </bean>
		</property>
  </bean>
	<!-- not supported -->
	<!--
		<bean id="cardChannelInfoboxFactory"
		class="at.gv.egiz.bku.slcommands.impl.CardChannelInfoboxFactory" />
	-->
	<bean id="svPersonendatenInfoboxFactory"
		class="at.gv.egiz.bku.slcommands.impl.SVPersonendatenInfoboxFactory" />

	<bean id="infoboxFactory" class="at.gv.egiz.bku.slcommands.impl.InfoboxFactory">
		<property name="infoboxFactories">
			<map>
				<entry key="Certificates" value-ref="certificatesInfoboxFactory" />
				<entry key="IdentityLink" value-ref="identityLinkInfoboxFactory" />
				<!--
					<entry key="CardChannel" value-ref="cardChannelInfoboxFactory" />
				-->
				<entry key="SV-Personendaten" value-ref="svPersonendatenInfoboxFactory" />
			</map>
		</property>
	</bean>

	<bean id="nullOperationCommandFactory"
		class="at.gv.egiz.bku.slcommands.impl.NullOperationCommandFactory"
		parent="abstractCommandFactory" />
	<bean id="nullOperationRequest" class="javax.xml.namespace.QName">
		<constructor-arg
			value="http://www.buergerkarte.at/namespaces/securitylayer/1.2#" />
		<constructor-arg value="NullOperationRequest" />
	</bean>
	<bean id="infoboxReadCommandFactory"
		class="at.gv.egiz.bku.slcommands.impl.InfoboxReadCommandFactory"
		parent="abstractCommandFactory">
		<property name="infoboxFactory" ref="infoboxFactory" />
	</bean>
	<bean id="infoboxReadRequest" class="javax.xml.namespace.QName">
		<constructor-arg
			value="http://www.buergerkarte.at/namespaces/securitylayer/1.2#" />
		<constructor-arg value="InfoboxReadRequest" />
	</bean>
	<bean id="infoboxUpdateCommandFactory"
		class="at.gv.egiz.bku.slcommands.impl.InfoboxUpdateCommandFactory"
		parent="abstractCommandFactory">
		<property name="infoboxFactory" ref="infoboxFactory" />
	</bean>
	<bean id="infoboxUpdateRequest" class="javax.xml.namespace.QName">
		<constructor-arg
			value="http://www.buergerkarte.at/namespaces/securitylayer/1.2#" />
		<constructor-arg value="InfoboxUpdateRequest" />
	</bean>
	<bean id="createXMLSignatureCommandFactory"
		class="at.gv.egiz.bku.slcommands.impl.CreateXMLSignatureCommandFactory"
		parent="abstractCommandFactory" />
	<bean id="createXMLSignatureRequest" class="javax.xml.namespace.QName">
		<constructor-arg
			value="http://www.buergerkarte.at/namespaces/securitylayer/1.2#" />
		<constructor-arg value="CreateXMLSignatureRequest" />
	</bean>
	<bean id="getStatusCommandFactory" class="at.gv.egiz.bku.slcommands.impl.GetStatusCommandFactory"
		parent="abstractCommandFactory" />
	<bean id="getStatusRequest" class="javax.xml.namespace.QName">
		<constructor-arg
			value="http://www.buergerkarte.at/namespaces/securitylayer/1.2#" />
		<constructor-arg value="GetStatusRequest" />
	</bean>

	<bean id="slCommandFactory" class="at.gv.egiz.bku.slcommands.SLCommandFactory"
		factory-method="getInstance">
		<property name="concreteFactories">
			<map>
				<entry key-ref="nullOperationRequest" value-ref="nullOperationCommandFactory" />
				<entry key-ref="infoboxReadRequest" value-ref="infoboxReadCommandFactory" />
				<entry key-ref="infoboxUpdateRequest" value-ref="infoboxUpdateCommandFactory" />
				<entry key-ref="createXMLSignatureRequest" value-ref="createXMLSignatureCommandFactory" />
				<entry key-ref="getStatusRequest" value-ref="getStatusCommandFactory" />
			</map>
		</property>
	</bean>

	<!-- STAL factory -->
	<bean id="stalFactory" class="at.gv.egiz.bku.local.stal.ExclusiveAccessSTALFactory">
		<property name="stalFactory">
			<bean class="at.gv.egiz.bku.local.stal.LocalSTALFactory" scope="singleton">
				<property name="helpURL" value="http://localhost:3495/help/" />
				<property name="configuration" ref="configuration" />
			</bean>
		</property>
	</bean>

  <!-- binding processor factories -->
  <bean id="httpBindingProcessorFactory" class="at.gv.egiz.bku.binding.HTTPBindingProcessorFactory">
    <property name="configuration" ref="configuration" />
    <property name="urlDereferencer" ref="urlDereferencer" />
    <property name="sslSocketFactory" ref="sslSocketFactory" />
    <property name="hostnameVerifier" ref="hostnameVerifier" />
    <property name="slCommandFactory" ref="slCommandFactory" />
  </bean>

	<!-- binding processor manager -->
	<bean id="bindingProcessorManager" class="at.gv.egiz.bku.binding.BindingProcessorManagerImpl"
		scope="singleton">
    <property name="stalFactory" ref="stalFactory" />
    <property name="slCommandInvoker" ref="slCommandInvoker" />
    <property name="factories">
      <list>
        <ref bean="httpBindingProcessorFactory"/>
      </list>
    </property>
	</bean>

	<bean id="attributeExporter"
		class="org.springframework.web.context.support.ServletContextAttributeExporter">
		<property name="attributes">
			<map>
				<entry key="bindingProcessorManager">
					<ref bean="bindingProcessorManager" />
				</entry>
			</map>
		</property>
	</bean>
	
  <!-- Shutdown Event handler -->
  <bean id="shutdownHandler" class="at.gv.egiz.bku.spring.ShutdownHandler">
    <property name="bindingProcessorManager" ref="bindingProcessorManager" />
  </bean>

</beans>