<?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:cxf="http://cxf.apache.org/core"
       xmlns:jaxrs="http://cxf.apache.org/jaxrs"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
                           http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
                           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml" />

    <!-- JAXRS providers -->
    <bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" />
    
{{#useMultipartFeature}}       
    <bean id="multipartProvider" class="org.apache.cxf.jaxrs.provider.MultipartProvider" />
{{/useMultipartFeature}}    
    
    <!-- Controller -->
{{#useSpringAnnotationConfig}}  
    <context:annotation-config/>
    <context:component-scan base-package="{{apiPackage}}.impl" />
{{/useSpringAnnotationConfig}}
{{^useSpringAnnotationConfig}}    
{{#apiInfo}}
{{#apis}}
    <bean id="{{classname}}" class="{{package}}.impl.{{classname}}ServiceImpl" />
{{/apis}}
{{/apiInfo}}
{{/useSpringAnnotationConfig}}

{{#useSwaggerFeature}}  
    <!-- CXF Swagger2Feature -->
    {{! http://cxf.apache.org/docs/swagger2feature.html }}  
    <bean id="swagger2Feature" class="org.apache.cxf.jaxrs.swagger.Swagger2Feature">
        <!--property name="basePath" value="/services"/-->
{{#useSwaggerUI}}        
        <property name="supportSwaggerUi" value="true" />
{{/useSwaggerUI}}        
        <!--property name="contact" value="${swagger.contact}" />
        <property name="title" value="${swagger.title}" />
        <property name="version" value="${swagger.version}" />
        <property name="description" value="${swagger.description}" />
        <property name="license" value="${swagger.license}" />
        <property name="licenseUrl" value="${swagger.licenseUrl}" /-->
    </bean>       
{{/useSwaggerFeature}}

    <cxf:bus>
        <cxf:inInterceptors>
{{#useGzipFeature}}            
            <ref bean="GZIPInInterceptor"/>
{{/useGzipFeature}}
{{#useBeanValidationFeature}}                
            <!-- BeanValidation 1.1 for CXF -->
            <ref bean="validationInInterceptor" />
{{/useBeanValidationFeature}}            
        </cxf:inInterceptors>
        <cxf:outInterceptors>
{{#useGzipFeature}}            
            <ref bean="GZIPOutInterceptor"/>
{{/useGzipFeature}}            
{{#useBeanValidationFeature}}
            <!-- BeanValidation 1.1 for CXF -->
            <ref bean="validationOutInterceptor" />
{{/useBeanValidationFeature}}            
        </cxf:outInterceptors>
        <cxf:features>
{{#useLoggingFeature}}         
            <cxf:logging />
{{/useLoggingFeature}}  
{{#useGzipFeature}} 
            <ref bean="compressGZIPFeature"/>
{{/useGzipFeature}}      
        </cxf:features>
        <cxf:properties>
            <entry key="javax.ws.rs.ext.ExceptionMapper" value-ref="exceptionMapper"/>
        </cxf:properties>
    </cxf:bus>
    
{{#useWadlFeature}}     
    <bean id="wadlGenerator"
          class="org.apache.cxf.jaxrs.model.wadl.WadlGenerator">
        <property name="linkJsonToXmlSchema" value="true" />
    </bean>
{{/useWadlFeature}}

{{#useGzipFeature}} 
    <bean id="GZIPInInterceptor" class="org.apache.cxf.transport.common.gzip.GZIPInInterceptor"/>
    <bean id="GZIPOutInterceptor" class="org.apache.cxf.transport.common.gzip.GZIPOutInterceptor" >
        <!--property name="force" value="true" /-->
        <!--property name="threshold" value="0" /-->
    </bean>
    
    <bean id="compressGZIPFeature" class="org.apache.cxf.transport.common.gzip.GZIPFeature"/>
{{/useGzipFeature}}     

{{#useBeanValidationFeature}}
    <bean id="commonValidationFeature" class="org.apache.cxf.validation.BeanValidationFeature"/>
    <bean id="exceptionMapper" class="org.apache.cxf.jaxrs.validation.ValidationExceptionMapper"/>
    <bean id="validationProvider" class="org.apache.cxf.validation.BeanValidationProvider" />

    <bean id="validationInInterceptor" class="org.apache.cxf.jaxrs.validation.JAXRSBeanValidationInInterceptor">
        <property name="provider" ref="validationProvider" />
    </bean>
     
    <bean id="validationOutInterceptor" class="org.apache.cxf.jaxrs.validation.JAXRSBeanValidationOutInterceptor">
        <property name="provider" ref="validationProvider" />
    </bean>   
{{/useBeanValidationFeature}}
{{^useBeanValidationFeature}}
    <bean id="exceptionMapper" class="org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper">
        <property name="addMessageToResponse" value="true" />
    </bean>
{{/useBeanValidationFeature}}
    
    <!-- REST server -->
    <jaxrs:server id="restServer" address="/services">
        <jaxrs:serviceBeans>
{{#apiInfo}}
{{#apis}}
                <ref bean="{{classname}}" />
{{/apis}}
{{/apiInfo}}
        </jaxrs:serviceBeans>
        <jaxrs:providers>
            <ref bean="jsonProvider" />
{{#useMultipartFeature}}            
            <ref bean="multipartProvider" />
{{/useMultipartFeature}}            
{{#useWadlFeature}}            
            <ref bean="wadlGenerator" />
{{/useWadlFeature}}            
        </jaxrs:providers>
        <jaxrs:features>
{{#useSwaggerFeature}}          
            <ref bean="swagger2Feature" />
{{/useSwaggerFeature}}              
{{#useBeanValidationFeature}}            
            <ref bean="commonValidationFeature" />
{{/useBeanValidationFeature}}                        
        </jaxrs:features>
    </jaxrs:server>
     
</beans>
