
com.hp.autonomy.searchcomponents.idol.beanconfiguration.HavenSearchIdolConfiguration Maven / Gradle / Ivy
/*
* Copyright 2015 Hewlett-Packard Development Company, L.P.
* Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License.
*/
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.hp.autonomy.types.idol.marshalling.Jaxb2ParsingConfiguration;
import com.hpe.bigdata.frontend.spring.authentication.AuthenticationInformationRetriever;
import com.hpe.bigdata.frontend.spring.authentication.SpringSecurityAuthenticationInformationRetriever;
import org.apache.commons.lang.BooleanUtils;
import org.apache.http.client.HttpClient;
import org.apache.http.config.SocketConfig;
import org.apache.http.impl.client.HttpClientBuilder;
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 = 90000;
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 SocketConfig socketConfig = SocketConfig.custom()
.setSoTimeout(httpSocketTimeout)
.build();
return HttpClientBuilder.create()
.setMaxConnPerRoute(maxConnectionsPerRoute)
.setMaxConnTotal(maxConnectionsTotal)
.setDefaultSocketConfig(socketConfig)
.build();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy