<?xml version="1.0" encoding="UTF-8"?>
<!--
    The Admin Services Context contains the definitions that describe and export The Admin Services.
    Things such as RMI exports, SSL admin configuration are defined here.
 -->
<!--suppress PlaceholderValuesInspection -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/aop
                            http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- Enable aop automatic proxy generation for pointcuts -->
    <aop:config/>

    <!-- The presence of this bean indicates that admin services have been loaded -->
    <bean name="adminSubsystemPresent" class="java.lang.Object"/>

    <!-- the internal rmi/ssl trust failue handler that allows connection to self -->
    <bean id="clusterSslTrustFailureHandler"
          class="com.l7tech.gateway.common.spring.remoting.ssl.CertificateTrustedTrustFailureHandler">
        <constructor-arg ref="sslKeystoreCertificate"/>
    </bean>

    <bean id="clusterHttpRequestExecutor"
          class="com.l7tech.gateway.common.spring.remoting.http.SecureHttpComponentsHttpInvokerRequestExecutor">
        <constructor-arg>
            <ref bean="clusterHttpComponentsClient"/>
        </constructor-arg>
        <constructor-arg>
            <value>SecureSpan-Manager/3.6</value>
        </constructor-arg>
        <property name="defaultTrustFailureHandler" ref="clusterSslTrustFailureHandler"/>
    </bean>

    <bean id="clusterHttpComponentsClient" class="com.l7tech.gateway.common.spring.remoting.http.SecureHttpComponentsClient">
        <constructor-arg ref="sslKeyManagers"/>
    </bean>

    <!-- shared invoker properties, inherited with parent -->
    <bean id="clusterInvokerCommon" abstract="true"
          class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
        <property name="httpInvokerRequestExecutor">
            <ref bean="clusterHttpRequestExecutor"/>
        </property>
        <property name="codebaseUrl">
            <value>must not be empty</value>
        </property>
    </bean>

    <!-- cluster service impls -->
    <bean id="clusterLogAccessAdmin" class="com.l7tech.server.log.LogAccessAdminImpl"/>

    <!-- cluster context factory -->
    <bean id="clusterContextFactory" class="com.l7tech.server.cluster.ClusterContextFactory">
        <constructor-arg index="0">
            <list>
                <bean class="com.l7tech.gateway.common.spring.factory.config.LazyProxyFactoryBean">
                    <constructor-arg value="logAccessAdmin"/>
                    <constructor-arg value="com.l7tech.gateway.common.log.LogAccessAdmin"/>
                </bean>
            </list>
        </constructor-arg>
        <constructor-arg index="1">
            <bean class="com.l7tech.gateway.common.spring.factory.config.LazyProxyFactoryBean">
                <constructor-arg value="clusterHttpRequestExecutor"/>
                <constructor-arg value="com.l7tech.gateway.common.spring.remoting.http.ConfigurableHttpInvokerRequestExecutor"/>
            </bean>
        </constructor-arg>
        <constructor-arg index="2" value="ADMIN"/>
    </bean>

    <!-- cluster remoting clients -->
    <bean id="logAccessAdmin" parent="clusterInvokerCommon">
        <property name="serviceUrl" value="https://securespangateway/ssg/cluster/LogAccessAdmin"/>
        <property name="serviceInterface" value="com.l7tech.gateway.common.log.LogAccessAdmin"/>
    </bean>

    <bean id="remotingProvider" class="com.l7tech.server.admin.AdminRemotingProvider">
        <constructor-arg ref="licenseManager"/>
        <constructor-arg ref="adminSessionManager"/>
        <constructor-arg ref="clusterInfoManager"/>
        <constructor-arg ref="defaultKey"/>
    </bean>

    <!-- admin session tracker -->
    <bean id="adminSessionManager" class="com.l7tech.server.admin.AdminSessionManager">
        <constructor-arg index="0" ref="serverConfig"/>
        <constructor-arg index="1" ref="logonService"/>
        <constructor-arg index="2">
            <bean class="com.l7tech.server.util.ManagedTimer">
                <constructor-arg value="Adminstrator account maintenance"/>
            </bean>
        </constructor-arg>
        <constructor-arg index="3" ref="clusterMaster"/>
        <property name="identityProviderFactory" ref="identityProviderFactory"/>
        <property name="roleManager" ref="roleManager"/>
        <property name="passwordEnforcerManager" ref="passwordEnforcerManager"/>
        <property name="rbacServices" ref="rbacServices"/>
    </bean>

    <!--==============================================================-
    RBAC Enforcement and other interceptors
    -===============================================================-->

    <!-- This should not be an autowire candidate otherwise it will interfere with the server config -->
    <bean id="auditingThrowsAdviceSwitchedConfig" class="com.l7tech.util.SwitchedConfig" autowire-candidate="false">
        <constructor-arg index="0" ref="serverConfig"/>
        <constructor-arg index="1"> <!-- Properties to switch property -->
            <props>
                <prop key="audit.adminExceptions.defaultIncludes">audit.adminExceptions.auditPermissionDenied
                </prop>
                <prop key="audit.adminExceptions.includes">audit.adminExceptions.auditPermissionDenied</prop>
            </props>
        </constructor-arg>
        <constructor-arg index="2"> <!-- Overrides for switched properties when enabled -->
            <map>
                <entry key="audit.adminExceptions.defaultIncludes">
                    <value type="boolean">false</value>
                </entry>
                <entry key="audit.adminExceptions.includes">
                    <value type="java.lang.String">java.lang.Throwable
                        com.l7tech.gateway.common.security.rbac.PermissionDeniedException
                    </value>
                </entry>
            </map>
        </constructor-arg>
        <constructor-arg index="3"> <!-- Overrides for switched properties when disabled -->
            <map>
                <entry key="audit.adminExceptions.defaultIncludes">
                    <value type="boolean">false</value>
                </entry>
                <entry key="audit.adminExceptions.includes">
                    <value type="java.lang.String">java.lang.Throwable</value>
                </entry>
            </map>
        </constructor-arg>
    </bean>

    <!-- Exception advices for server side error handling -->
    <bean id="auditingThrowsAdvice" class="com.l7tech.server.util.AuditingThrowsAdvice"
          depends-on="applicationEventPublisher">
        <constructor-arg>
            <!-- lazy load the switched config here to avoid circular dependency issues and managers not properly getting wrapped bug: SSG-7547 -->
            <bean class="com.l7tech.gateway.common.spring.factory.config.LazyProxyFactoryBean">
                <constructor-arg value="auditingThrowsAdviceSwitchedConfig"/>
                <constructor-arg value="com.l7tech.util.Config"/>
            </bean>
        </constructor-arg>
    </bean>
    <bean id="auditingThrowsAdviceAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
        <property name="pointcut" ref="adminPointcut"/>
        <property name="advice" ref="auditingThrowsAdvice"/>
        <property name="order" value="5000"/>
    </bean>

    <bean id="mysqlFailureThrowsAdvice" class="com.l7tech.server.util.MySqlFailureThrowsAdvice"/>
    <bean id="mysqlFailureAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
        <property name="pointcut" ref="adminPointcut"/>
        <property name="advice" ref="mysqlFailureThrowsAdvice"/>
        <property name="order" value="5002"/>
    </bean>

    <bean id="constraintViolationThrowsAdvice" class="com.l7tech.server.util.ConstraintViolationThrowsAdvice"/>
    <bean id="constraintViolationAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
        <property name="pointcut" ref="adminPointcut"/>
        <property name="advice" ref="constraintViolationThrowsAdvice"/>
        <property name="order" value="5003"/>
    </bean>

    <!-- admin login helper for "internal" authentications -->
    <bean id="adminLoginHelper" class="com.l7tech.server.admin.AdminLoginHelper">
        <constructor-arg ref="adminSessionManager"/>
        <constructor-arg ref="serverConfig"/>
    </bean>


    <bean id="roleManagerHelper" class="com.l7tech.server.util.TypedMethodInvokingFactoryBean">
        <property name="targetClass" value="com.l7tech.server.security.rbac.RoleManagerImpl"/>
        <property name="targetMethod" value="setIdentitySource"/>
        <property name="arguments">
            <list>
                <ref bean="adminSessionManager"/>
            </list>
        </property>
    </bean>

    <!--==============================================================-
    Administration beans (admin intercepted)
    -===============================================================-->

    <!-- admin login servant -->
    <bean id="adminLogin" class="com.l7tech.server.admin.AdminLoginImpl">
        <constructor-arg ref="defaultKey"/>
        <constructor-arg ref="ssgKeyStoreManager"/>
        <constructor-arg ref="passwordHasher"/>
        <constructor-arg ref="secureRandom"/>
        <property name="identityProviderConfigManager" ref="identityProviderConfigManager"/>
        <property name="identityProviderFactory" ref='identityProviderFactory'/>
        <property name="adminSessionManager" ref="adminSessionManager"/>
        <property name="serverConfig" ref="serverConfig"/>
    </bean>

    <!-- identity admin servant -->
    <bean id="identityAdmin" class="com.l7tech.server.identity.IdentityAdminImpl">
        <constructor-arg index="0" ref="roleManager"/>
        <constructor-arg index="1" ref="passwordPolicyManger"/>
        <constructor-arg index="2" ref="passwordEnforcerManager"/>
        <constructor-arg index="3" ref="defaultKey"/>
        <constructor-arg index="4" ref="passwordHasher"/>
        <constructor-arg index="5">
            <list>
                <bean id="stigPolicyPair" class="com.l7tech.util.Pair">
                    <constructor-arg index="0">
                        <bean class="com.l7tech.gateway.common.admin.IdentityAdmin$AccountMinimums">
                            <constructor-arg index="0" value="STIG"/>
                            <constructor-arg index="1" value="5"/>
                            <constructor-arg index="2" value="20"/>
                            <constructor-arg index="3" value="-1"/>
                            <constructor-arg index="4" value="35"/>
                        </bean>
                    </constructor-arg>
                    <constructor-arg index="1" ref="stigPasswordPolicy"/>
                </bean>
                <bean id="pcidssPolicyPair" class="com.l7tech.util.Pair">
                    <constructor-arg index="0">
                        <bean class="com.l7tech.gateway.common.admin.IdentityAdmin$AccountMinimums">
                            <constructor-arg index="0" value="PCI-DSS"/>
                            <constructor-arg index="1" value="6"/>
                            <constructor-arg index="2" value="30"/>
                            <constructor-arg index="3" value="15"/>
                            <constructor-arg index="4" value="90"/>
                        </bean>
                    </constructor-arg>
                    <constructor-arg index="1" ref="pcidssPasswordPolicy"/>
                </bean>
            </list>
        </constructor-arg>
        <constructor-arg index="6" ref="ldapTemplateManager"/>
        <property name="identityProviderConfigManager" ref="identityProviderConfigManager"/>
        <property name="clientCertManager" ref="clientCertManager"/>
        <property name="identityProviderFactory" ref="identityProviderFactory"/>
        <property name="logonInfoManager" ref="logonManager"/>
    </bean>

    <!-- audit admin servant -->
    <bean id="auditAdmin" class="com.l7tech.server.audit.AuditAdminImpl">
        <property name="auditDownloadManager" ref="auditDownloadManager"/>
        <property name="auditRecordManager" ref="auditRecordManager"/>
        <property name="auditLookupPolicyEvaluator" ref="auditLookupPolicyEvaluator"/>
        <property name="securityFilter">
            <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
                <property name="targetObject" ref="rbacAdvice"/>
                <property name="targetMethod" value="getSecurityFilter"/>
            </bean>
        </property>
        <property name="serverConfig" ref="serverConfig"/>
        <property name="clusterPropertyManager" ref="clusterPropertyManager"/>
        <property name="auditArchiver" ref="auditArchiver"/>
        <property name="auditFilterPolicyManager" ref="auditFilterPolicyManager"/>
        <property name="keyAccessFilter" ref="keyAccessFilter"/>
        <property name="persistenceEventInterceptor" ref="persistenceEventInterceptor"/>
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <!-- service admin servant -->
    <bean id="serviceAdmin" class="com.l7tech.server.service.ServiceAdminImpl">
        <constructor-arg ref="licenseManager"/>
        <constructor-arg ref="uddiHelper"/>
        <constructor-arg ref="serviceManager"/>
        <constructor-arg ref="serviceAliasManager"/>
        <constructor-arg ref="serverPolicyValidator"/>
        <constructor-arg ref="sampleMessageManager"/>
        <constructor-arg ref="serviceDocumentManager"/>
        <constructor-arg ref="wspReader"/>
        <constructor-arg ref="uddiTemplateManager"/>
        <constructor-arg ref="policyVersionManager"/>
        <constructor-arg ref="serverConfig"/>
        <constructor-arg ref="serviceTemplateManager"/>
        <constructor-arg ref="serviceDocumentResolver"/>
        <constructor-arg ref="uddiRegistryAdmin"/>
        <constructor-arg ref="uddiServiceWsdlUpdateChecker"/>
        <constructor-arg ref="securityTokenServiceTemplateRegistry"/>
        <constructor-arg ref="serviceCache"/>
        <constructor-arg ref="resolutionConfigurationManager"/>
    </bean>

    <bean id="folderAdmin" class="com.l7tech.server.folder.FolderAdminImpl">
        <constructor-arg index="0" ref="folderManager"/>
        <constructor-arg index="1">
            <map>
                <entry key="com.l7tech.objectmodel.folder.Folder">
                    <ref bean="folderManager"/>
                </entry>
                <entry key="com.l7tech.policy.Policy">
                    <ref bean="policyManager"/>
                </entry>
                <entry key="com.l7tech.gateway.common.service.PublishedService">
                    <ref bean="serviceManager"/>
                </entry>
                <entry key="com.l7tech.policy.PolicyAlias">
                    <ref bean="policyAliasManager"/>
                </entry>
                <entry key="com.l7tech.gateway.common.service.PublishedServiceAlias">
                    <ref bean="serviceAliasManager"/>
                </entry>
            </map>
        </constructor-arg>
        <constructor-arg index="2" ref="rbacServices"/>
    </bean>

    <!-- resource admin implementation -->
    <bean id="resourceAdmin" class="com.l7tech.server.globalresources.ResourceAdminImpl">
        <constructor-arg index="0" ref="serverConfig"/>
        <constructor-arg index="1" ref="resourceEntryManager"/>
        <constructor-arg index="2" ref="defaultHttpProxyManager"/>
        <constructor-arg index="3" ref="httpConfigurationManager"/>
        <constructor-arg index="4" ref="serviceDocumentResolver"/>
        <constructor-arg index="5" ref="schemaResourceManager"/>
        <constructor-arg index="6">
            <map>
                <entry key="SOAP_1_1.xsd"
                       value="http://schemas.xmlsoap.org/soap/envelope/|http://schemas.xmlsoap.org/soap/envelope/"/>
                <entry key="SOAP_1_2.xsd"
                       value="http://www.w3.org/2003/05/soap-envelope/|http://www.w3.org/2003/05/soap-envelope"/>
                <entry key="/com/l7tech/common/resources/xml.xsd"
                       value="http://www.w3.org/2001/xml.xsd|http://www.w3.org/XML/1998/namespace"/>
                <entry key="/com/l7tech/common/resources/datatypes.dtd"
                       value="http://www.w3.org/2001/datatypes.dtd|datatypes"/>
                <entry key="/com/l7tech/common/resources/XMLSchema.dtd"
                       value="http://www.w3.org/2001/XMLSchema.dtd|-//W3C//DTD XMLSCHEMA 200102//EN"/>
            </map>
        </constructor-arg>
    </bean>

    <!-- jms admin servant -->
    <bean id="jmsAdmin" class="com.l7tech.server.transport.jms.JmsAdminImpl">
        <constructor-arg ref="jmsConnectionManager"/>
        <constructor-arg ref="jmsEndpointManager"/>
        <constructor-arg ref="jmsPropertyMapper"/>
        <constructor-arg ref="serverConfig"/>
    </bean>

    <!-- jdbc admin servant -->
    <bean id="jdbcAdmin" class="com.l7tech.server.jdbc.JdbcAdminImpl">
        <constructor-arg ref="jdbcConnectionManager"/>
        <constructor-arg ref="jdbcQueryingManager"/>
        <constructor-arg ref="jdbcConnectionPoolManager"/>
        <constructor-arg ref="serverConfig"/>
    </bean>

    <bean id="cassandraAdmin" class="com.l7tech.server.cassandra.CassandraConnectionManagerAdminImpl">
        <constructor-arg ref="cassandraEntityManager"/>
        <constructor-arg ref="rbacServices"/>
        <constructor-arg ref="cassandraConnectionManager"/>
        <constructor-arg ref="cassandraQueryManager"/>
    </bean>

    <!-- FTP admin servant -->
    <bean id="ftpAdmin" class="com.l7tech.server.transport.ftp.FtpAdminImpl">
        <constructor-arg ref="routingTrustManager"/>
        <constructor-arg ref="hostnameVerifier"/>
        <constructor-arg ref="defaultKey"/>
    </bean>

    <!-- trusted cert admin servant -->
    <bean id="trustedCertAdmin" class="com.l7tech.server.admin.TrustedCertAdminImpl">
        <constructor-arg ref="trustedCertManager"/>
        <constructor-arg ref="revocationCheckPolicyManager"/>
        <constructor-arg ref="defaultKey"/>
        <constructor-arg ref="licenseManager"/>
        <constructor-arg ref="ssgKeyStoreManager"/>
        <constructor-arg ref="ssgKeyMetadataManager"/>
        <constructor-arg ref="securePasswordManager"/>
        <constructor-arg ref="clusterPropertyManager"/>
        <constructor-arg ref="certValidationProcessor"/>
        <constructor-arg ref="serverConfig"/>
    </bean>

    <bean id="transportAdmin" class="com.l7tech.server.transport.TransportAdminImpl">
        <constructor-arg ref="ssgActiveConnectorManager"/>
        <constructor-arg ref="ssgConnectorManager"/>
        <constructor-arg ref="ssgFirewallRuleManager"/>
        <constructor-arg ref="resolutionConfigurationManager"/>
        <constructor-arg ref="defaultKey"/>
        <constructor-arg ref="serverConfig"/>
    </bean>

    <bean id="emailListenerAdmin" class="com.l7tech.server.transport.email.EmailListenerAdminImpl">
        <constructor-arg ref="emailListenerManager"/>
        <constructor-arg ref="clusterNodeId"/>
    </bean>

    <!-- kerberos admin servant -->
    <bean id="kerberosAdmin" class="com.l7tech.server.KerberosAdminImpl">
        <constructor-arg ref="clusterPropertyManager"/>
        <constructor-arg ref="dbPasswordEncryption"/>
    </bean>

    <!-- trusted cert admin servant -->
    <bean id="clusterStatusAdmin" class="com.l7tech.server.cluster.ClusterStatusAdminImp">
        <constructor-arg ref="clusterInfoManager"/>
        <constructor-arg ref="serviceUsageManager"/>
        <constructor-arg ref="clusterPropertyManager"/>
        <constructor-arg ref="licenseManager"/>
        <constructor-arg ref="serviceMetricsManager"/>
        <constructor-arg ref="serviceMetricsServices"/>
        <constructor-arg ref="serverConfig"/>
        <constructor-arg ref="assertionRegistry"/>
        <constructor-arg ref="rbacServices"/>
        <constructor-arg ref="extensionInterfaceManager"/>
        <constructor-arg ref="dateTimeConfigUtils"/>
    </bean>

    <!-- RBAC admin impl -->
    <bean id="rbacAdmin" class="com.l7tech.server.security.rbac.RbacAdminImpl">
        <constructor-arg ref="roleManager"/>
    </bean>

    <!-- Policy admin impl -->
    <bean id="policyAdmin" class="com.l7tech.server.policy.PolicyAdminImpl">
        <constructor-arg ref="policyManager"/>
        <constructor-arg ref="policyAliasManager"/>
        <constructor-arg ref="policyCache"/>
        <constructor-arg ref="policyVersionManager"/>
        <constructor-arg ref="serviceManager"/>
        <constructor-arg ref="clusterPropertyManager"/>
        <constructor-arg ref="policyExporterImporterManager"/>
        <constructor-arg ref="rbacServices"/>
        <constructor-arg ref="licenseManager"/>
        <constructor-arg ref="defaultKey"/>
        <property name="serverConfig" ref="serverConfig"/>
    </bean>

    <bean id="logSinkAdmin" class="com.l7tech.server.log.LogSinkAdminImpl">
        <constructor-arg ref="sinkManager"/>
    </bean>

    <!-- UDDI Registry admin servant -->
    <bean id="uddiRegistryAdmin" class="com.l7tech.server.uddi.UDDIRegistryAdminImpl">
        <constructor-arg ref="uddiRegistryManager"/>
        <constructor-arg ref="uddiHelper"/>
        <constructor-arg ref="uddiServiceControlManager"/>
        <constructor-arg ref="uddiCoordinator"/>
        <constructor-arg ref="serviceCache"/>
        <constructor-arg ref="uddiProxiedServiceInfoManager"/>
        <constructor-arg ref="uddiPublishStatusManager"/>
        <constructor-arg ref="uddiServiceControlMonitorRuntimeManager"/>
        <constructor-arg ref="uddiBusinessServiceStatusManager"/>
        <constructor-arg ref="serviceManager"/>
    </bean>

    <!-- Encapsulated assertion admin impl -->
    <bean id="encapsulatedAssertionAdmin" class="com.l7tech.server.encass.EncapsulatedAssertionAdminImpl">
    </bean>

    <bean id="policyBackedServiceAdmin" class="com.l7tech.server.polback.PolicyBackedServiceAdminImpl">
    </bean>

    <!-- jdbc admin servant -->
    <bean id="siteMinderAdmin" class="com.l7tech.server.siteminder.SiteMinderAdminImpl">
        <constructor-arg ref="extensionInterfaceManager"/>
    </bean>

    <!-- Custom key value store admin impl -->
    <bean id="customKeyValueStoreAdmin" class="com.l7tech.server.store.CustomKeyValueStoreAdminImpl">

    </bean>

    <!-- Policy debug admin impl -->
    <bean id="debugAdmin" class="com.l7tech.server.stepdebug.DebugAdminImpl">

    </bean>

    <!-- scheduled task admin impl -->
    <bean id="scheduledTaskAdmin" class="com.l7tech.server.task.ScheduledTaskAdminImpl"/>

    <!-- Solution kit admin imple -->
    <bean id="solutionKitAdmin" class="com.l7tech.server.solutionkit.SolutionKitAdminImpl"/>

    <!-- SignatureVerifier admin impl -->
    <bean id="trustedSignerCertsAdmin" class="com.l7tech.server.security.signer.TrustedSignerCertsAdminImpl"/>

</beans>