<?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:camel="http://camel.apache.org/schema/spring"
	xsi:schemaLocation="
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"
	xmlns:rep="http://altiuz.cl/reports">

	<bean id="keyAccessor" class="cl.altiuz.reports.RucKeyAccesor">
		<constructor-arg type="java.lang.String"
			value="/Users/gonzalovasquez/Documents/workspace/AltiuzReports2.0/xml-signer/clientcert.jks" />
		<constructor-arg type="java.lang.String" value="P4ssw0rd.1" />
	</bean>

	<bean id="keySelector" class="cl.altiuz.reports.X509KeySelector">
		<constructor-arg type="java.lang.String"
			value="/Users/gonzalovasquez/Documents/workspace/AltiuzReports2.0/xml-signer/clientcert.jks" />
		<constructor-arg type="java.lang.String" value="P4ssw0rd.1" />
	</bean>

	<!-- === Route(s) ==== -->
	<camel:camelContext id="
		camelContext ">

		<camel:dataFormats>
			<camel:base64 id="base64" lineSeparator="" />
		</camel:dataFormats>

		<camel:route id="ws">
			<camel:from
				uri="spring-ws:rootqname:{http://altiuz.cl/reports}signRequest?endpointMapping=#endpointMapping" />

			<camel:setBody>
				<camel:xpath resultType="java.lang.String">/rep:signRequest/rep:document/text()</camel:xpath>
			</camel:setBody>
			<camel:unmarshal ref="base64" />
			<camel:convertBodyTo type="org.w3c.dom.Document" />
			<camel:setHeader headerName="rootName">
				<camel:xpath resultType="java.lang.String">name(//*[@id='comprobante'])</camel:xpath>
			</camel:setHeader>
			<camel:log message="nodo raíz: ${in.header.rootName}" />

			<!-- TODO Mock claveAcceso -->
			<camel:choice>
				<camel:when>
					<camel:simple>
                    ${in.header.rootName} == 'factura'</camel:simple>
					<camel:log message="firmando factura" />
					<camel:to
						uri="xmlsecurity:sign://enveloped?keyAccessor=#keyAccessor&amp;parentLocalName=factura" />
					<camel:log message="${body}" />
					<camel:to uri="xmlsecurity:verify://enveloped?keySelector=#keySelector" />
				</camel:when>
				<camel:when>
					<camel:simple>
                    ${in.header.rootName} == 'notaDebito'</camel:simple>
					<camel:log message="firmando notaDebito" />
					<camel:to
						uri="xmlsecurity:sign://enveloped?keyAccessor=#keyAccessor&amp;parentLocalName=notaDebito" />
					<camel:log message="${body}" />
					<camel:to uri="xmlsecurity:verify://enveloped?keySelector=#keySelector" />
				</camel:when>
				<camel:when>
					<camel:simple>
                    ${in.header.rootName} == 'comprobanteRetencion'</camel:simple>
					<camel:log message="firmando factura" />
					<camel:to
						uri="xmlsecurity:sign://enveloped?keyAccessor=#keyAccessor&amp;parentLocalName=comprobanteRetencion" />
					<camel:log message="${body}" />
					<camel:to uri="xmlsecurity:verify://enveloped?keySelector=#keySelector" />
				</camel:when>
			</camel:choice>

			<!-- <camel:recipientList> <camel:simple>xmlsecurity:sign://enveloped?keyAccessor=#keyAccessor&amp;parentLocalName=${in.header.rootName}</camel:simple> 
				</camel:recipientList> -->

			<!-- <camel:to uri="xmlsecurity:verify://enveloped?keySelector=#keySelector" 
				/> -->
		</camel:route>

	</camel:camelContext>

	<bean id="uuidGenerator" class="org.apache.camel.impl.JavaUuidGenerator" />

	<!-- === Endpoint mapping ==== -->
	<bean id="endpointMapping"
		class="org.apache.camel.component.spring.ws.bean.CamelEndpointMapping">
		<property name="interceptors">
			<list>
				<ref bean="validatingInterceptor" />
				<ref bean="loggingInterceptor" />
			</list>
		</property>
	</bean>

	<!-- === Interceptors ==== -->
	<bean id="loggingInterceptor"
		class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor" />

	<bean id="validatingInterceptor"
		class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
		<property name="schema" value="/WEB-INF/sign.xsd" />
		<property name="validateRequest" value="true" />
		<property name="validateResponse" value="true" />
	</bean>

	<!-- === WSDL exposure ==== -->
	<bean id="sign"
		class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition">
		<property name="schema">
			<bean id="xsd" class="org.springframework.xml.xsd.SimpleXsdSchema">
				<property name="xsd" value="/WEB-INF/sign.xsd" />
			</bean>
		</property>
		<property name="portTypeName" value="sign" />
		<property name="locationUri" value="http://localhost:8080/reports-signer/sign" />
	</bean>

</beans>