Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SHRINKRES-305] [SHRINKRES-282] Resolve just a pom.xml #196

Merged
merged 1 commit into from
Apr 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ public Collection<MavenResolvedArtifact> resolveDependencies(final MavenResoluti
this.getDependenciesForResolution().clear();

// apply post filtering
return PostResolutionFilterApplicator.postFilter(resolvedArtifacts);
return PostResolutionFilter.filter(resolvedArtifacts, depsForResolution, strategy);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,78 +20,63 @@
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.jboss.shrinkwrap.resolver.api.maven.MavenResolvedArtifact;
import org.jboss.shrinkwrap.resolver.api.maven.PackagingType;
import org.jboss.shrinkwrap.resolver.api.maven.ScopeType;
import org.jboss.shrinkwrap.resolver.api.maven.coordinate.MavenDependencies;
import org.jboss.shrinkwrap.resolver.api.maven.coordinate.MavenDependency;
import org.jboss.shrinkwrap.resolver.api.maven.filter.MavenResolutionFilter;
import org.jboss.shrinkwrap.resolver.api.maven.strategy.MavenResolutionStrategy;
import org.jboss.shrinkwrap.resolver.api.maven.strategy.NonTransitiveStrategy;

/**
* An utility to apply pre and post filter on either a list of resolved dependencies (post filtering) or on a list of resolution
* candidates (pre filtering)
* A utility to apply post filter on a list of resolved dependencies (post filtering).
*
* @author <a href="mailto:kpiwko@redhat.com">Karel Piwko</a>
*
*/
class PostResolutionFilterApplicator {
private static final Logger log = Logger.getLogger(PostResolutionFilterApplicator.class.getName());
class PostResolutionFilter {
private static final Logger log = Logger.getLogger(PostResolutionFilter.class.getName());

/**
* Run post-resolution filtering to weed out POMs.
* Run post-resolution filtering to weed out unwanted POMs.
*
* @param artifactResults The original list of resolved artifacts
* @param depsForResolution Resolutions for the request. Used for specifying unwanted POMs
* @param strategy Resolution strategy
* @return List of modified artifactResults
*/
static Collection<MavenResolvedArtifact> postFilter(final Collection<MavenResolvedArtifact> artifactResults) {
static Collection<MavenResolvedArtifact> filter(final Collection<MavenResolvedArtifact> artifactResults, List<MavenDependency> depsForResolution, final MavenResolutionStrategy strategy) {

final MavenResolutionFilter postResolutionFilter = RestrictPomArtifactFilter.INSTANCE;
final Collection<MavenResolvedArtifact> filteredArtifacts = new ArrayList<>();
final List<MavenDependency> emptyList = Collections.emptyList();

for (final MavenResolvedArtifact artifact : artifactResults) {
final MavenDependency dependency = MavenDependencies.createDependency(artifact.getCoordinate(),
ScopeType.COMPILE, false);
// Empty lists OK here because we know the RestrictPOM Filter doesn't consult them
if (postResolutionFilter.accepts(dependency, emptyList, emptyList)) {
if (PackagingType.POM.equals(dependency.getPackaging())) {
log.finer("Filtering out POM dependency resolution: " + dependency
+ "; its transitive dependencies will be included");
// Keeping POM if specified in the resolution (G:A:pom:V) if only the POM should be resolved
if (strategy.getClass().equals(NonTransitiveStrategy.class) && checkForPomInDependencies(dependency, depsForResolution)) {
filteredArtifacts.add(artifact);
}
}
else {
filteredArtifacts.add(artifact);
}
}
return Collections.unmodifiableCollection(filteredArtifacts);
}

/**
* {@link MavenResolutionFilter} implementation which does not allow POMs to pass through
*
* @author <a href="mailto:alr@jboss.org">Andrew Lee Rubinger</a>
*/
private enum RestrictPomArtifactFilter implements MavenResolutionFilter {

INSTANCE;

/**
* {@inheritDoc}
*
* @see org.jboss.shrinkwrap.resolver.api.maven.filter.MavenResolutionFilter#accepts(org.jboss.shrinkwrap.resolver.api.maven.coordinate.MavenDependency,
* java.util.List, java.util.List)
*/
@Override
public boolean accepts(final MavenDependency coordinate, final List<MavenDependency> dependenciesForResolution, final List<MavenDependency> dependencyAncestors)
throws IllegalArgumentException {
if (PackagingType.POM.equals(coordinate.getPackaging())) {
if (log.isLoggable(Level.FINER)) {
log.finer("Filtering out POM dependency resolution: " + coordinate
+ "; its transitive dependencies will be included");
}

return false;
private static boolean checkForPomInDependencies(final MavenDependency coordinate, final List<MavenDependency> dependenciesForResolution) {
for (MavenDependency dependency : dependenciesForResolution) {
if (dependency.equals(coordinate)) {
return true;
}
return true;
}

return false;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public void asSingleResolvedArtifactInfo() {
}

/**
* Poms are filtered out.
* Poms are not filtered out when using the withoutTransitivity().
*/
@Test
public void emptyResolvedListFromPom() {
Expand All @@ -125,7 +125,7 @@ public void emptyResolvedListFromPom() {
.asResolvedArtifact();

// then
assertEquals("resolved artifact infos list should be empty for pom dependency", 0, resolvedArtifactInfos.length);
assertEquals("resolved artifact infos list should be empty for pom dependency", 1, resolvedArtifactInfos.length);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,4 +277,37 @@ public void importTestOnlyDependencies() {
new ValidationUtil("test-managed-dependency", "test-deps-b", "test-deps-k", "test-deps-l").validate(files);
}

/**
* Tests whether the POM is filtered if multiple dependencies should be resolved using the Non-transitivity strategy.
*/
@Test
public void testPomResolutionInMultipleDependencies() {
File[] file = Maven.resolver().loadPomFromFile("target/poms/test-remote-child.xml")
.resolve("org.jboss.shrinkwrap.test:test-deps-c:pom:1.0.0", "org.jboss.shrinkwrap.test:test-deps-a:pom:1.0.0").withoutTransitivity().asFile();

new ValidationUtil("test-deps-c-1.0.0.pom", "test-deps-a-1.0.0.pom").validate(file);
}

/**
* Tests whether the POM is filtered if a single dependency should be resolved using the Non-transitivity strategy.
*/
@Test
public void testPomResolutionInSingleDependency() {
File[] file = Maven.resolver().loadPomFromFile("target/poms/test-remote-child.xml")
.resolve("org.jboss.shrinkwrap.test:test-deps-c:pom:1.0.0").withoutTransitivity().asFile();

new ValidationUtil("test-deps-c-1.0.0.pom").validate(file);
}

/**
* Tests whether the POM is filtered out using the Transitivity strategy.
*/
@Test (expected = AssertionError.class)
public void testPomResolutionWithTransitivity() {
File[] file = Maven.resolver().loadPomFromFile("target/poms/test-remote-child.xml")
.resolve("org.jboss.shrinkwrap.test:test-deps-c:pom:1.0.0").withTransitivity().asFile();

new ValidationUtil("test-deps-c-1.0.0.pom").validate(file);
}

}