Commit e422e754 authored by Brian Long's avatar Brian Long
Browse files

prevent StackOverflow; make `provided` overrule only `compile`

parent 7bee9872
Loading
Loading
Loading
Loading
+28 −3
Original line number Diff line number Diff line
package com.inteligr8.maven.provided;

import java.util.HashSet;
import java.util.Set;

import org.eclipse.aether.RepositoryException;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.graph.DependencyNode;
import org.eclipse.aether.util.artifact.JavaScopes;
import org.eclipse.aether.util.graph.transformer.ConflictResolver.ConflictContext;
@@ -24,7 +28,7 @@ public class ProvidedWinsScopeSelector extends ScopeSelector {
        if (this.hasProvidedScope(context.getItems())) {
            // Force the final winning node's scope to be 'provided'
            this.logger.debug("Dependency has at least one `provided` reference, so it will be `provided`: {}", context.getItems());
            context.setScope("provided");
            context.setScope(JavaScopes.PROVIDED);
            this.propagateProvidedScope(context.getItems());
        } else {
			this.defaultScopeSelector.selectScope(context);
@@ -47,9 +51,30 @@ public class ProvidedWinsScopeSelector extends ScopeSelector {
	}

    private void propagateProviderScope(DependencyNode node) {
        Set<Dependency> processed = new HashSet<>();
        this.propagateProviderScope(node, processed);
    }

    private void propagateProviderScope(DependencyNode node, Set<Dependency> processed) {
        if (processed.contains(node.getDependency())) {
            this.logger.debug("Prevented recursion due to dependency: {}", node);
            return;
        }

        switch (node.getDependency().getScope()) {
            case JavaScopes.COMPILE:
                node.setScope(JavaScopes.PROVIDED);
                // yes, there is no break here
            case JavaScopes.PROVIDED:
                processed.add(node.getDependency());
                break;
            default:
                // let `runtime` override `provided`
                return;
        }

        for (DependencyNode childNode : node.getChildren())
            this.propagateProviderScope(childNode);
            this.propagateProviderScope(childNode, processed);
    }
	
}