diff --git a/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractDependencyFilterMojo.java b/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractDependencyFilterMojo.java index 4301dea434..0cb0ee4a27 100644 --- a/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractDependencyFilterMojo.java +++ b/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractDependencyFilterMojo.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package org.springframework.boot.maven; +import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.StringTokenizer; @@ -89,14 +90,29 @@ public abstract class AbstractDependencyFilterMojo extends AbstractMojo { @SuppressWarnings("unchecked") protected Set filterDependencies(Set dependencies, FilterArtifacts filters) throws MojoExecutionException { + List artifactsFilters = filters.getFilters(); try { - return filters.filter(dependencies); + for (ArtifactsFilter filter : artifactsFilters) { + Set result = filter.filter(dependencies); + applyFiltering(dependencies, result); + } + return dependencies; } catch (ArtifactFilterException e) { throw new MojoExecutionException(e.getMessage(), e); } } + private void applyFiltering(Set original, Set filtered) { + Iterator iterator = original.iterator(); + while (iterator.hasNext()) { + Artifact element = iterator.next(); + if (!filtered.contains(element)) { + iterator.remove(); + } + } + } + /** * Return artifact filters configured for this MOJO. * @param additionalFilters optional additional filters to apply diff --git a/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/DependencyFilterMojoTests.java b/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/DependencyFilterMojoTests.java index e4b862f814..daa49766ae 100644 --- a/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/DependencyFilterMojoTests.java +++ b/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/DependencyFilterMojoTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,13 +18,15 @@ package org.springframework.boot.maven; import java.util.Arrays; import java.util.Collections; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.apache.maven.artifact.Artifact; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter; +import org.apache.maven.shared.artifact.filter.collection.ScopeFilter; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -64,27 +66,89 @@ public class DependencyFilterMojoTests { assertThat(artifacts.iterator().next()).isSameAs(artifact); } - private Artifact createArtifact(String groupId, String artifactId) { + @Test + public void filterScopeKeepOrder() throws MojoExecutionException { + TestableDependencyFilterMojo mojo = new TestableDependencyFilterMojo( + Collections.emptyList(), "", "", + new ScopeFilter(null, Artifact.SCOPE_SYSTEM)); + Artifact one = createArtifact("com.foo", "one"); + Artifact two = createArtifact("com.foo", "two", Artifact.SCOPE_SYSTEM); + Artifact three = createArtifact("com.foo", "three", Artifact.SCOPE_RUNTIME); + Set artifacts = mojo.filterDependencies(one, two, three); + assertThat(artifacts).containsExactly(one, three); + } + + @Test + public void filterArtifactIdKeepOrder() throws MojoExecutionException { + TestableDependencyFilterMojo mojo = new TestableDependencyFilterMojo( + Collections.emptyList(), "", "one,three"); + Artifact one = createArtifact("com.foo", "one"); + Artifact two = createArtifact("com.foo", "two"); + Artifact three = createArtifact("com.foo", "three"); + Artifact four = createArtifact("com.foo", "four"); + Set artifacts = mojo.filterDependencies(one, two, three, four); + assertThat(artifacts).containsExactly(two, four); + } + + @Test + public void filterGroupIdKeepOrder() throws MojoExecutionException { + TestableDependencyFilterMojo mojo = new TestableDependencyFilterMojo( + Collections.emptyList(), "com.foo", ""); + Artifact one = createArtifact("com.foo", "one"); + Artifact two = createArtifact("com.bar", "two"); + Artifact three = createArtifact("com.bar", "three"); + Artifact four = createArtifact("com.foo", "four"); + Set artifacts = mojo.filterDependencies(one, two, three, four); + assertThat(artifacts).containsExactly(two, three); + } + + @Test + public void filterExcludeKeepOrder() throws MojoExecutionException { + Exclude exclude = new Exclude(); + exclude.setGroupId("com.bar"); + exclude.setArtifactId("two"); + TestableDependencyFilterMojo mojo = new TestableDependencyFilterMojo( + Collections.singletonList(exclude), "", ""); + Artifact one = createArtifact("com.foo", "one"); + Artifact two = createArtifact("com.bar", "two"); + Artifact three = createArtifact("com.bar", "three"); + Artifact four = createArtifact("com.foo", "four"); + Set artifacts = mojo.filterDependencies(one, two, three, four); + assertThat(artifacts).containsExactly(one, three, four); + } + + private static Artifact createArtifact(String groupId, String artifactId) { + return createArtifact(groupId, artifactId, null); + } + + private static Artifact createArtifact(String groupId, String artifactId, String scope) { Artifact a = mock(Artifact.class); given(a.getGroupId()).willReturn(groupId); given(a.getArtifactId()).willReturn(artifactId); + if (scope != null) { + given(a.getScope()).willReturn(scope); + } return a; } private static final class TestableDependencyFilterMojo extends AbstractDependencyFilterMojo { + private final ArtifactsFilter[] additionalFilters; + private TestableDependencyFilterMojo(List excludes, - String excludeGroupIds, String excludeArtifactIds) { + String excludeGroupIds, String excludeArtifactIds, + ArtifactsFilter... additionalFilters) { setExcludes(excludes); setExcludeGroupIds(excludeGroupIds); setExcludeArtifactIds(excludeArtifactIds); + this.additionalFilters = additionalFilters; } public Set filterDependencies(Artifact... artifacts) throws MojoExecutionException { - Set input = new HashSet(Arrays.asList(artifacts)); - return filterDependencies(input, getFilters()); + Set input = new LinkedHashSet(Arrays.asList(artifacts)); + return filterDependencies(input, getFilters(this.additionalFilters)); } @Override