
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