All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hp.autonomy.searchcomponents.idol.beanconfiguration.HavenSearchIdolConfiguration Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2015-2018 Open Text.
 *
 * Licensed under the MIT License (the "License"); you may not use this file
 * except in compliance with the License.
 *
 * The only warranties for products and services of Open Text and its affiliates
 * and licensors ("Open Text") are as may be set forth in the express warranty
 * statements accompanying such products and services. Nothing herein should be
 * construed as constituting an additional warranty. Open Text shall not be
 * liable for technical or editorial errors or omissions contained herein. The
 * information contained herein is subject to change without notice.
 */

package com.hp.autonomy.searchcomponents.idol.beanconfiguration;

import com.autonomy.aci.client.annotations.IdolAnnotationsProcessorFactory;
import com.autonomy.aci.client.annotations.IdolAnnotationsProcessorFactoryImpl;
import com.autonomy.aci.client.services.AciService;
import com.autonomy.aci.client.services.impl.AciServiceImpl;
import com.autonomy.aci.client.transport.AciHttpClient;
import com.autonomy.aci.client.transport.AciServerDetails;
import com.autonomy.aci.client.transport.impl.AciHttpClientImpl;
import com.hp.autonomy.frontend.configuration.ConfigService;
import com.hp.autonomy.frontend.configuration.aci.AbstractConfigurableAciService;
import com.hp.autonomy.frontend.configuration.authentication.CommunityPrincipal;
import com.hp.autonomy.searchcomponents.idol.answer.configuration.AnswerServerConfig;
import com.hp.autonomy.searchcomponents.idol.configuration.IdolSearchCapable;
import com.hp.autonomy.searchcomponents.idol.configuration.QueryManipulation;
import com.hpe.bigdata.frontend.spring.authentication.AuthenticationInformationRetriever;
import com.hpe.bigdata.frontend.spring.authentication.SpringSecurityAuthenticationInformationRetriever;
import com.opentext.idol.types.marshalling.Jaxb2ParsingConfiguration;
import org.apache.commons.lang.BooleanUtils;
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.core5.http.io.SocketConfig;
import org.apache.hc.core5.util.Timeout;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;

/**
 * Defines Spring beans required for using this module
 *
 * @param  application config type
 */
@SuppressWarnings("WeakerAccess")
@Configuration
@ComponentScan({"com.hp.autonomy.searchcomponents.core", "com.hp.autonomy.searchcomponents.idol"})
@Import(Jaxb2ParsingConfiguration.class)
public class HavenSearchIdolConfiguration {
    /**
     * The bean name of the root {@link AciService} used for all standard interactions with Idol.
     * Use this in an {@link Qualifier} tag to access this implementation via autowiring.
     */
    public static final String ACI_SERVICE_BEAN_NAME = "aciService";

    /**
     * The bean name of the root {@link AciService} used for queries against Content.
     * Use this in an {@link Qualifier} tag to access this implementation via autowiring.
     */
    public static final String CONTENT_ACI_SERVICE_BEAN_NAME = "contentAciService";

    /**
     * The bean name of the root {@link AciService} used for queries against QMS.
     * Use this in an {@link Qualifier} tag to access this implementation via autowiring.
     */
    public static final String QMS_ACI_SERVICE_BEAN_NAME = "qmsAciService";

    /**
     * The bean name of the root {@link AciService} used for queries against ViewServer.
     * Use this in an {@link Qualifier} tag to access this implementation via autowiring.
     */
    public static final String VIEW_ACI_SERVICE_BEAN_NAME = "viewAciService";

    /**
     * The bean name of the root {@link AciService} used for queries against AnswerServer.
     * Use this in an {@link Qualifier} tag to access this implementation via autowiring.
     */
    public static final String ANSWER_SERVER_ACI_SERVICE_BEAN_NAME = "answerServerAciService";

    /**
     * The bean name of the root {@link AciService} used for Idol validation checks.
     * Use this in an {@link Qualifier} tag to access this implementation via autowiring.
     */
    public static final String VALIDATOR_ACI_SERVICE_BEAN_NAME = "validatorAciService";

    /**
     * The bean name of the aci http client used for all standard interactions with Idol.
     * Use this in an {@link Qualifier} tag to access this implementation via autowiring.
     */
    public static final String ACI_HTTP_CLIENT_BEAN_NAME = "aciHttpClient";

    /**
     * The bean name of the aci http client used for Idol validation checks.
     * Use this in an {@link Qualifier} tag to access this implementation via autowiring.
     */
    public static final String VALIDATOR_ACI_HTTP_CLIENT_BEAN_NAME = "validatorAciHttpClient";

    /**
     * The bean name of the http client settings used for all standard interactions with Idol.
     * Use this in an {@link Qualifier} tag to access this implementation via autowiring.
     */
    public static final String HTTP_CLIENT_BEAN_NAME = "httpClient";

    /**
     * The bean name of the http client settings used for Idol validation checks.
     * Use this in an {@link Qualifier} tag to access this implementation via autowiring.
     */
    public static final String VALIDATOR_HTTP_CLIENT_BEAN_NAME = "validatorHttpClient";

    private static final int HTTP_SOCKET_TIMEOUT = 180000;
    private static final int HTTP_MAX_CONNECTIONS_PER_ROUTE = 20;
    private static final int HTTP_MAX_CONNECTIONS_TOTAL = 120;
    private static final int VALIDATOR_HTTP_SOCKET_TIMEOUT = 2000;
    private static final int VALIDATOR_HTTP_MAX_CONNECTIONS_PER_ROUTE = 5;
    private static final int VALIDATOR_HTTP_MAX_CONNECTIONS_TOTAL = 5;

    @Bean
    @ConditionalOnMissingBean(AuthenticationInformationRetriever.class)
    public AuthenticationInformationRetriever authenticationInformationRetriever() {
        return new SpringSecurityAuthenticationInformationRetriever<>(UsernamePasswordAuthenticationToken.class, CommunityPrincipal.class);
    }

    @Bean
    @ConditionalOnMissingBean(IdolAnnotationsProcessorFactory.class)
    public IdolAnnotationsProcessorFactory annotationsProcessorFactory() {
        return new IdolAnnotationsProcessorFactoryImpl();
    }


    @Bean
    @ConditionalOnMissingBean(name = CONTENT_ACI_SERVICE_BEAN_NAME)
    public AciService contentAciService(@Qualifier(ACI_SERVICE_BEAN_NAME)
                                        final AciService aciService,
                                        final ConfigService configService) {
        return new AbstractConfigurableAciService(aciService) {
            @Override
            public AciServerDetails getServerDetails() {
                return configService.getConfig().getContentAciServerDetails();
            }
        };
    }

    @Bean
    @ConditionalOnMissingBean(name = QMS_ACI_SERVICE_BEAN_NAME)
    public AciService qmsAciService(@Qualifier(ACI_SERVICE_BEAN_NAME)
                                    final AciService aciService,
                                    final ConfigService configService) {
        return new AbstractConfigurableAciService(aciService) {
            @Override
            public AciServerDetails getServerDetails() {
                final QueryManipulation queryManipulation = configService.getConfig().getQueryManipulation();
                return queryManipulation != null ? queryManipulation.getServer().toAciServerDetails() : null;
            }
        };
    }

    @Bean
    @ConditionalOnMissingBean(name = VIEW_ACI_SERVICE_BEAN_NAME)
    public AciService viewAciService(@Qualifier(ACI_SERVICE_BEAN_NAME)
                                     final AciService aciService,
                                     final ConfigService configService) {
        return new AbstractConfigurableAciService(aciService) {
            @Override
            public AciServerDetails getServerDetails() {
                return configService.getConfig().getViewConfig().toAciServerDetails();
            }
        };
    }

    @Bean
    @ConditionalOnMissingBean(name = ANSWER_SERVER_ACI_SERVICE_BEAN_NAME)
    public AciService answerServerAciService(@Qualifier(ACI_SERVICE_BEAN_NAME)
                                           final AciService aciService,
                                           final ConfigService configService) {
        return new AbstractConfigurableAciService(aciService) {
            @Override
            public AciServerDetails getServerDetails() {
                final AnswerServerConfig answerServerConfig = configService.getConfig().getAnswerServer();
                if (answerServerConfig == null || BooleanUtils.isFalse(answerServerConfig.getEnabled())) {
                    throw new IllegalStateException("Attempted to contact AnswerServer but AnswerServer is not configured");
                }

                return answerServerConfig.toAciServerDetails();
            }
        };
    }

    @Bean
    @ConditionalOnMissingBean(name = ACI_SERVICE_BEAN_NAME)
    public AciService aciService(final AciHttpClient aciHttpClient) {
        return new AciServiceImpl(aciHttpClient);
    }

    @Bean
    @ConditionalOnMissingBean(name = VALIDATOR_ACI_SERVICE_BEAN_NAME)
    public AciService validatorAciService(final AciHttpClient validatorAciHttpClient) {
        return new AciServiceImpl(validatorAciHttpClient);
    }

    @Bean
    @ConditionalOnMissingBean(name = ACI_HTTP_CLIENT_BEAN_NAME)
    public AciHttpClient aciHttpClient(final HttpClient httpClient) {
        return new AciHttpClientImpl(httpClient);
    }

    @Bean
    @ConditionalOnMissingBean(name = VALIDATOR_ACI_HTTP_CLIENT_BEAN_NAME)
    public AciHttpClient validatorAciHttpClient(final HttpClient validatorHttpClient) {
        return new AciHttpClientImpl(validatorHttpClient);
    }

    @Bean
    @ConditionalOnMissingBean(name = HTTP_CLIENT_BEAN_NAME)
    public HttpClient httpClient() {
        return createHttpClient(HTTP_SOCKET_TIMEOUT, HTTP_MAX_CONNECTIONS_PER_ROUTE, HTTP_MAX_CONNECTIONS_TOTAL);
    }

    @Bean
    @ConditionalOnMissingBean(name = VALIDATOR_HTTP_CLIENT_BEAN_NAME)
    public HttpClient validatorHttpClient() {
        return createHttpClient(VALIDATOR_HTTP_SOCKET_TIMEOUT, VALIDATOR_HTTP_MAX_CONNECTIONS_PER_ROUTE, VALIDATOR_HTTP_MAX_CONNECTIONS_TOTAL);
    }

    private HttpClient createHttpClient(final int httpSocketTimeout, final int maxConnectionsPerRoute, final int maxConnectionsTotal) {
        final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        connectionManager.setMaxTotal(maxConnectionsTotal);
        connectionManager.setDefaultMaxPerRoute(maxConnectionsPerRoute);

        connectionManager.setDefaultSocketConfig(SocketConfig.custom()
                .setSoTimeout(Timeout.ofMilliseconds(httpSocketTimeout))
                .build());

        return HttpClients.custom().setConnectionManager(connectionManager).build();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy