This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven.git
commit c8e2af96a34e69995fb8399541959ea506f57f69 Author: Guillaume Nodet <gno...@gmail.com> AuthorDate: Fri Jan 24 23:16:23 2025 +0100 [MNG-8540] Add equals/hashCode to requests --- .../ArtifactCoordinatesFactoryRequest.java | 19 ++++++++++++ .../api/services/ArtifactDeployerRequest.java | 14 +++++++++ .../maven/api/services/ArtifactFactoryRequest.java | 18 +++++++++++ .../api/services/ArtifactInstallerRequest.java | 11 +++++++ .../api/services/ArtifactResolverRequest.java | 13 ++++++++ .../DependencyCoordinatesFactoryRequest.java | 31 +++++++++++++++++++ .../api/services/DependencyResolverRequest.java | 31 +++++++++++++++++++ .../maven/api/services/ModelBuilderRequest.java | 35 ++++++++++++++++++++++ .../maven/api/services/ProjectBuilderRequest.java | 17 +++++++++++ .../org/apache/maven/api/services/Request.java | 21 +++++++++++++ .../maven/api/services/SettingsBuilderRequest.java | 16 ++++++++++ .../api/services/ToolchainsBuilderRequest.java | 13 ++++++++ .../api/services/VersionRangeResolverRequest.java | 13 ++++++++ .../maven/api/services/VersionResolverRequest.java | 13 ++++++++ .../api/services/RequestImplementationTest.java | 35 ++++++++++++++++++++++ 15 files changed, 300 insertions(+) diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactCoordinatesFactoryRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactCoordinatesFactoryRequest.java index 074c9bcebd..7a8361e9a3 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactCoordinatesFactoryRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactCoordinatesFactoryRequest.java @@ -18,6 +18,8 @@ */ package org.apache.maven.api.services; +import java.util.Objects; + import org.apache.maven.api.ArtifactCoordinates; import org.apache.maven.api.Session; import org.apache.maven.api.annotations.Experimental; @@ -235,6 +237,23 @@ public String getCoordinatesString() { return coordinatesString; } + @Override + public boolean equals(Object o) { + return o instanceof DefaultArtifactFactoryRequestArtifact that + && Objects.equals(groupId, that.groupId) + && Objects.equals(artifactId, that.artifactId) + && Objects.equals(version, that.version) + && Objects.equals(classifier, that.classifier) + && Objects.equals(extension, that.extension) + && Objects.equals(type, that.type) + && Objects.equals(coordinatesString, that.coordinatesString); + } + + @Override + public int hashCode() { + return Objects.hash(groupId, artifactId, version, classifier, extension, type, coordinatesString); + } + @Override public String toString() { return "ArtifactFactoryRequestArtifact[" + "groupId='" diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java index c2eaedf58b..8d54d882c0 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactDeployerRequest.java @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.List; +import java.util.Objects; import org.apache.maven.api.ProducedArtifact; import org.apache.maven.api.RemoteRepository; @@ -144,6 +145,19 @@ public int getRetryFailedDeploymentCount() { return retryFailedDeploymentCount; } + @Override + public boolean equals(Object o) { + return o instanceof DefaultArtifactDeployerRequest that + && retryFailedDeploymentCount == that.retryFailedDeploymentCount + && Objects.equals(repository, that.repository) + && Objects.equals(artifacts, that.artifacts); + } + + @Override + public int hashCode() { + return Objects.hash(repository, artifacts, retryFailedDeploymentCount); + } + @Override public String toString() { return "ArtifactDeployerRequest[" + "repository=" diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java index c162f42093..0d97922374 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactFactoryRequest.java @@ -18,6 +18,8 @@ */ package org.apache.maven.api.services; +import java.util.Objects; + import org.apache.maven.api.Session; import org.apache.maven.api.annotations.Experimental; import org.apache.maven.api.annotations.Immutable; @@ -198,6 +200,22 @@ public String getType() { return type; } + @Override + public boolean equals(Object o) { + return o instanceof DefaultArtifactFactoryRequest that + && Objects.equals(groupId, that.groupId) + && Objects.equals(artifactId, that.artifactId) + && Objects.equals(version, that.version) + && Objects.equals(classifier, that.classifier) + && Objects.equals(extension, that.extension) + && Objects.equals(type, that.type); + } + + @Override + public int hashCode() { + return Objects.hash(groupId, artifactId, version, classifier, extension, type); + } + @Override public String toString() { return "ArtifactFactoryRequest[" + "groupId='" diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java index 7c3130aced..6f5a57e0ea 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactInstallerRequest.java @@ -21,6 +21,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Objects; import org.apache.maven.api.ProducedArtifact; import org.apache.maven.api.Session; @@ -106,6 +107,16 @@ public Collection<ProducedArtifact> getArtifacts() { return artifacts; } + @Override + public boolean equals(Object o) { + return o instanceof DefaultArtifactInstallerRequest that && Objects.equals(artifacts, that.artifacts); + } + + @Override + public int hashCode() { + return Objects.hashCode(artifacts); + } + @Override public String toString() { return "ArtifactInstallerRequest[" + "artifacts=" + artifacts + ']'; diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java index 4651a07332..36336eae08 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.List; +import java.util.Objects; import org.apache.maven.api.ArtifactCoordinates; import org.apache.maven.api.RemoteRepository; @@ -141,6 +142,18 @@ public List<RemoteRepository> getRepositories() { return repositories; } + @Override + public boolean equals(Object o) { + return o instanceof DefaultArtifactResolverRequest that + && Objects.equals(coordinates, that.coordinates) + && Objects.equals(repositories, that.repositories); + } + + @Override + public int hashCode() { + return Objects.hash(coordinates, repositories); + } + @Override public String toString() { return "ArtifactResolverRequest[" + "coordinates=" diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyCoordinatesFactoryRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyCoordinatesFactoryRequest.java index 5bcf124711..52a4204592 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyCoordinatesFactoryRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyCoordinatesFactoryRequest.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Objects; import org.apache.maven.api.ArtifactCoordinates; import org.apache.maven.api.Dependency; @@ -301,6 +302,36 @@ public Collection<Exclusion> getExclusions() { return exclusions; } + @Override + public boolean equals(Object o) { + return o instanceof DefaultDependencyCoordinatesFactoryRequest that + && optional == that.optional + && Objects.equals(groupId, that.groupId) + && Objects.equals(artifactId, that.artifactId) + && Objects.equals(version, that.version) + && Objects.equals(classifier, that.classifier) + && Objects.equals(extension, that.extension) + && Objects.equals(type, that.type) + && Objects.equals(coordinateString, that.coordinateString) + && Objects.equals(scope, that.scope) + && Objects.equals(exclusions, that.exclusions); + } + + @Override + public int hashCode() { + return Objects.hash( + groupId, + artifactId, + version, + classifier, + extension, + type, + coordinateString, + scope, + optional, + exclusions); + } + @Override public String toString() { return "DependencyCoordinatesFactoryRequest[" + "groupId='" diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java index 532a9b6551..f419d7ff60 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; @@ -499,6 +500,36 @@ public List<RemoteRepository> getRepositories() { return repositories; } + @Override + public boolean equals(Object o) { + return o instanceof DefaultDependencyResolverRequest that + && verbose == that.verbose + && requestType == that.requestType + && Objects.equals(project, that.project) + && Objects.equals(rootArtifact, that.rootArtifact) + && Objects.equals(root, that.root) + && Objects.equals(dependencies, that.dependencies) + && Objects.equals(managedDependencies, that.managedDependencies) + && Objects.equals(pathScope, that.pathScope) + && Objects.equals(pathTypeFilter, that.pathTypeFilter) + && Objects.equals(repositories, that.repositories); + } + + @Override + public int hashCode() { + return Objects.hash( + requestType, + project, + rootArtifact, + root, + dependencies, + managedDependencies, + verbose, + pathScope, + pathTypeFilter, + repositories); + } + @Override public String toString() { return "DependencyResolverRequest[" + "requestType=" diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderRequest.java index 882ba3861c..4a995e241d 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderRequest.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Objects; import org.apache.maven.api.RemoteRepository; import org.apache.maven.api.Session; @@ -402,6 +403,40 @@ public ModelTransformer getLifecycleBindingsInjector() { return lifecycleBindingsInjector; } + @Override + public boolean equals(Object o) { + return o instanceof DefaultModelBuilderRequest that + && locationTracking == that.locationTracking + && recursive == that.recursive + && requestType == that.requestType + && Objects.equals(source, that.source) + && Objects.equals(profiles, that.profiles) + && Objects.equals(activeProfileIds, that.activeProfileIds) + && Objects.equals(inactiveProfileIds, that.inactiveProfileIds) + && Objects.equals(systemProperties, that.systemProperties) + && Objects.equals(userProperties, that.userProperties) + && repositoryMerging == that.repositoryMerging + && Objects.equals(repositories, that.repositories) + && Objects.equals(lifecycleBindingsInjector, that.lifecycleBindingsInjector); + } + + @Override + public int hashCode() { + return Objects.hash( + requestType, + locationTracking, + recursive, + source, + profiles, + activeProfileIds, + inactiveProfileIds, + systemProperties, + userProperties, + repositoryMerging, + repositories, + lifecycleBindingsInjector); + } + @Override public String toString() { return "ModelBuilderRequest[" + "requestType=" diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java index e0e9eee5b5..505098468c 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java @@ -20,6 +20,7 @@ import java.nio.file.Path; import java.util.List; +import java.util.Objects; import java.util.Optional; import org.apache.maven.api.RemoteRepository; @@ -188,6 +189,22 @@ public List<RemoteRepository> getRepositories() { return repositories; } + @Override + public boolean equals(Object o) { + return o instanceof DefaultProjectBuilderRequest that + && allowStubModel == that.allowStubModel + && recursive == that.recursive + && processPlugins == that.processPlugins + && Objects.equals(path, that.path) + && Objects.equals(source, that.source) + && Objects.equals(repositories, that.repositories); + } + + @Override + public int hashCode() { + return Objects.hash(path, source, allowStubModel, recursive, processPlugins, repositories); + } + @Override public String toString() { return "ProjectBuilderRequest[" + "path=" diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/Request.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/Request.java index 28eecc94d8..b65d4a2d34 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/Request.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/Request.java @@ -78,6 +78,27 @@ public interface Request<S extends ProtoSession> { @Nullable RequestTrace getTrace(); + /** + * Returns a hashcode value for this request, based on all significant fields. + * Implementations must ensure that if two requests are equal according to + * {@link #equals(Object)}, they have the same hashcode. + * + * @return a hash code value for this request + */ + @Override + int hashCode(); + + /** + * Returns {@code true} if the specified object is equal to this request. + * Two requests are considered equal if they have the same type and all + * significant fields are equal. + * + * @param obj the object to compare with this request + * @return {@code true} if the objects are equal, {@code false} otherwise + */ + @Override + boolean equals(Object obj); + /** * Returns a string representation of this request, used for debugging and logging purposes. * The format should include the request type and any significant attributes that define the diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/SettingsBuilderRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/SettingsBuilderRequest.java index a310bb8c18..1ab8a9a15b 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/SettingsBuilderRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/SettingsBuilderRequest.java @@ -20,6 +20,7 @@ import java.nio.file.Files; import java.nio.file.Path; +import java.util.Objects; import java.util.Optional; import java.util.function.UnaryOperator; @@ -222,6 +223,21 @@ public Optional<UnaryOperator<String>> getInterpolationSource() { return Optional.ofNullable(interpolationSource); } + @Override + public boolean equals(Object o) { + return o instanceof DefaultSettingsBuilderRequest that + && Objects.equals(installationSettingsSource, that.installationSettingsSource) + && Objects.equals(projectSettingsSource, that.projectSettingsSource) + && Objects.equals(userSettingsSource, that.userSettingsSource) + && Objects.equals(interpolationSource, that.interpolationSource); + } + + @Override + public int hashCode() { + return Objects.hash( + installationSettingsSource, projectSettingsSource, userSettingsSource, interpolationSource); + } + @Override public String toString() { return "SettingsBuilderRequest[" + "installationSettingsSource=" diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ToolchainsBuilderRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ToolchainsBuilderRequest.java index 1af9a50dad..0257ae6760 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ToolchainsBuilderRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ToolchainsBuilderRequest.java @@ -20,6 +20,7 @@ import java.nio.file.Files; import java.nio.file.Path; +import java.util.Objects; import java.util.Optional; import org.apache.maven.api.ProtoSession; @@ -148,6 +149,18 @@ public Optional<Source> getUserToolchainsSource() { return Optional.ofNullable(userToolchainsSource); } + @Override + public boolean equals(Object o) { + return o instanceof DefaultToolchainsBuilderRequest that + && Objects.equals(installationToolchainsSource, that.installationToolchainsSource) + && Objects.equals(userToolchainsSource, that.userToolchainsSource); + } + + @Override + public int hashCode() { + return Objects.hash(installationToolchainsSource, userToolchainsSource); + } + @Override public String toString() { return "ToolchainsBuilderRequest[" + "installationToolchainsSource=" diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionRangeResolverRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionRangeResolverRequest.java index 3ab8a89b1e..52abe9e89a 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionRangeResolverRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionRangeResolverRequest.java @@ -19,6 +19,7 @@ package org.apache.maven.api.services; import java.util.List; +import java.util.Objects; import org.apache.maven.api.ArtifactCoordinates; import org.apache.maven.api.RemoteRepository; @@ -125,6 +126,18 @@ public List<RemoteRepository> getRepositories() { return repositories; } + @Override + public boolean equals(Object o) { + return o instanceof DefaultVersionResolverRequest that + && Objects.equals(artifactCoordinates, that.artifactCoordinates) + && Objects.equals(repositories, that.repositories); + } + + @Override + public int hashCode() { + return Objects.hash(artifactCoordinates, repositories); + } + @Override public String toString() { return "VersionResolverRequest[" + "artifactCoordinates=" diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionResolverRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionResolverRequest.java index f2751d0c0c..c8dee58a8f 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionResolverRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionResolverRequest.java @@ -19,6 +19,7 @@ package org.apache.maven.api.services; import java.util.List; +import java.util.Objects; import org.apache.maven.api.ArtifactCoordinates; import org.apache.maven.api.RemoteRepository; @@ -127,6 +128,18 @@ public List<RemoteRepository> getRepositories() { return repositories; } + @Override + public boolean equals(Object o) { + return o instanceof DefaultVersionResolverRequest that + && Objects.equals(artifactCoordinates, that.artifactCoordinates) + && Objects.equals(repositories, that.repositories); + } + + @Override + public int hashCode() { + return Objects.hash(artifactCoordinates, repositories); + } + @Override public String toString() { return "VersionResolverRequest[" + "artifactCoordinates=" diff --git a/api/maven-api-core/src/test/java/org/apache/maven/api/services/RequestImplementationTest.java b/api/maven-api-core/src/test/java/org/apache/maven/api/services/RequestImplementationTest.java index 61dc77c2e9..b618a100ca 100644 --- a/api/maven-api-core/src/test/java/org/apache/maven/api/services/RequestImplementationTest.java +++ b/api/maven-api-core/src/test/java/org/apache/maven/api/services/RequestImplementationTest.java @@ -22,6 +22,7 @@ import java.util.List; import org.apache.maven.api.ArtifactCoordinates; +import org.apache.maven.api.PathScope; import org.apache.maven.api.RemoteRepository; import org.apache.maven.api.Session; import org.junit.jupiter.api.Test; @@ -59,6 +60,11 @@ void testArtifactResolverRequestEquality() { .repositories(repositories1) .build(); + // Test equals and hashCode + assertEquals(request1, request2); + assertEquals(request1.hashCode(), request2.hashCode()); + assertNotEquals(request1, request3); + // Test toString String toString = request1.toString(); assertTrue(toString.contains("coordinates=")); @@ -76,4 +82,33 @@ void testRequestTraceIntegration() { assertEquals(trace, request.getTrace()); assertEquals(session, request.getSession()); } + + @Test + void testDependencyResolverRequestEquality() { + Session session = mock(Session.class); + + DependencyResolverRequest.DependencyResolverRequestBuilder builder = DependencyResolverRequest.builder(); + DependencyResolverRequest request1 = builder.session(session) + .requestType(DependencyResolverRequest.RequestType.COLLECT) + .pathScope(PathScope.MAIN_COMPILE) + .build(); + + DependencyResolverRequest request2 = builder.session(session) + .requestType(DependencyResolverRequest.RequestType.COLLECT) + .pathScope(PathScope.MAIN_COMPILE) + .build(); + + DependencyResolverRequest request3 = builder.session(session) + .requestType(DependencyResolverRequest.RequestType.RESOLVE) + .pathScope(PathScope.MAIN_COMPILE) + .build(); + + assertEquals(request1, request2); + assertEquals(request1.hashCode(), request2.hashCode()); + assertNotEquals(request1, request3); + + String toString = request1.toString(); + assertTrue(toString.contains("requestType=")); + assertTrue(toString.contains("pathScope=")); + } }