ConfigBuildStepProcessor.java

package io.vanillabp.integration.deployment.config;

import java.util.HashSet;
import java.util.List;
import java.util.stream.Collectors;

import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
import io.quarkus.deployment.Capabilities;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.ObjectSubstitutionBuildItem;
import io.vanillabp.integration.adapter.migration.config.MigrationAdapterProperties;
import io.vanillabp.integration.deployment.processservice.VanillaBpMigratableProcessServiceBuildItem;
import io.vanillabp.integration.deployment.workflowmodule.VanillaBpWorkflowModulesBuildItem;
import io.vanillabp.integration.deployment.workflowmodule.WorkflowModuleSpecificConfigBuilderBuildItem;
import io.vanillabp.integration.runtime.config.MigrationAdapterPropertiesRecorder;
import io.vanillabp.intergration.adapter.spi.MigratableProcessService;
import jakarta.enterprise.context.ApplicationScoped;

/**
 * VanillaBP extension build step processor, responsible for building {@link MigrationAdapterProperties} beans.
 */
public class ConfigBuildStepProcessor {

  /**
   * Validates properties given and builds the {@link MigrationAdapterProperties} object based on those properties.
   *
   * @param capabilities Capabilities of the projects all extensions available
   * @param processServicesProvidedByAdapters All {@link MigratableProcessService} beans provided by VanillaBP adapter extensions
   * @param configsBuilt The build item for workflow module configurations as a dependency for this build step
   * @param substitutionsProvided All object substitutions as a dependency for this build step
   * @param workflowModulesFound Information about all workflow modules found in the project
   * @param migrationAdapterPropertiesRecorder Recorder for {@link MigrationAdapterProperties} objects
   * @return The {@link MigrationAdapterProperties} object
   */
  @Record(ExecutionTime.STATIC_INIT)
  @BuildStep
  MigrationAdapterPropertiesBuildItem buildMigrationAdapterProperties(
      final Capabilities capabilities,
      final List<VanillaBpMigratableProcessServiceBuildItem> processServicesProvidedByAdapters,
      final WorkflowModuleSpecificConfigBuilderBuildItem configsBuilt,
      final List<ObjectSubstitutionBuildItem> substitutionsProvided,
      final VanillaBpWorkflowModulesBuildItem workflowModulesFound,
      final BuildProducer<SyntheticBeanBuildItem> syntheticBeanBuildItemBuildProducer,
      final MigrationAdapterPropertiesRecorder migrationAdapterPropertiesRecorder) {

    final var adapterTypesOfProcessServicesProvidedByAdapters = processServicesProvidedByAdapters
        .stream()
        .map(VanillaBpMigratableProcessServiceBuildItem::getAdapterType)
        .collect(Collectors.toCollection(HashSet::new)); // pass items to a serializable kind of set

    // check for consistent configuration
    final var migrationAdapterProperties = migrationAdapterPropertiesRecorder.recordMigrationProperties(
        new HashSet<>(capabilities.getCapabilities()), // pass items to a serializable kind of set
        new HashSet<>(workflowModulesFound.getWorkflowModules().keySet()), // pass items to a serializable kind of set
        adapterTypesOfProcessServicesProvidedByAdapters);

    // build properties as a CDI bean for injection into generated ProcessService beans
    syntheticBeanBuildItemBuildProducer
        .produce(
            SyntheticBeanBuildItem
                .configure(MigrationAdapterProperties.class)
                .scope(ApplicationScoped.class)
                .runtimeValue(migrationAdapterProperties)
                .setRuntimeInit()
                .done());

    return new MigrationAdapterPropertiesBuildItem(migrationAdapterProperties);

  }

}