Skip to content

Commit

Permalink
fixing calculation of conflicts while analyzing dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
gs-gunjan committed Sep 27, 2023
1 parent 604aea0 commit 4491622
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,6 @@ public void buildDependencyGraph(ProjectDependencyGraph graph, ProjectVersion pa
if (!graph.hasNode(projectVersion))
{
graph.addNode(projectVersion, parent);
context.addVersionToProject(projectVersion.getGroupId(), projectVersion.getArtifactId(), projectVersion);
if (!context.getProjectVersionToDependencyMap().containsKey(projectVersion))
{
StoreProjectVersionData projectData = context.getProjectDataPutIfAbsent(projectVersion.getGroupId(), projectVersion.getArtifactId(), projectVersion.getVersionId(), () -> getProject(projectVersion.getGroupId(), projectVersion.getArtifactId(), projectVersion.getVersionId()));
Expand All @@ -269,22 +268,17 @@ public ProjectDependencyReport getProjectDependencyReport(List<ProjectVersion> p
ProjectDependencyGraph graph = new ProjectDependencyGraph();
ProjectDependencyGraphWalkerContext graphWalkerContext = new ProjectDependencyGraphWalkerContext();
buildDependencyGraph(graph, null, projectDependencyVersions, graphWalkerContext);
ProjectDependencyReport report = buildReportFromGraph(graph, graphWalkerContext);
return overrideConflictDependencies(projectDependencyVersions, report);
buildProjectVersionMap(projectDependencyVersions, graphWalkerContext);
return buildReportFromGraph(graph, graphWalkerContext);
}

public ProjectDependencyReport overrideConflictDependencies(List<ProjectVersion> projectDependencyVersions, ProjectDependencyReport report)
private void buildProjectVersionMap(List<ProjectVersion> projectDependencyVersions, ProjectDependencyGraphWalkerContext graphWalkerContext)
{
List<ProjectDependencyReport.ProjectDependencyConflict> conflicts = new ArrayList<>(report.getConflicts());
projectDependencyVersions.stream().forEach(dep ->
projectDependencyVersions.forEach(pv ->
{
Optional<ProjectDependencyReport.ProjectDependencyConflict> conflictPresent = conflicts.stream().filter(conflict -> conflict.getGroupId().equals(dep.getGroupId()) && conflict.getArtifactId().equals(dep.getArtifactId())).findFirst();
if (conflictPresent.isPresent())
{
report.removeConflict(conflictPresent.get());
}
StoreProjectVersionData versionData = graphWalkerContext.getProjectData(pv.getGroupId(), pv.getArtifactId(), pv.getVersionId());
versionData.getTransitiveDependenciesReport().getTransitiveDependencies().forEach(dep -> graphWalkerContext.addVersionToProject(dep.getGroupId(), dep.getArtifactId(), dep));
});
return report;
}

public ProjectDependencyReport buildReportFromGraph(ProjectDependencyGraph dependencyGraph, ProjectDependencyGraphWalkerContext graphWalkerContext)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -176,26 +176,46 @@ public void canGetProjectDependenciesWithOutDuplicates()
@Test
public void canGetProjectDependenciesWithConflicts()
{
Set<ProjectVersion> dependencyList = projectsService.getDependencies("examples.metadata", "test", "2.3.1", false);
Assert.assertFalse(dependencyList.isEmpty());
Assert.assertTrue(dependencyList.contains(new ProjectVersion("examples.metadata", "test-dependencies", "1.0.0")));
StoreProjectVersionData projectA = projectsService.find("examples.metadata", "test-dependencies", "1.0.0").get();
ProjectVersion dependencyA = new ProjectVersion("example.services.test", "test", "1.0.0");
projectA.setTransitiveDependenciesReport(new VersionDependencyReport(Arrays.asList(dependencyA), true));
projectsService.createOrUpdate(projectA);

Set<ProjectVersion> dependencyList2 = projectsService.getDependencies("examples.metadata", "test", "2.3.1", true);
Assert.assertFalse(dependencyList2.isEmpty());
Assert.assertTrue(dependencyList2.contains(new ProjectVersion("examples.metadata", "test-dependencies", "1.0.0")));
Assert.assertTrue(dependencyList2.contains(new ProjectVersion("example.services.test", "test", "1.0.0")));
Assert.assertFalse(projectsService.getDependencies("examples.metadata", "test", "2.3.1", false).contains(new ProjectVersion("example.services.test", "test", "2.0.1")));
StoreProjectVersionData projectA = projectsService.find("example.services.test", "test", "1.0.0").get();
StoreProjectVersionData projectB = new StoreProjectVersionData("examples.metadata", "test-dependencies", "2.0.0");
projectA.getVersionData().addDependency(new ProjectVersion("examples.metadata", "test-dependencies", "2.0.0"));
StoreProjectVersionData projectB = new StoreProjectVersionData("example.services.test", "test-dependencies", "1.0.0");
projectsService.createOrUpdate(new StoreProjectData("PROD-72", "example.services.test", "test-dependencies"));
ProjectVersion dependencyB = new ProjectVersion("example.services.test", "test", "2.0.0");
projectB.getVersionData().addDependency(dependencyB);
projectB.setTransitiveDependenciesReport(new VersionDependencyReport(Arrays.asList(dependencyB), true));
projectsService.createOrUpdate(projectB);
projectsService.createOrUpdate(projectA);
projectsService.createOrUpdate(new StoreProjectVersionData("example.services.test", "test", "2.0.0"));

// Dependency Tree
ProjectDependencyReport dependencyReport = projectsService.getProjectDependencyReport("examples.metadata", "test", "2.3.1");
ProjectDependencyReport dependencyReport = projectsService.getProjectDependencyReport(Arrays.asList(new ProjectVersion("examples.metadata", "test-dependencies", "1.0.0"), new ProjectVersion("example.services.test", "test-dependencies", "1.0.0")));

Assert.assertEquals(1, dependencyReport.getConflicts().size());
Assert.assertEquals(dependencyReport.getConflicts().get(0).getVersions(), Sets.mutable.of("examples.metadata:test-dependencies:1.0.0","examples.metadata:test-dependencies:2.0.0"));
Assert.assertEquals(dependencyReport.getConflicts().get(0).getVersions(), Sets.mutable.of("example.services.test:test:1.0.0","example.services.test:test:2.0.0"));
}

@Test
public void canGetProjectDependenciesReportWithOverrides()
{
StoreProjectVersionData projectA = projectsService.find("examples.metadata", "test-dependencies", "1.0.0").get();
ProjectVersion dependencyA = new ProjectVersion("example.services.test", "test", "1.0.0");
projectA.setTransitiveDependenciesReport(new VersionDependencyReport(Arrays.asList(dependencyA), true));
projectsService.createOrUpdate(projectA);

StoreProjectVersionData projectB = new StoreProjectVersionData("example.services.test", "test-dependencies", "1.0.0");
projectsService.createOrUpdate(new StoreProjectData("PROD-72", "example.services.test", "test-dependencies"));
ProjectVersion dependencyB = new ProjectVersion("example.services.test", "test", "2.0.0");
projectB.getVersionData().addDependency(dependencyB);
projectB.setTransitiveDependenciesReport(new VersionDependencyReport(Arrays.asList(dependencyB), true));
projectsService.createOrUpdate(projectB);
projectsService.createOrUpdate(new StoreProjectVersionData("example.services.test", "test", "2.0.0"));

// Dependency Tree
ProjectDependencyReport dependencyReport = projectsService.getProjectDependencyReport(Arrays.asList(new ProjectVersion("examples.metadata", "test-dependencies", "1.0.0"), new ProjectVersion("example.services.test", "test-dependencies", "1.0.0"), dependencyB));

Assert.assertEquals(0, dependencyReport.getConflicts().size());
}

@Test
Expand Down

0 comments on commit 4491622

Please sign in to comment.