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

org.cloudfoundry.multiapps.controller.process.util.ModuleDependencyChecker Maven / Gradle / Ivy

package org.cloudfoundry.multiapps.controller.process.util;

import java.text.MessageFormat;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import org.cloudfoundry.multiapps.controller.core.Messages;
import org.cloudfoundry.multiapps.controller.core.helpers.ModuleToDeployHelper;
import org.cloudfoundry.multiapps.controller.core.util.UserMessageLogger;
import org.cloudfoundry.multiapps.mta.model.Module;

import com.sap.cloudfoundry.client.facade.CloudControllerClient;
import com.sap.cloudfoundry.client.facade.CloudOperationException;

public class ModuleDependencyChecker {

    private final Map allModulesInDescriptorWithNames;
    private final Set modulesForDeployment;
    private final Set modulesNotForDeployment;
    private final Set modulesAlreadyDeployed;
    private final CloudControllerClient client;
    private final ModuleToDeployHelper moduleToDeployHelper;
    private final UserMessageLogger userMessageLogger;

    public ModuleDependencyChecker(CloudControllerClient client, UserMessageLogger userMessageLogger,
                                   ModuleToDeployHelper moduleToDeployHelper, List allModulesInDescriptor,
                                   List allModulesToDeploy, List completedModules) {
        this.client = client;
        this.userMessageLogger = userMessageLogger;
        this.moduleToDeployHelper = moduleToDeployHelper;
        allModulesInDescriptorWithNames = computeAllModulesMap(allModulesInDescriptor);
        modulesForDeployment = computeModules(allModulesToDeploy);
        modulesAlreadyDeployed = computeModules(completedModules);
        modulesNotForDeployment = computeModules(allModulesInDescriptor, module -> !modulesForDeployment.contains(module));
    }

    private Map computeAllModulesMap(List allModules) {
        return allModules.stream()
                         .collect(Collectors.toMap(Module::getName, Function.identity()));
    }

    private Set computeModules(List modules) {
        return computeModules(modules, m -> true);
    }

    private Set computeModules(List modules, Predicate filterFunction) {
        return modules.stream()
                      .map(Module::getName)
                      .filter(filterFunction)
                      .collect(Collectors.toSet());
    }

    public boolean areAllDependenciesSatisfied(Module module) {
        if (module.getMajorSchemaVersion() < 3) {
            return true;
        }
        return module.getDeployedAfter()
                     .isEmpty()
            || areDependenciesProcessed(module) || areAllDependenciesAlreadyPresent(module);
    }

    private boolean areAllDependenciesAlreadyPresent(Module module) {
        boolean allModulesFoundInSpace = module.getDeployedAfter()
                                               .stream()
                                               .allMatch(dependency -> isDependencyPresent(module.getName(), dependency));
        List modulesNotYetDeployed = module.getDeployedAfter().stream()
                                                                      .filter(modulesForDeployment::contains)
                                                                      .filter(dependency -> !modulesAlreadyDeployed.contains(dependency))
                                                                      .collect(Collectors.toList());
        return allModulesFoundInSpace && modulesNotYetDeployed.isEmpty();
    }

    public Set getModulesForDeployment() {
        return modulesForDeployment;
    }

    public Set getModulesNotForDeployment() {
        return modulesNotForDeployment;
    }

    public Set getAlreadyDeployedModules() {
        return modulesAlreadyDeployed;
    }

    private boolean areDependenciesProcessed(Module module) {
        return module.getDeployedAfter()
                     .stream()
                     .allMatch(this::isProcessed);
    }

    private boolean isProcessed(String moduleName) {
        return modulesAlreadyDeployed.contains(moduleName) || modulesNotForDeployment.contains(moduleName);
    }

    // if the module has a deployed-after, which is not specified for deployment, we check if it is a CF app
    private boolean isDependencyPresent(String moduleName, String dependencyName) {
        if (!modulesNotForDeployment.contains(dependencyName)) {
            return true;
        }
        Module dependency = allModulesInDescriptorWithNames.get(dependencyName);
        if (!moduleToDeployHelper.isApplication(dependency)) {
            userMessageLogger.warn(MessageFormat.format(Messages.MODULE_0_DEPENDS_ON_MODULE_1_WHICH_CANNOT_BE_RESOLVED,
                                                        moduleName, dependencyName));
            return true;
        }
        return appExists(dependencyName);
    }

    private boolean appExists(String appName) {
        try {
            client.getApplicationGuid(appName);
            return true;
        } catch (CloudOperationException e) {
            return false;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy