Convert org.pkl.core.project POJOs to record classes (#749)

This commit is contained in:
Kushal Pisavadia
2024-11-13 01:08:01 +00:00
committed by GitHub
parent 3246a0e449
commit dddbb27143
7 changed files with 186 additions and 250 deletions
@@ -36,7 +36,7 @@ class CliProjectPackager(
) : CliProjectCommand(baseOptions, projectDirs) { ) : CliProjectCommand(baseOptions, projectDirs) {
private fun runApiTests(project: Project) { private fun runApiTests(project: Project) {
val apiTests = project.`package`!!.apiTests val apiTests = project.`package`!!.apiTests()
if (apiTests.isEmpty()) return if (apiTests.isEmpty()) return
val normalizeApiTests = apiTests.map { project.projectDir.resolve(it).toUri() } val normalizeApiTests = apiTests.map { project.projectDir.resolve(it).toUri() }
val testRunner = val testRunner =
@@ -49,7 +49,7 @@ class CliProjectPackager(
try { try {
testRunner.run() testRunner.run()
} catch (e: CliTestException) { } catch (e: CliTestException) {
throw CliException(ErrorMessages.create("packageTestsFailed", project.`package`!!.uri)) throw CliException(ErrorMessages.create("packageTestsFailed", project.`package`!!.uri()))
} }
} }
@@ -67,8 +67,8 @@ class CliProjectPackager(
} }
// Require that all local projects are included // Require that all local projects are included
projects.forEach { proj -> projects.forEach { proj ->
proj.dependencies.localDependencies.values.forEach { localDep -> proj.dependencies.localDependencies().values.forEach { localDep ->
val projectDir = Path.of(localDep.projectFileUri).parent val projectDir = Path.of(localDep.projectFileUri()).parent
if (projects.none { it.projectDir == projectDir }) { if (projects.none { it.projectDir == projectDir }) {
throw CliException( throw CliException(
ErrorMessages.create("missingProjectInPackageCommand", proj.projectDir, projectDir) ErrorMessages.create("missingProjectInPackageCommand", proj.projectDir, projectDir)
@@ -70,7 +70,7 @@ public final class ProjectDependenciesManager {
SecurityManager securityManager) { SecurityManager securityManager) {
this.declaredDependencies = declaredDependencies; this.declaredDependencies = declaredDependencies;
// new URI("scheme://host/a/b/c.txt").resolve(".") == new URI("scheme://host/a/b/") // new URI("scheme://host/a/b/c.txt").resolve(".") == new URI("scheme://host/a/b/")
this.projectBaseUri = IoUtils.resolve(declaredDependencies.getProjectFileUri(), "."); this.projectBaseUri = IoUtils.resolve(declaredDependencies.projectFileUri(), ".");
this.moduleResolver = moduleResolver; this.moduleResolver = moduleResolver;
this.securityManager = securityManager; this.securityManager = securityManager;
} }
@@ -88,7 +88,7 @@ public final class ProjectDependenciesManager {
} }
var projectDeps = getProjectDeps(); var projectDeps = getProjectDeps();
myDependencies = doBuildResolvedDependenciesForProject(declaredDependencies, projectDeps); myDependencies = doBuildResolvedDependenciesForProject(declaredDependencies, projectDeps);
for (var localPkg : declaredDependencies.getLocalDependencies().values()) { for (var localPkg : declaredDependencies.localDependencies().values()) {
ensureLocalProjectDependencyInitialized(localPkg, projectDeps); ensureLocalProjectDependencyInitialized(localPkg, projectDeps);
} }
} }
@@ -97,14 +97,14 @@ public final class ProjectDependenciesManager {
private void ensureLocalProjectDependencyInitialized( private void ensureLocalProjectDependencyInitialized(
DeclaredDependencies localProjectDependencies, ProjectDeps projectDeps) { DeclaredDependencies localProjectDependencies, ProjectDeps projectDeps) {
// turn `package:` scheme into `projectpackage`: scheme // turn `package:` scheme into `projectpackage`: scheme
var uri = PackageUri.create("project" + localProjectDependencies.getMyPackageUri()); var uri = PackageUri.create("project" + localProjectDependencies.myPackageUri());
if (localPackageDependencies.containsKey(uri)) { if (localPackageDependencies.containsKey(uri)) {
return; return;
} }
var resolvedDeps = doBuildResolvedDependenciesForProject(localProjectDependencies, projectDeps); var resolvedDeps = doBuildResolvedDependenciesForProject(localProjectDependencies, projectDeps);
localPackageDependencies.put(uri, resolvedDeps); localPackageDependencies.put(uri, resolvedDeps);
// TODO: check circular imports (should not be possible) // TODO: check circular imports (should not be possible)
for (var declaredDeps : localProjectDependencies.getLocalDependencies().values()) { for (var declaredDeps : localProjectDependencies.localDependencies().values()) {
ensureLocalProjectDependencyInitialized(declaredDeps, projectDeps); ensureLocalProjectDependencyInitialized(declaredDeps, projectDeps);
} }
} }
@@ -124,22 +124,21 @@ public final class ProjectDependenciesManager {
DeclaredDependencies declaredDeps, ProjectDeps resolvedProjectDeps) { DeclaredDependencies declaredDeps, ProjectDeps resolvedProjectDeps) {
var ret = var ret =
new HashMap<String, Dependency>( new HashMap<String, Dependency>(
declaredDeps.getRemoteDependencies().size() declaredDeps.remoteDependencies().size() + declaredDeps.localDependencies().size());
+ declaredDeps.getLocalDependencies().size()); for (var entry : declaredDeps.localDependencies().entrySet()) {
for (var entry : declaredDeps.getLocalDependencies().entrySet()) {
var localDeclaredDependencies = entry.getValue(); var localDeclaredDependencies = entry.getValue();
var packageUri = localDeclaredDependencies.getMyPackageUri(); var packageUri = localDeclaredDependencies.myPackageUri();
assert packageUri != null; assert packageUri != null;
var canonicalPackageUri = var canonicalPackageUri =
CanonicalPackageUri.fromPackageUri(localDeclaredDependencies.getMyPackageUri()); CanonicalPackageUri.fromPackageUri(localDeclaredDependencies.myPackageUri());
var resolvedDep = resolvedProjectDeps.get(canonicalPackageUri); var resolvedDep = resolvedProjectDeps.get(canonicalPackageUri);
if (resolvedDep == null) { if (resolvedDep == null) {
throw new PackageLoadError("unresolvedProjectDependency", packageUri); throw new PackageLoadError("unresolvedProjectDependency", packageUri);
} }
checkProjectDependencyOutOfDate(declaredDeps.getProjectFileUri(), packageUri, resolvedDep); checkProjectDependencyOutOfDate(declaredDeps.projectFileUri(), packageUri, resolvedDep);
ret.put(entry.getKey(), resolvedDep); ret.put(entry.getKey(), resolvedDep);
} }
for (var entry : declaredDeps.getRemoteDependencies().entrySet()) { for (var entry : declaredDeps.remoteDependencies().entrySet()) {
var remoteDep = entry.getValue(); var remoteDep = entry.getValue();
var packageUri = CanonicalPackageUri.fromPackageUri(remoteDep.getPackageUri()); var packageUri = CanonicalPackageUri.fromPackageUri(remoteDep.getPackageUri());
var resolvedDep = resolvedProjectDeps.get(packageUri); var resolvedDep = resolvedProjectDeps.get(packageUri);
@@ -147,7 +146,7 @@ public final class ProjectDependenciesManager {
throw new PackageLoadError("unresolvedProjectDependency", entry.getValue().getPackageUri()); throw new PackageLoadError("unresolvedProjectDependency", entry.getValue().getPackageUri());
} }
checkProjectDependencyOutOfDate( checkProjectDependencyOutOfDate(
declaredDeps.getProjectFileUri(), remoteDep.getPackageUri(), resolvedDep); declaredDeps.projectFileUri(), remoteDep.getPackageUri(), resolvedDep);
ret.put(entry.getKey(), resolvedDep); ret.put(entry.getKey(), resolvedDep);
} }
return ret; return ret;
@@ -220,7 +219,7 @@ public final class ProjectDependenciesManager {
} }
public URI getProjectFileUri() { public URI getProjectFileUri() {
return declaredDependencies.getProjectFileUri(); return declaredDependencies.projectFileUri();
} }
private ProjectDeps getProjectDeps() { private ProjectDeps getProjectDeps() {
@@ -17,7 +17,6 @@ package org.pkl.core.project;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.Objects;
import org.pkl.core.PklBugException; import org.pkl.core.PklBugException;
import org.pkl.core.packages.PackageUri; import org.pkl.core.packages.PackageUri;
import org.pkl.core.util.ErrorMessages; import org.pkl.core.util.ErrorMessages;
@@ -29,10 +28,7 @@ import org.pkl.core.util.ErrorMessages;
* package://example.com/foo/bar@0}. Does not include a URI's userinfo, query params or fragment * package://example.com/foo/bar@0}. Does not include a URI's userinfo, query params or fragment
* segments. * segments.
*/ */
public final class CanonicalPackageUri { public record CanonicalPackageUri(URI baseUri, int majorVersion) {
private final URI baseUri;
private final int majorVersion;
public static CanonicalPackageUri fromPackageUri(PackageUri packageUri) { public static CanonicalPackageUri fromPackageUri(PackageUri packageUri) {
var uri = packageUri.getUri(); var uri = packageUri.getUri();
URI baseUri; URI baseUri;
@@ -71,17 +67,18 @@ public final class CanonicalPackageUri {
return new CanonicalPackageUri(baseUri, majorVersion); return new CanonicalPackageUri(baseUri, majorVersion);
} }
public CanonicalPackageUri(URI baseUri, int majorVersion) { /**
this.baseUri = baseUri; * @deprecated As of 0.28.0, replaced by {@link #majorVersion()}.
this.majorVersion = majorVersion; */
} @Deprecated(forRemoval = true)
@SuppressWarnings("unused")
public int getMajorVersion() { public int getMajorVersion() {
return majorVersion; return majorVersion;
} }
@SuppressWarnings("unused") /**
* @deprecated As of 0.28.0, replaced by {@link #baseUri()}.
*/
@Deprecated(forRemoval = true)
public URI getBaseUri() { public URI getBaseUri() {
return baseUri; return baseUri;
} }
@@ -98,11 +95,6 @@ public final class CanonicalPackageUri {
return majorVersion == that.majorVersion && baseUri.equals(that.baseUri); return majorVersion == that.majorVersion && baseUri.equals(that.baseUri);
} }
@Override
public int hashCode() {
return Objects.hash(baseUri, majorVersion);
}
@Override @Override
public String toString() { public String toString() {
return baseUri + "@" + majorVersion; return baseUri + "@" + majorVersion;
@@ -21,35 +21,39 @@ import org.pkl.core.packages.Dependency.RemoteDependency;
import org.pkl.core.packages.PackageUri; import org.pkl.core.packages.PackageUri;
import org.pkl.core.util.Nullable; import org.pkl.core.util.Nullable;
public final class DeclaredDependencies { public record DeclaredDependencies(
private final Map<String, RemoteDependency> remoteDependencies; Map<String, RemoteDependency> remoteDependencies,
private final Map<String, DeclaredDependencies> localDependencies; Map<String, DeclaredDependencies> localDependencies,
private final URI projectFileUri; URI projectFileUri,
private final @Nullable PackageUri myPackageUri; @Nullable PackageUri myPackageUri) {
/**
public DeclaredDependencies( * @deprecated As of 0.28.0, replaced by {@link #localDependencies()}.
Map<String, RemoteDependency> remoteDependencies, */
Map<String, DeclaredDependencies> localDependencies, @Deprecated(forRemoval = true)
URI projectFileUri,
@Nullable PackageUri myPackageUri) {
this.remoteDependencies = remoteDependencies;
this.localDependencies = localDependencies;
this.projectFileUri = projectFileUri;
this.myPackageUri = myPackageUri;
}
public Map<String, DeclaredDependencies> getLocalDependencies() { public Map<String, DeclaredDependencies> getLocalDependencies() {
return localDependencies; return localDependencies;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #remoteDependencies()}.
*/
@Deprecated(forRemoval = true)
public Map<String, RemoteDependency> getRemoteDependencies() { public Map<String, RemoteDependency> getRemoteDependencies() {
return remoteDependencies; return remoteDependencies;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #projectFileUri()}.
*/
@Deprecated(forRemoval = true)
public URI getProjectFileUri() { public URI getProjectFileUri() {
return projectFileUri; return projectFileUri;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #myPackageUri()}.
*/
@Deprecated(forRemoval = true)
public @Nullable PackageUri getMyPackageUri() { public @Nullable PackageUri getMyPackageUri() {
return myPackageUri; return myPackageUri;
} }
@@ -18,209 +18,145 @@ package org.pkl.core.project;
import java.net.URI; import java.net.URI;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List; import java.util.List;
import java.util.Objects;
import org.pkl.core.Version; import org.pkl.core.Version;
import org.pkl.core.packages.PackageUri; import org.pkl.core.packages.PackageUri;
import org.pkl.core.util.Nullable; import org.pkl.core.util.Nullable;
/** Java representation of class {@code pkl.Project#Package} */ /** Java representation of class {@code pkl.Project#Package} */
@SuppressWarnings("unused") @SuppressWarnings("unused")
public final class Package { public record Package(
String name,
private final String name; PackageUri uri,
private final PackageUri uri; Version version,
private final Version version; URI packageZipUrl,
private final URI packageZipUrl; @Nullable String description,
private final @Nullable String description; List<String> authors,
private final List<String> authors; @Nullable URI website,
private final @Nullable URI website; @Nullable URI documentation,
private final @Nullable URI documentation; @Nullable URI sourceCode,
private final @Nullable URI sourceCode; @Nullable String sourceCodeUrlScheme,
private final @Nullable String sourceCodeUrlScheme; @Nullable String license,
private final @Nullable String license; @Nullable String licenseText,
private final @Nullable String licenseText; @Nullable URI issueTracker,
private final @Nullable URI issueTracker; List<Path> apiTests,
private final List<Path> apiTests; List<String> exclude) {
private final List<String> exclude; /**
* @deprecated As of 0.28.0, replaced by {@link #name()}.
public Package( */
String name, @Deprecated(forRemoval = true)
PackageUri uri,
Version version,
URI packageZipUrl,
@Nullable String description,
List<String> authors,
@Nullable URI website,
@Nullable URI documentation,
@Nullable URI sourceCode,
@Nullable String sourceCodeUrlScheme,
@Nullable String license,
@Nullable String licenseText,
@Nullable URI issueTracker,
List<Path> apiTests,
List<String> exclude) {
this.name = name;
this.uri = uri;
this.version = version;
this.packageZipUrl = packageZipUrl;
this.description = description;
this.authors = authors;
this.website = website;
this.documentation = documentation;
this.sourceCode = sourceCode;
this.sourceCodeUrlScheme = sourceCodeUrlScheme;
this.license = license;
this.licenseText = licenseText;
this.issueTracker = issueTracker;
this.apiTests = apiTests;
this.exclude = exclude;
}
public String getName() { public String getName() {
return name; return name;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #uri()}.
*/
@Deprecated(forRemoval = true)
public PackageUri getUri() { public PackageUri getUri() {
return uri; return uri;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #version()}.
*/
@Deprecated(forRemoval = true)
public Version getVersion() { public Version getVersion() {
return version; return version;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #packageZipUrl()}.
*/
@Deprecated(forRemoval = true)
public URI getPackageZipUrl() { public URI getPackageZipUrl() {
return packageZipUrl; return packageZipUrl;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #description()}.
*/
@Deprecated(forRemoval = true)
public @Nullable String getDescription() { public @Nullable String getDescription() {
return description; return description;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #authors()}.
*/
@Deprecated(forRemoval = true)
public List<String> getAuthors() { public List<String> getAuthors() {
return authors; return authors;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #website()}.
*/
@Deprecated(forRemoval = true)
public @Nullable URI getWebsite() { public @Nullable URI getWebsite() {
return website; return website;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #documentation()}.
*/
@Deprecated(forRemoval = true)
public @Nullable URI getDocumentation() { public @Nullable URI getDocumentation() {
return documentation; return documentation;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #sourceCode()}.
*/
@Deprecated(forRemoval = true)
public @Nullable URI getSourceCode() { public @Nullable URI getSourceCode() {
return sourceCode; return sourceCode;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #sourceCodeUrlScheme()}.
*/
@Deprecated(forRemoval = true)
public @Nullable String getSourceCodeUrlScheme() { public @Nullable String getSourceCodeUrlScheme() {
return sourceCodeUrlScheme; return sourceCodeUrlScheme;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #licenseText()}.
*/
@Deprecated(forRemoval = true)
public @Nullable String getLicenseText() { public @Nullable String getLicenseText() {
return licenseText; return licenseText;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #license()}.
*/
@Deprecated(forRemoval = true)
public @Nullable String getLicense() { public @Nullable String getLicense() {
return license; return license;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #issueTracker()}.
*/
@Deprecated(forRemoval = true)
public @Nullable URI getIssueTracker() { public @Nullable URI getIssueTracker() {
return issueTracker; return issueTracker;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #apiTests()}.
*/
@Deprecated(forRemoval = true)
public List<Path> getApiTests() { public List<Path> getApiTests() {
return apiTests; return apiTests;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #exclude()}.
*/
@Deprecated(forRemoval = true)
public List<String> getExclude() { public List<String> getExclude() {
return exclude; return exclude;
} }
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Package aPackage = (Package) o;
return name.equals(aPackage.name)
&& uri.equals(aPackage.uri)
&& version.equals(aPackage.version)
&& Objects.equals(description, aPackage.description)
&& authors.equals(aPackage.authors)
&& Objects.equals(website, aPackage.website)
&& Objects.equals(documentation, aPackage.documentation)
&& Objects.equals(sourceCode, aPackage.sourceCode)
&& Objects.equals(sourceCodeUrlScheme, aPackage.sourceCodeUrlScheme)
&& Objects.equals(license, aPackage.license)
&& Objects.equals(licenseText, aPackage.licenseText)
&& Objects.equals(issueTracker, aPackage.issueTracker)
&& Objects.equals(apiTests, aPackage.apiTests)
&& exclude.equals(aPackage.exclude);
}
@Override
public int hashCode() {
return Objects.hash(
name,
uri,
version,
description,
authors,
website,
documentation,
sourceCode,
sourceCodeUrlScheme,
license,
licenseText,
issueTracker,
apiTests,
exclude);
}
@Override
public String toString() {
return "Package{"
+ "name="
+ name
+ ", uri="
+ uri
+ ", version='"
+ version
+ '\''
+ ", description='"
+ description
+ '\''
+ ", authors="
+ authors
+ ", website='"
+ website
+ ", documentation='"
+ documentation
+ '\''
+ ", sourceCode='"
+ sourceCode
+ '\''
+ ", sourceCodeUrlScheme='"
+ sourceCodeUrlScheme
+ '\''
+ ", license='"
+ license
+ '\''
+ ", licenseText='"
+ licenseText
+ '\''
+ ", issueTracker='"
+ issueTracker
+ '\''
+ ", apiTests='"
+ apiTests
+ '\''
+ ", exclude='"
+ exclude
+ '\''
+ '}';
}
} }
@@ -62,8 +62,8 @@ public final class ProjectDependenciesResolver {
public ProjectDeps resolve() { public ProjectDeps resolve() {
buildResolvedDependencies(project.getDependencies()); buildResolvedDependencies(project.getDependencies());
for (var localProject : project.getDependencies().getLocalDependencies().values()) { for (var localProject : project.getDependencies().localDependencies().values()) {
var packageUri = localProject.getMyPackageUri(); var packageUri = localProject.myPackageUri();
assert packageUri != null; assert packageUri != null;
var canonicalUri = CanonicalPackageUri.fromPackageUri(packageUri); var canonicalUri = CanonicalPackageUri.fromPackageUri(packageUri);
var resolvedDependency = resolvedDependencies.get(canonicalUri); var resolvedDependency = resolvedDependencies.get(canonicalUri);
@@ -86,11 +86,11 @@ public final class ProjectDependenciesResolver {
} }
private void buildResolvedDependencies(DeclaredDependencies declaredDependencies) { private void buildResolvedDependencies(DeclaredDependencies declaredDependencies) {
for (var dependency : declaredDependencies.getRemoteDependencies().values()) { for (var dependency : declaredDependencies.remoteDependencies().values()) {
resolveDependenciesOfPackageUri( resolveDependenciesOfPackageUri(
dependency.getPackageUri().toProjectPackageUri(), dependency.getChecksums()); dependency.getPackageUri().toProjectPackageUri(), dependency.getChecksums());
} }
for (var localDeclaredDependencies : declaredDependencies.getLocalDependencies().values()) { for (var localDeclaredDependencies : declaredDependencies.localDependencies().values()) {
resolveDependencies(localDeclaredDependencies); resolveDependencies(localDeclaredDependencies);
} }
} }
@@ -128,9 +128,9 @@ public final class ProjectDependenciesResolver {
} }
private void resolveDependencies(DeclaredDependencies declaredDependencies) { private void resolveDependencies(DeclaredDependencies declaredDependencies) {
var packageUri = declaredDependencies.getMyPackageUri(); var packageUri = declaredDependencies.myPackageUri();
assert packageUri != null; assert packageUri != null;
var projectDir = Path.of(declaredDependencies.getProjectFileUri()).getParent(); var projectDir = Path.of(declaredDependencies.projectFileUri()).getParent();
var relativePath = IoUtils.relativize(projectDir, this.project.getProjectDir()); var relativePath = IoUtils.relativize(projectDir, this.project.getProjectDir());
var localDependency = new LocalDependency(packageUri.toProjectPackageUri(), relativePath); var localDependency = new LocalDependency(packageUri.toProjectPackageUri(), relativePath);
updateDependency(localDependency); updateDependency(localDependency);
@@ -134,10 +134,10 @@ public final class ProjectPackager {
public void createPackages() throws IOException { public void createPackages() throws IOException {
for (var project : projects) { for (var project : projects) {
var packageResult = doPackage(project); var packageResult = doPackage(project);
writeLine(IoUtils.relativize(packageResult.getMetadataFile(), workingDir).toString()); writeLine(IoUtils.relativize(packageResult.metadataFile(), workingDir).toString());
writeLine(IoUtils.relativize(packageResult.getMetadataChecksumFile(), workingDir).toString()); writeLine(IoUtils.relativize(packageResult.metadataChecksumFile(), workingDir).toString());
writeLine(IoUtils.relativize(packageResult.getZipFile(), workingDir).toString()); writeLine(IoUtils.relativize(packageResult.zipFile(), workingDir).toString());
writeLine(IoUtils.relativize(packageResult.getZipChecksumFile(), workingDir).toString()); writeLine(IoUtils.relativize(packageResult.zipChecksumFile(), workingDir).toString());
outputWriter.flush(); outputWriter.flush();
} }
} }
@@ -145,8 +145,8 @@ public final class ProjectPackager {
private Path resolveOutputDirectory(Package pkg) { private Path resolveOutputDirectory(Package pkg) {
var substituted = var substituted =
outputPathPattern outputPathPattern
.replace("%{name}", pkg.getName()) .replace("%{name}", pkg.name())
.replace("%{version}", pkg.getVersion().toString()); .replace("%{version}", pkg.version().toString());
return workingDir.resolve(substituted); return workingDir.resolve(substituted);
} }
@@ -156,13 +156,13 @@ public final class ProjectPackager {
throw new PklException( throw new PklException(
ErrorMessages.create("noPackageDefinedByProject", project.getProjectFileUri())); ErrorMessages.create("noPackageDefinedByProject", project.getProjectFileUri()));
} }
if (packageResults.containsKey(pkg.getUri())) { if (packageResults.containsKey(pkg.uri())) {
return packageResults.get(pkg.getUri()); return packageResults.get(pkg.uri());
} }
var files = collectPackageElements(project, pkg); var files = collectPackageElements(project, pkg);
validatePklImportsAndReads(project, files); validatePklImportsAndReads(project, files);
var outputDir = resolveOutputDirectory(pkg); var outputDir = resolveOutputDirectory(pkg);
var metadataFileName = IoUtils.takeLastSegment(pkg.getUri().getUri().getPath(), '/'); var metadataFileName = IoUtils.takeLastSegment(pkg.uri().getUri().getPath(), '/');
var metadataFile = outputDir.resolve(metadataFileName); var metadataFile = outputDir.resolve(metadataFileName);
var metadataChecksumFile = outputDir.resolve(metadataFileName + ".sha256"); var metadataChecksumFile = outputDir.resolve(metadataFileName + ".sha256");
var zipFile = outputDir.resolve(metadataFileName + ".zip"); var zipFile = outputDir.resolve(metadataFileName + ".zip");
@@ -178,21 +178,20 @@ public final class ProjectPackager {
var result = var result =
new PackageResult( new PackageResult(
metadataFile, metadataChecksumFile, zipFile, zipChecksumFile, metadataFileChecksum); metadataFile, metadataChecksumFile, zipFile, zipChecksumFile, metadataFileChecksum);
packageResults.put(pkg.getUri(), result); packageResults.put(pkg.uri(), result);
return result; return result;
} }
private void checkAlreadyPublishedPackage(Package pkg, String computedChecksum) private void checkAlreadyPublishedPackage(Package pkg, String computedChecksum)
throws IOException { throws IOException {
try { try {
var metadataAndChecksum = var metadataAndChecksum = packageResolver.getDependencyMetadataAndComputeChecksum(pkg.uri());
packageResolver.getDependencyMetadataAndComputeChecksum(pkg.getUri());
var receivedChecksum = metadataAndChecksum.second.getSha256(); var receivedChecksum = metadataAndChecksum.second.getSha256();
if (!receivedChecksum.equals(computedChecksum)) { if (!receivedChecksum.equals(computedChecksum)) {
throw new PklException( throw new PklException(
ErrorMessages.create( ErrorMessages.create(
"packageAlreadyPublishedWithDifferentContents", "packageAlreadyPublishedWithDifferentContents",
pkg.getUri(), pkg.uri(),
computedChecksum, computedChecksum,
receivedChecksum)); receivedChecksum));
} }
@@ -204,8 +203,8 @@ public final class ProjectPackager {
throw new PklException( throw new PklException(
ErrorMessages.create( ErrorMessages.create(
"unableToAccessPublishedPackage", "unableToAccessPublishedPackage",
pkg.getName(), pkg.name(),
pkg.getPackageZipUrl(), pkg.packageZipUrl(),
e.getArguments()[0])); e.getArguments()[0]));
} }
} }
@@ -229,15 +228,15 @@ public final class ProjectPackager {
try { try {
var ret = var ret =
new HashMap<String, RemoteDependency>( new HashMap<String, RemoteDependency>(
project.getDependencies().getLocalDependencies().size() project.getDependencies().localDependencies().size()
+ project.getDependencies().getRemoteDependencies().size()); + project.getDependencies().remoteDependencies().size());
// module resolver is only used for reading PklProject.deps.json, so provide one that reads // module resolver is only used for reading PklProject.deps.json, so provide one that reads
// files. // files.
var moduleResolver = new ModuleResolver(List.of(ModuleKeyFactories.file)); var moduleResolver = new ModuleResolver(List.of(ModuleKeyFactories.file));
var projectDependenciesManager = var projectDependenciesManager =
new ProjectDependenciesManager( new ProjectDependenciesManager(
project.getDependencies(), moduleResolver, this.securityManager); project.getDependencies(), moduleResolver, this.securityManager);
for (var entry : project.getDependencies().getRemoteDependencies().entrySet()) { for (var entry : project.getDependencies().remoteDependencies().entrySet()) {
var resolved = var resolved =
(RemoteDependency) (RemoteDependency)
projectDependenciesManager.getResolvedDependency(entry.getValue().getPackageUri()); projectDependenciesManager.getResolvedDependency(entry.getValue().getPackageUri());
@@ -249,7 +248,7 @@ public final class ProjectPackager {
for (var entry : project.getLocalProjectDependencies().entrySet()) { for (var entry : project.getLocalProjectDependencies().entrySet()) {
var localProject = entry.getValue(); var localProject = entry.getValue();
assert localProject.getPackage() != null; assert localProject.getPackage() != null;
var packageUri = localProject.getPackage().getUri(); var packageUri = localProject.getPackage().uri();
var resolved = projectDependenciesManager.getResolvedDependency(packageUri); var resolved = projectDependenciesManager.getResolvedDependency(packageUri);
if (resolved instanceof LocalDependency) { if (resolved instanceof LocalDependency) {
var packageResult = doPackage(localProject); var packageResult = doPackage(localProject);
@@ -257,7 +256,7 @@ public final class ProjectPackager {
entry.getKey(), entry.getKey(),
new RemoteDependency( new RemoteDependency(
packageUri.toExternalPackageUri(), packageUri.toExternalPackageUri(),
new Checksums(packageResult.getMetadataChecksum()))); new Checksums(packageResult.metadataChecksum())));
} else { } else {
var remoteDep = (RemoteDependency) resolved; var remoteDep = (RemoteDependency) resolved;
ret.put( ret.put(
@@ -278,20 +277,20 @@ public final class ProjectPackager {
private DependencyMetadata createDependencyMetadata( private DependencyMetadata createDependencyMetadata(
Project project, Package pkg, String packageZipChecksum) throws IOException { Project project, Package pkg, String packageZipChecksum) throws IOException {
return new DependencyMetadata( return new DependencyMetadata(
pkg.getName(), pkg.name(),
pkg.getUri(), pkg.uri(),
pkg.getVersion(), pkg.version(),
pkg.getPackageZipUrl(), pkg.packageZipUrl(),
new Checksums(packageZipChecksum), new Checksums(packageZipChecksum),
buildDependencies(project), buildDependencies(project),
pkg.getSourceCodeUrlScheme(), pkg.sourceCodeUrlScheme(),
pkg.getSourceCode(), pkg.sourceCode(),
pkg.getDocumentation(), pkg.documentation(),
pkg.getLicense(), pkg.license(),
pkg.getLicenseText(), pkg.licenseText(),
pkg.getAuthors(), pkg.authors(),
pkg.getIssueTracker(), pkg.issueTracker(),
pkg.getDescription(), pkg.description(),
project.getAnnotations()); project.getAnnotations());
} }
@@ -343,7 +342,7 @@ public final class ProjectPackager {
private List<Pattern> getExcludePatterns(Package pkg) { private List<Pattern> getExcludePatterns(Package pkg) {
var excludePatterns = new ArrayList<Pattern>(); var excludePatterns = new ArrayList<Pattern>();
for (String s : pkg.getExclude()) { for (String s : pkg.exclude()) {
try { try {
excludePatterns.add(GlobResolver.toRegexPattern(s)); excludePatterns.add(GlobResolver.toRegexPattern(s));
} catch (InvalidGlobPatternException e) { } catch (InvalidGlobPatternException e) {
@@ -452,42 +451,48 @@ public final class ProjectPackager {
} }
} }
public static class PackageResult { public record PackageResult(
private final Path zipFile; Path zipFile,
private final Path zipChecksumFile; Path zipChecksumFile,
private final Path metadataFile; Path metadataFile,
private final Path metadataChecksumFile; Path metadataChecksumFile,
private final String metadataChecksum; String metadataChecksum) {
/**
public PackageResult( * @deprecated As of 0.28.0, replaced by {@link #zipFile()}.
Path zipFile, */
Path zipChecksumFile, @Deprecated(forRemoval = true)
Path metadataFile,
Path metadataChecksumFile,
String metadataChecksum) {
this.zipFile = zipFile;
this.zipChecksumFile = zipChecksumFile;
this.metadataFile = metadataFile;
this.metadataChecksumFile = metadataChecksumFile;
this.metadataChecksum = metadataChecksum;
}
public Path getZipFile() { public Path getZipFile() {
return zipFile; return zipFile;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #zipChecksumFile()}.
*/
@Deprecated(forRemoval = true)
public Path getZipChecksumFile() { public Path getZipChecksumFile() {
return zipChecksumFile; return zipChecksumFile;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #metadataFile()}.
*/
@Deprecated(forRemoval = true)
public Path getMetadataFile() { public Path getMetadataFile() {
return metadataFile; return metadataFile;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #metadataChecksumFile()}.
*/
@Deprecated(forRemoval = true)
public Path getMetadataChecksumFile() { public Path getMetadataChecksumFile() {
return metadataChecksumFile; return metadataChecksumFile;
} }
/**
* @deprecated As of 0.28.0, replaced by {@link #metadataChecksum()}.
*/
@Deprecated(forRemoval = true)
public String getMetadataChecksum() { public String getMetadataChecksum() {
return metadataChecksum; return metadataChecksum;
} }