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

com.github.sviperll.maven.profiledep.resolution.ProfileIDResolver Maven / Gradle / Ivy

The newest version!
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.github.sviperll.maven.profiledep.resolution;

import com.github.sviperll.maven.profiledep.util.TreeBuilder;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import org.apache.maven.model.Profile;

/**
 *
 * @author vir
 */
class ProfileIDResolver {
    private final Collection availableProfiles;
    private final Set unresolvedProfileIDs = new TreeSet();
    private final Set unresolvableProfileIDs = new TreeSet();
    private final Set ambigousProfileIDs = new TreeSet();

    ProfileIDResolver(Collection availableProfiles) {
        this.availableProfiles = availableProfiles;
    }

    Collection availableProfiles() {
        return availableProfiles;
    }

    boolean canResolve() {
        return !unresolvedProfileIDs.isEmpty() || !ambigousProfileIDs.isEmpty();
    }

    void include(ProfileIDResolver resolver) {
        unresolvedProfileIDs.addAll(resolver.unresolvedProfileIDs);
        unresolvableProfileIDs.addAll(resolver.unresolvableProfileIDs);
        ambigousProfileIDs.addAll(resolver.ambigousProfileIDs);

        ambigousProfileIDs.removeAll(unresolvableProfileIDs);
        unresolvedProfileIDs.removeAll(unresolvableProfileIDs);
        unresolvedProfileIDs.removeAll(ambigousProfileIDs);
    }

    void declareResolved(String profileID) {
        unresolvedProfileIDs.remove(profileID);
        ambigousProfileIDs.remove(profileID);
        unresolvableProfileIDs.remove(profileID);
    }

    void declareUnresolved(Collection profileIDs) {
        unresolvedProfileIDs.addAll(profileIDs);
    }

    void declareUnresolved(String profileID) {
        unresolvedProfileIDs.add(profileID);
    }

    boolean ambiguityExists() {
        return !ambigousProfileIDs.isEmpty();
    }
    
    List resolveUnambigous() throws ResolutionValidationException {
        if (unresolvedProfileIDs.isEmpty())
            return Collections.emptyList();
        else {
            List discoveredProfiles = new ArrayList();
            Set profileIDs = new TreeSet();
            profileIDs.addAll(unresolvedProfileIDs);
            for (String profileID : profileIDs) {
                List candidates = new ArrayList();
                for (Profile profile : availableProfiles) {
                    Set candidateProfileIDs = DependableProfile.providedIDs(profile);
                    if (candidateProfileIDs.contains(profileID)) {
                        candidates.add(profile);
                    }
                }
                if (candidates.isEmpty()) {
                    unresolvableProfileIDs.add(profileID);
                    unresolvedProfileIDs.remove(profileID);
                } else if (candidates.size() > 1) {
                    ambigousProfileIDs.add(profileID);
                    unresolvedProfileIDs.remove(profileID);
                } else {
                    Profile candidate = candidates.get(0);
                    discoveredProfiles.add(candidate);
                }
            }
            return discoveredProfiles;
        }
    }

    ResolutionState findStateForAmbigousIDs(ResolutionStateFactory stateFactory) throws ResolutionValidationException {
        String profileID = ambigousProfileIDs.iterator().next();
        List candidates = new ArrayList();
        for (Profile profile : availableProfiles) {
            Set profileIDs = DependableProfile.providedIDs(profile);
            if (profileIDs.contains(profileID)) {
                candidates.add(profile);
            }
        }
        TreeBuilder resolutionTreeBuilder = TreeBuilder.createInstance(".");
        resolutionTreeBuilder.beginSubtree("Can't resolve " + profileID);
        for (Profile profile : candidates) {
            ResolutionState state = stateFactory.createResolutionState();
            try {
                state.activate(Collections.singletonList(profile));
                return state.evolve();
            } catch (ResolutionValidationException ex) {
                resolutionTreeBuilder.subtree(" to " + profile.getId(), ex.tree().children());
            }
        }
        resolutionTreeBuilder.endSubtree();
        throw new ResolutionValidationException(resolutionTreeBuilder.build());
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy