-
Notifications
You must be signed in to change notification settings - Fork 1
/
DependencyUpdateReader.java
105 lines (94 loc) · 4.17 KB
/
DependencyUpdateReader.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package com.exasol.projectkeeper.validators.changesfile;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Optional;
import java.util.stream.Stream;
import org.apache.maven.model.Build;
import org.apache.maven.model.Model;
import com.exasol.errorreporting.ExaError;
import com.exasol.projectkeeper.pom.MavenProjectFromFileReader;
import com.exasol.projectkeeper.shared.dependencychanges.DependencyChangeReport;
import com.exasol.projectkeeper.validators.changesfile.dependencies.DependencyChangeReportReader;
/**
* Calculate the dependencies updated since the last release.
*/
public class DependencyUpdateReader {
private final MavenProjectFromFileReader mavenModelReader;
private final Path projectDirectory;
private final Model currentMavenModel;
/**
* Create a new instance of {@link DependencyUpdateReader}.
*
* @param mavenModelReader maven model reader
* @param projectDirectory project directory
* @param currentMavenModel current project
*/
public DependencyUpdateReader(final MavenProjectFromFileReader mavenModelReader, final Path projectDirectory,
final Model currentMavenModel) {
this.mavenModelReader = mavenModelReader;
this.projectDirectory = projectDirectory;
this.currentMavenModel = currentMavenModel;
}
/**
* Read the dependency changes.
*
* @return dependency changes report
*/
public DependencyChangeReport readDependencyChanges() {
return new DependencyChangeReportReader().read(getOldModel(), this.currentMavenModel);
}
private Model getOldModel() {
final Path relativePathToPom = this.projectDirectory.relativize(this.currentMavenModel.getPomFile().toPath());
final Path tempDirectory = createTempDirectory();
try {
final Optional<Path> lastReleasesPomFile = new LastReleasePomFileReader().extractLatestReleasesPomFile(
this.projectDirectory, relativePathToPom, this.currentMavenModel.getVersion(), tempDirectory);
if (lastReleasesPomFile.isPresent()) {
return parseOldPomFile(lastReleasesPomFile.get());
} else {
return emptyModel();
}
} finally {
deleteTempDir(tempDirectory);
}
}
private Model emptyModel() {
final var emptyModel = new Model();
emptyModel.setBuild(new Build());
return emptyModel;
}
private void deleteTempDir(final Path tempDirectory) {
try {
if (Files.isDirectory(tempDirectory)) {
try (final Stream<Path> contentStream = Files.list(tempDirectory)) {
contentStream.forEach(this::deleteTempDir);
}
}
Files.delete(tempDirectory);
} catch (final IOException exception) {
throw new IllegalStateException(ExaError.messageBuilder("E-PK-MPC-63").message(
"Failed to delete the temp directory we created for buffering the pom file of the previous release.")
.toString(), exception);
}
}
@SuppressWarnings("java:S5443") // using temp is ok here, since the data that is stored there is not confidential,
// and we don't expect attackers on the developer's PCs.
private Path createTempDirectory() {
try {
return Files.createTempDirectory("pk-pom-buffer");
} catch (final IOException exception) {
throw new IllegalStateException(ExaError.messageBuilder("E-PK-MPC-62")
.message("Failed to create a temp directory for buffering the pom file of the previous release.")
.toString(), exception);
}
}
private Model parseOldPomFile(final Path pomFile) {
try {
return this.mavenModelReader.readProject(pomFile.toFile()).getModel();
} catch (final MavenProjectFromFileReader.ReadFailedException exception) {
throw new IllegalStateException(ExaError.messageBuilder("E-PK-MPC-38")
.message("Failed to parse pom file of previous release.").toString(), exception);
}
}
}