Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,10 @@
import org.openrewrite.*;
import org.openrewrite.gradle.marker.GradleDependencyConfiguration;
import org.openrewrite.gradle.marker.GradleProject;
import org.openrewrite.internal.StringUtils;
import org.openrewrite.java.marker.JavaProject;
import org.openrewrite.marker.SearchResult;
import org.openrewrite.maven.tree.Dependency;
import org.openrewrite.maven.tree.MavenResolutionResult;
import org.openrewrite.maven.tree.ResolvedDependency;
import org.openrewrite.maven.tree.Scope;
Expand Down Expand Up @@ -115,6 +117,11 @@ private boolean hasDependency(Tree tree) {
return true;
}
}
for (Dependency requested : mavenResult.getPom().getRequestedDependencies()) {
if (matchesRequested(requested, requestedScope, versionComparator)) {
return true;
}
}
return false;
}

Expand All @@ -128,10 +135,46 @@ private boolean hasDependency(Tree tree) {
}
}
}
for (GradleDependencyConfiguration c : gp.getConfigurations()) {
for (Dependency requested : c.getRequested()) {
if (matchesRequested(requested, null, versionComparator)) {
return true;
}
}
}
}
return false;
}

private boolean matchesRequested(Dependency dep, @Nullable Scope requestedScope, @Nullable VersionComparator versionComparator) {
if (dep.getGroupId() == null || dep.getArtifactId() == null) {
return false;
}
if (!StringUtils.matchesGlob(dep.getGroupId(), groupIdPattern)) {
return false;
}
if (!StringUtils.matchesGlob(dep.getArtifactId(), artifactIdPattern)) {
return false;
}
if (requestedScope != null) {
Scope depScope = dep.getScope() == null ? Scope.Compile : Scope.fromName(dep.getScope());
if (!depScope.isInClasspathOf(requestedScope)) {
return false;
}
}
return versionMatches(dep.getVersion(), versionComparator);
}

private static boolean versionMatches(@Nullable String version, @Nullable VersionComparator cmp) {
if (cmp == null || version == null) {
return true;
}
if (version.startsWith("${")) {
return false;
}
return cmp.isValid(null, version);
}

@Override
public TreeVisitor<?, ExecutionContext> getVisitor(Set<JavaProject> acc) {
return new TreeVisitor<Tree, ExecutionContext>() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,10 @@
import org.openrewrite.*;
import org.openrewrite.gradle.marker.GradleDependencyConfiguration;
import org.openrewrite.gradle.marker.GradleProject;
import org.openrewrite.internal.StringUtils;
import org.openrewrite.java.marker.JavaProject;
import org.openrewrite.marker.SearchResult;
import org.openrewrite.maven.tree.Dependency;
import org.openrewrite.maven.tree.MavenResolutionResult;
import org.openrewrite.maven.tree.ResolvedDependency;
import org.openrewrite.maven.tree.Scope;
Expand Down Expand Up @@ -110,6 +112,11 @@ private boolean hasDependency(Tree tree) {
return true;
}
}
for (Dependency requested : mavenResult.getPom().getRequestedDependencies()) {
if (matchesRequested(requested, requestedScope, versionComparator)) {
return true;
}
}
return false;
}

Expand All @@ -123,10 +130,46 @@ private boolean hasDependency(Tree tree) {
}
}
}
for (GradleDependencyConfiguration c : gp.getConfigurations()) {
for (Dependency requested : c.getRequested()) {
if (matchesRequested(requested, null, versionComparator)) {
return true;
}
}
}
}
return false;
}

private boolean matchesRequested(Dependency dep, @Nullable Scope requestedScope, @Nullable VersionComparator versionComparator) {
if (dep.getGroupId() == null || dep.getArtifactId() == null) {
return false;
}
if (!StringUtils.matchesGlob(dep.getGroupId(), groupIdPattern)) {
return false;
}
if (!StringUtils.matchesGlob(dep.getArtifactId(), artifactIdPattern)) {
return false;
}
if (requestedScope != null) {
Scope depScope = dep.getScope() == null ? Scope.Compile : Scope.fromName(dep.getScope());
if (!depScope.isInClasspathOf(requestedScope)) {
return false;
}
}
return versionMatches(dep.getVersion(), versionComparator);
}

private static boolean versionMatches(@Nullable String version, @Nullable VersionComparator cmp) {
if (cmp == null || version == null) {
return true;
}
if (version.startsWith("${")) {
return false;
}
return cmp.isValid(null, version);
}

@Override
public TreeVisitor<?, ExecutionContext> getVisitor(AtomicBoolean acc) {
if (acc.get()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,16 @@
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.NullSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.openrewrite.InMemoryExecutionContext;
import org.openrewrite.Parser;
import org.openrewrite.maven.MavenExecutionContextView;
import org.openrewrite.maven.MavenSettings;
import org.openrewrite.test.RecipeSpec;
import org.openrewrite.test.RewriteTest;

import java.io.ByteArrayInputStream;
import java.nio.file.Path;

import static org.assertj.core.api.Assertions.assertThat;
import static org.openrewrite.gradle.Assertions.buildGradle;
import static org.openrewrite.gradle.toolingapi.Assertions.withToolingApi;
Expand Down Expand Up @@ -346,6 +353,109 @@ void whenModuleDoesNotHaveDependencyButInvertedMarkingMarks() {
);
}

@Nested
class WhenDependencyIsRequestedButNotResolved {

@Language("groovy")
private final static String GradleNoRepositories = """
plugins {
id 'java-library'
}
dependencies {
implementation 'org.springframework:spring-beans:6.0.0'
}
""";

@Language("xml")
private final static String MavenNoRepositories = """
<project>
<groupId>com.example</groupId>
<artifactId>foo</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>6.0.0</version>
</dependency>
</dependencies>
</project>
""";

@Test
void gradleMatchesOnRequested() {
rewriteRun(
spec -> spec.recipe(new ModuleHasDependency(GroupId, ArtifactId, null, null, null)),
mavenProject("project-gradle",
buildGradle(
GradleNoRepositories,
spec -> spec.after(actual ->
assertThat(actual)
.startsWith(GradleMarkerPositive)
.actual()
)
),
java(
GradleJava,
spec -> spec.after(actual ->
assertThat(actual)
.startsWith(JavaMarkerPositive)
.actual()
)
)
)
);
}

@Test
void mavenMatchesOnRequested() {
rewriteRun(
spec -> {
MavenExecutionContextView ctx = MavenExecutionContextView.view(new InMemoryExecutionContext());
MavenSettings emptySettings = MavenSettings.parse(new Parser.Input(Path.of("settings.xml"), () -> new ByteArrayInputStream(
//language=xml
"""
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"/>
""".getBytes())), ctx);
ctx.setMavenSettings(emptySettings);
spec.recipe(new ModuleHasDependency(GroupId, ArtifactId, null, null, null))
.executionContext(ctx);
},
mavenProject("project-maven",
pomXml(
MavenNoRepositories,
spec -> spec.after(actual ->
assertThat(actual)
.startsWith(MavenMarkerPositive)
.actual()
)
),
java(
MavenJava,
spec -> spec.after(actual ->
assertThat(actual)
.startsWith(JavaMarkerPositive)
.actual()
)
)
)
);
}

@Test
void gradleVersionRangeOnRequestedDoesNotMatchWhenOutOfRange() {
rewriteRun(
spec -> spec.recipe(new ModuleHasDependency(GroupId, ArtifactId, null, "[7.0,)", null)),
mavenProject("project-gradle",
buildGradle(GradleNoRepositories),
java(GradleJava)
)
);
}
}

@Nested
class WithVersionsPattern {
@ParameterizedTest
Expand Down
Loading