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

com.hp.autonomy.searchcomponents.hod.databases.HodDatabasesServiceImpl 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.hod.databases;

import com.hp.autonomy.hod.client.api.resource.*;
import com.hp.autonomy.hod.client.api.textindex.IndexFlavor;
import com.hp.autonomy.hod.client.error.HodErrorException;
import com.hp.autonomy.searchcomponents.core.databases.DatabasesService;
import lombok.Data;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * HoD databases service implementation: retrieves private and public index information by querying HoD for content resources
 */
@Service(DatabasesService.DATABASES_SERVICE_BEAN_NAME)
class HodDatabasesServiceImpl implements HodDatabasesService {
    private final ResourcesService resourcesService;
    private final IndexFlavourService indexFlavourService;

    HodDatabasesServiceImpl(
            final ResourcesService resourcesService,
            final IndexFlavourService indexFlavourService
    ) {
        this.resourcesService = resourcesService;
        this.indexFlavourService = indexFlavourService;
    }

    @Override
    public Set getDatabases(final HodDatabasesRequest request) throws HodErrorException {
        final ListResourcesRequestBuilder builder = new ListResourcesRequestBuilder()
                .setTypes(Collections.singleton(ResourceType.TEXT_INDEX));

        final List resources = resourcesService.list(builder);
        final Map> partitioned = resources.stream().collect(Collectors.partitioningBy(isPublicIndex));
        final Collection flavouredPrivateResources = fetchFlavours(partitioned.get(false));

        final Stream privateDatabases = flavouredPrivateResources.stream()
                .filter(isContentFlavour)
                .map(databaseForResource.compose(FlavouredResource::getDetails));

        final Stream publicDatabases = request.isPublicIndexesEnabled()
                ? partitioned.get(true).stream().map(databaseForResource)
                : Stream.empty();

        return Stream.concat(privateDatabases, publicDatabases)
                .collect(Collectors.toCollection(TreeSet::new));
    }

    private Collection fetchFlavours(final Iterable detailsList) throws HodErrorException {
        final Collection flavouredResources = new LinkedList<>();

        for (final ResourceDetails details : detailsList) {
            final IndexFlavor indexFlavour = indexFlavourService.getIndexFlavour(details.getResource().getResourceUuid());
            flavouredResources.add(new FlavouredResource(details, indexFlavour));
        }

        return flavouredResources;
    }

    @Data
    private static class FlavouredResource {
        private final ResourceDetails details;
        private final IndexFlavor flavour;
    }

    private static final Predicate isContentFlavour = flavouredResource -> CONTENT_FLAVOURS.contains(flavouredResource.getFlavour());
    private static final Predicate isPublicIndex = details -> ResourceName.PUBLIC_INDEXES_DOMAIN.equals(details.getResource().getDomain());

    private static final Function databaseForResource = details -> {
        return Database.builder()
                .name(details.getResource().getName())
                .domain(details.getResource().getDomain())
                .displayName(details.getDisplayName())
                .isPublic(isPublicIndex.test(details))
                .build();
    };
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy