SystemRepositoryCatalogBootstrapOrder.java

package com.taxonomy.workspace.service;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.core.Ordered;
import org.springframework.core.PriorityOrdered;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * Declares the startup dependency without coupling the catalogue module to the
 * workspace implementation type.
 */
@Component
public class SystemRepositoryCatalogBootstrapOrder
        implements BeanFactoryPostProcessor, PriorityOrdered {

    static final String TAXONOMY_SERVICE_BEAN = "taxonomyService";
    static final String CATALOG_INITIALIZER_BEAN =
            "systemRepositoryCatalogInitializer";

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
            throws BeansException {
        BeanDefinition taxonomyService =
                beanFactory.getBeanDefinition(TAXONOMY_SERVICE_BEAN);
        String[] currentDependencies = taxonomyService.getDependsOn();
        if (currentDependencies == null) {
            taxonomyService.setDependsOn(CATALOG_INITIALIZER_BEAN);
        } else if (Arrays.stream(currentDependencies)
                .noneMatch(CATALOG_INITIALIZER_BEAN::equals)) {
            String[] dependencies = Arrays.copyOf(
                    currentDependencies, currentDependencies.length + 1);
            dependencies[currentDependencies.length] = CATALOG_INITIALIZER_BEAN;
            taxonomyService.setDependsOn(dependencies);
        }
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}