99
1010package org .elasticsearch .gradle .internal .util ;
1111
12+ import com .github .jengelman .gradle .plugins .shadow .ShadowBasePlugin ;
13+
1214import org .gradle .api .artifacts .Configuration ;
1315import org .gradle .api .artifacts .ResolvableDependencies ;
1416import org .gradle .api .artifacts .component .ComponentIdentifier ;
17+ import org .gradle .api .artifacts .component .ProjectComponentIdentifier ;
1518import org .gradle .api .artifacts .result .ResolvedComponentResult ;
1619import org .gradle .api .artifacts .result .ResolvedDependencyResult ;
1720import org .gradle .api .file .FileCollection ;
21+ import org .gradle .api .provider .Provider ;
1822import org .gradle .api .specs .AndSpec ;
1923import org .gradle .api .specs .Spec ;
2024
@@ -29,7 +33,7 @@ public static FileCollection createFileCollectionFromNonTransitiveArtifactsView(
2933 ) {
3034 ResolvableDependencies incoming = configuration .getIncoming ();
3135 return incoming .artifactView (viewConfiguration -> {
32- Set <ComponentIdentifier > firstLevelDependencyComponents = incoming .getResolutionResult ()
36+ Provider < Set <ComponentIdentifier > > firstLevelDependencyComponents = incoming .getResolutionResult ()
3337 .getRootComponent ()
3438 .map (
3539 rootComponent -> rootComponent .getDependencies ()
@@ -39,12 +43,36 @@ public static FileCollection createFileCollectionFromNonTransitiveArtifactsView(
3943 .filter (dependency -> dependency .getSelected () instanceof ResolvedComponentResult )
4044 .map (dependency -> dependency .getSelected ().getId ())
4145 .collect (Collectors .toSet ())
42- )
43- .get ();
46+ );
4447 viewConfiguration .componentFilter (
45- new AndSpec <>(identifier -> firstLevelDependencyComponents .contains (identifier ), componentFilter )
48+ new AndSpec <>(identifier -> firstLevelDependencyComponents .get (). contains (identifier ), componentFilter )
4649 );
4750 }).getFiles ();
4851 }
4952
53+ /**
54+ * This method gives us an artifact view of a configuration that filters out all
55+ * project dependencies that are not shadowed jars.
56+ * Basically a thirdparty only view of the dependency tree.
57+ */
58+ public static FileCollection thirdPartyDependenciesView (Configuration configuration ) {
59+ ResolvableDependencies incoming = configuration .getIncoming ();
60+ return incoming .artifactView (v -> {
61+ // resolve componentIdentifier for all shadowed project dependencies
62+ Provider <Set <ComponentIdentifier >> shadowedDependencies = incoming .getResolutionResult ()
63+ .getRootComponent ()
64+ .map (
65+ root -> root .getDependencies ()
66+ .stream ()
67+ .filter (dep -> dep instanceof ResolvedDependencyResult )
68+ .map (dep -> (ResolvedDependencyResult ) dep )
69+ .filter (dep -> dep .getResolvedVariant ().getDisplayName () == ShadowBasePlugin .COMPONENT_NAME )
70+ .filter (dep -> dep .getSelected () instanceof ResolvedComponentResult )
71+ .map (dep -> dep .getSelected ().getId ())
72+ .collect (Collectors .toSet ())
73+ );
74+ // filter out project dependencies if they are not a shadowed dependency
75+ v .componentFilter (i -> (i instanceof ProjectComponentIdentifier == false || shadowedDependencies .get ().contains (i )));
76+ }).getFiles ();
77+ }
5078}
0 commit comments