/*
* 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.frontend.find.idol.export.service;
import com.autonomy.aci.client.services.AciErrorException;
import com.autonomy.aci.client.services.Processor;
import com.autonomy.aci.client.util.AciParameters;
import com.hp.autonomy.frontend.find.core.export.service.ExportFormat;
import com.hp.autonomy.frontend.find.core.export.service.PlatformDataExportService;
import com.hp.autonomy.frontend.find.core.export.service.PlatformDataExportStrategy;
import com.hp.autonomy.searchcomponents.core.config.FieldInfo;
import com.hp.autonomy.searchcomponents.core.search.QueryRequest;
import com.hp.autonomy.searchcomponents.idol.configuration.AciServiceRetriever;
import com.hp.autonomy.searchcomponents.idol.search.HavenSearchAciParameterHandler;
import com.hp.autonomy.searchcomponents.idol.search.IdolQueryRequest;
import com.hp.autonomy.types.requests.idol.actions.query.QueryActions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Collection;
import java.util.EnumMap;
import java.util.Map;
@Component
class IdolPlatformDataExportService implements PlatformDataExportService<IdolQueryRequest, AciErrorException> {
private final HavenSearchAciParameterHandler parameterHandler;
private final AciServiceRetriever aciServiceRetriever;
private final Map<ExportFormat, PlatformDataExportStrategy> exportStrategies;
@Autowired
public IdolPlatformDataExportService(final HavenSearchAciParameterHandler parameterHandler,
final AciServiceRetriever aciServiceRetriever,
final PlatformDataExportStrategy[] exportStrategies) {
this.parameterHandler = parameterHandler;
this.aciServiceRetriever = aciServiceRetriever;
this.exportStrategies = new EnumMap<>(ExportFormat.class);
for (final PlatformDataExportStrategy exportStrategy : exportStrategies) {
this.exportStrategies.put(exportStrategy.getExportFormat(), exportStrategy);
}
}
@Override
public void exportQueryResults(final OutputStream outputStream, final IdolQueryRequest queryRequest, final ExportFormat exportFormat, final Collection<String> selectedFieldIds, final long totalResults) throws AciErrorException, IOException {
final PlatformDataExportStrategy exportStrategy = exportStrategies.get(exportFormat);
final Collection<FieldInfo<?>> fieldNames = exportStrategy.getFieldNames(IdolMetadataNode.values(), selectedFieldIds);
exportStrategy.writeHeader(outputStream, fieldNames);
final Processor<Void> processor = new ExportQueryResponseProcessor(exportStrategy, outputStream, fieldNames, selectedFieldIds);
for (int i = 0; i < totalResults; i += PAGINATION_SIZE) {
final IdolQueryRequest paginatedQueryRequest = queryRequest.toBuilder()
.start(i + 1)
.maxResults(i + PAGINATION_SIZE)
.build();
final AciParameters aciParameters = getAciParameters(paginatedQueryRequest);
aciServiceRetriever.getAciService(paginatedQueryRequest.getQueryType()).executeAction(aciParameters, processor);
}
}
private AciParameters getAciParameters(final IdolQueryRequest queryRequest) {
final AciParameters aciParameters = new AciParameters(QueryActions.Query.name());
parameterHandler.addSearchRestrictions(aciParameters, queryRequest.getQueryRestrictions());
parameterHandler.addSearchOutputParameters(aciParameters, queryRequest);
if (queryRequest.getQueryType() != QueryRequest.QueryType.RAW) {
parameterHandler.addQmsParameters(aciParameters, queryRequest.getQueryRestrictions());
}
return aciParameters;
}
@Override
public Collection<ExportFormat> handlesFormats() {
return exportStrategies.keySet();
}
}