/*
* Copyright 2015-2017 Hewlett Packard Enterprise 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.frontend.find.hod.configuration;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import com.hp.autonomy.frontend.configuration.AbstractConfig;
import com.hp.autonomy.frontend.configuration.ConfigException;
import com.hp.autonomy.frontend.configuration.authentication.Authentication;
import com.hp.autonomy.frontend.configuration.passwords.PasswordsConfig;
import com.hp.autonomy.frontend.configuration.redis.RedisConfig;
import com.hp.autonomy.frontend.find.core.configuration.FindConfig;
import com.hp.autonomy.frontend.find.core.configuration.FindConfigBuilder;
import com.hp.autonomy.frontend.find.core.configuration.MapConfiguration;
import com.hp.autonomy.frontend.find.core.configuration.SavedSearchConfig;
import com.hp.autonomy.frontend.find.core.configuration.UiCustomization;
import com.hp.autonomy.frontend.find.core.configuration.export.ExportConfig;
import com.hp.autonomy.hod.client.api.authentication.ApiKey;
import com.hp.autonomy.hod.sso.HodSsoConfig;
import com.hp.autonomy.searchcomponents.core.config.FieldsInfo;
import com.hp.autonomy.searchcomponents.hod.configuration.HodSearchCapable;
import com.hp.autonomy.searchcomponents.hod.configuration.QueryManipulationConfig;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.jasypt.util.text.TextEncryptor;
import java.net.URL;
import java.util.Optional;
import java.util.Set;
@SuppressWarnings({"InstanceVariableOfConcreteClass", "DefaultAnnotationParam"})
@Data
@Builder(toBuilder = true)
@EqualsAndHashCode(callSuper = false)
@JsonDeserialize(builder = HodFindConfig.HodFindConfigBuilder.class)
public class HodFindConfig extends AbstractConfig<HodFindConfig> implements HodSearchCapable, PasswordsConfig<HodFindConfig>, HodSsoConfig, FindConfig<HodFindConfig, HodFindConfig.HodFindConfigBuilder> {
private static final String SECTION = "Hod Config";
private final Authentication<?> login;
private final HsodConfig hsod;
private final HodConfig hod;
private final QueryManipulationConfig queryManipulation;
private final Set<String> allowedOrigins;
private final RedisConfig redis;
private final FieldsInfo fieldsInfo;
private final MapConfiguration map;
private final UiCustomization uiCustomization;
private final Integer minScore;
private final Integer topicMapMaxResults;
private final ExportConfig export;
@JsonProperty("savedSearches")
private final SavedSearchConfig savedSearchConfig;
@SuppressWarnings("OverlyComplexMethod")
@Override
public HodFindConfig merge(final HodFindConfig config) {
return config != null ? builder()
.login(login == null ? config.login : login.merge(config.login))
.hod(hod == null ? config.hod : hod.merge(config.hod))
.allowedOrigins(allowedOrigins == null ? config.allowedOrigins : allowedOrigins)
.redis(redis == null ? config.redis : redis.merge(config.redis))
.queryManipulation(queryManipulation == null ? config.queryManipulation : queryManipulation.merge(config.queryManipulation))
.hsod(hsod == null ? config.hsod : hsod.merge(config.hsod))
.fieldsInfo(fieldsInfo == null ? config.fieldsInfo : fieldsInfo.merge(config.fieldsInfo))
.map(map == null ? config.map : map.merge(config.map))
.uiCustomization(uiCustomization == null ? config.uiCustomization : uiCustomization.merge(config.uiCustomization))
.savedSearchConfig(savedSearchConfig == null ? config.savedSearchConfig : savedSearchConfig.merge(config.savedSearchConfig))
.minScore(minScore == null ? config.minScore : minScore)
.topicMapMaxResults(topicMapMaxResults == null ? config.topicMapMaxResults : topicMapMaxResults)
.export(Optional.ofNullable(export).map(exportConfig -> exportConfig.merge(config.export)).orElse(config.export))
.build() : this;
}
@Override
public HodFindConfig withoutDefaultLogin() {
final HodFindConfigBuilder builder = toBuilder();
builder.login = builder.login.withoutDefaultLogin();
return builder.build();
}
@Override
public HodFindConfig generateDefaultLogin() {
final HodFindConfigBuilder builder = toBuilder();
builder.login = builder.login.generateDefaultLogin();
return builder.build();
}
@Override
public HodFindConfig withHashedPasswords() {
final HodFindConfigBuilder builder = toBuilder();
builder.login = builder.login.withHashedPasswords();
return builder.build();
}
@Override
public void basicValidate(final String section) throws ConfigException {
redis.basicValidate(SECTION);
queryManipulation.basicValidate(SECTION);
savedSearchConfig.basicValidate(SECTION);
if(map != null) {
map.basicValidate("map");
}
if(export != null) {
export.basicValidate(SECTION);
}
if(!"default".equalsIgnoreCase(login.getMethod())) {
login.basicValidate(SECTION);
}
}
@Override
public HodFindConfig withoutPasswords() {
final HodFindConfigBuilder builder = toBuilder();
builder.login = login.withoutPasswords();
return builder.build();
}
@Override
public HodFindConfig withEncryptedPasswords(final TextEncryptor encryptor) {
return this;
}
@Override
public HodFindConfig withDecryptedPasswords(final TextEncryptor encryptor) {
return this;
}
@Override
@JsonIgnore
public Authentication<?> getAuthentication() {
return login;
}
@Override
@JsonIgnore
public ApiKey getApiKey() {
return hod.getApiKey();
}
@Override
public URL getSsoUrl() {
return hod.getSsoPageGetUrl();
}
@SuppressWarnings("WeakerAccess")
@JsonPOJOBuilder(withPrefix = "")
public static class HodFindConfigBuilder implements FindConfigBuilder<HodFindConfig, HodFindConfigBuilder> {
@SuppressWarnings("unused")
@JsonProperty("savedSearches")
private SavedSearchConfig savedSearchConfig;
}
}