You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by el...@apache.org on 2026/09/02 11:24:53 UTC

(maven) branch master updated: [MNG-8749] Remove PathTranslator and UrlNormalizer from public API (#12941)

This is an automated email from the ASF dual-hosted git repository.

elharo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/master by this push:
     new 589c1ebfee [MNG-8749] Remove PathTranslator and UrlNormalizer from public API (#12941)
589c1ebfee is described below

commit 589c1ebfee304a8386fb449000241fd595bc8e3c
Author: Elliotte Rusty Harold <el...@users.noreply.github.com>
AuthorDate: Wed Sep 2 11:24:47 2026 +0000

    [MNG-8749] Remove PathTranslator and UrlNormalizer from public API (#12941)
    
    * [MNG-8749] Hide PathTranslator from the public API
    
    org.apache.maven.api.services.model.PathTranslator has exactly one
    implementation that is only used internally. Remove it from the public
    API and fold its single alignToBaseDirectory method into the internal
    DefaultPathTranslator implementation.
    
    Closes #10326
    
    * [MNG-8749] Remove PathTranslator and UrlNormalizer from public API
    
    Both interfaces are stateless pure functions with zero external
    reimplementations. Instead of replacing interface-based DI with
    concrete-class DI (the previous commit's approach), convert both
    to static utility methods — eliminating the interfaces, the DI
    plumbing, and the constructor parameters from all consumers.
    
    - Delete PathTranslator interface (already done)
    - Delete UrlNormalizer interface
    - Make DefaultPathTranslator.alignToBaseDirectory static
    - Make DefaultUrlNormalizer.normalize static
    - Remove constructor parameters from DefaultModelBuilder,
      DefaultModelInterpolator, DefaultModelPathTranslator,
      DefaultModelUrlNormalizer, and DefaultProfileActivationContext
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    
    * [MNG-8749] Fix spotless violations and compilation error after rebase
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
    
    ---------
    
    Co-authored-by: Guillaume Nodet <gn...@gmail.com>
    Co-authored-by: Claude Opus 4.6 <no...@anthropic.com>
---
 .../maven/api/services/model/PathTranslator.java   | 41 ------------------
 .../maven/api/services/model/UrlNormalizer.java    | 42 -------------------
 .../maven/impl/DefaultModelUrlNormalizer.java      | 11 +----
 .../apache/maven/impl/DefaultUrlNormalizer.java    | 16 +++-----
 .../maven/impl/model/DefaultModelBuilder.java      |  5 ---
 .../maven/impl/model/DefaultModelInterpolator.java | 17 ++------
 .../impl/model/DefaultModelPathTranslator.java     | 11 +----
 .../maven/impl/model/DefaultPathTranslator.java    | 14 +++----
 .../model/DefaultProfileActivationContext.java     | 13 +-----
 .../maven/impl/DefaultUrlNormalizerTest.java       | 48 ++++++++++++----------
 .../maven/impl/model/DefaultModelBuilderTest.java  |  2 +-
 .../impl/model/DefaultModelPathTranslatorTest.java |  2 +-
 .../profile/AbstractProfileActivatorTest.java      |  4 +-
 .../impl/model/profile/ConditionParserTest.java    |  5 +--
 .../profile/ConditionProfileActivatorTest.java     |  5 +--
 .../apache/maven/testing/plugin/MojoExtension.java |  7 ++--
 .../plugin/stubs/RepositorySystemSupplier.java     | 13 ++----
 17 files changed, 57 insertions(+), 199 deletions(-)

diff --git a/api/maven-api-spi/src/main/java/org/apache/maven/api/services/model/PathTranslator.java b/api/maven-api-spi/src/main/java/org/apache/maven/api/services/model/PathTranslator.java
deleted file mode 100644
index aef26d335c..0000000000
--- a/api/maven-api-spi/src/main/java/org/apache/maven/api/services/model/PathTranslator.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.api.services.model;
-
-import java.nio.file.Path;
-
-/**
- * Resolves relative paths against a specific base directory.
- *
- * @since 4.0.0
- */
-public interface PathTranslator {
-
-    /**
-     * Resolves the specified path against the given base directory. The resolved path will be absolute and uses the
-     * platform-specific file separator if a base directory is given. Otherwise, the input path will be returned
-     * unaltered.
-     *
-     * @param path The path to resolve, may be {@code null}.
-     * @param basedir The base directory to resolve relative paths against, may be {@code null}.
-     * @return The resolved path or {@code null} if the input path was {@code null}.
-     * @since 4.0.0
-     */
-    String alignToBaseDirectory(String path, Path basedir);
-}
diff --git a/api/maven-api-spi/src/main/java/org/apache/maven/api/services/model/UrlNormalizer.java b/api/maven-api-spi/src/main/java/org/apache/maven/api/services/model/UrlNormalizer.java
deleted file mode 100644
index 52eb87e0f1..0000000000
--- a/api/maven-api-spi/src/main/java/org/apache/maven/api/services/model/UrlNormalizer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.api.services.model;
-
-/**
- * Simplifies URLs by removing parent directory references ("/../") and collapsing path segments.
- * This performs purely string-based normalization without full URL parsing or validation.
- *
- * <p>The normalization process iteratively removes "/../" segments by eliminating the preceding path segment,
- * effectively resolving relative path traversals.
- *
- * <p>This does not guarantee that the resulting URL is valid or reachable; it simply
- * produces a more canonical representation of the input string.
- *
- * @since 4.0.0
- */
-public interface UrlNormalizer {
-
-    /**
-     * Normalizes the specified URL.
-     *
-     * @param url The URL to normalize, may be {@code null}.
-     * @return The normalized URL or {@code null} if the input was {@code null}.
-     */
-    String normalize(String url);
-}
diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultModelUrlNormalizer.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultModelUrlNormalizer.java
index 36bdb746b5..3a469c15e9 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultModelUrlNormalizer.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultModelUrlNormalizer.java
@@ -18,7 +18,6 @@
  */
 package org.apache.maven.impl;
 
-import org.apache.maven.api.di.Inject;
 import org.apache.maven.api.di.Named;
 import org.apache.maven.api.di.Singleton;
 import org.apache.maven.api.model.DistributionManagement;
@@ -27,7 +26,6 @@
 import org.apache.maven.api.model.Site;
 import org.apache.maven.api.services.ModelBuilderRequest;
 import org.apache.maven.api.services.model.ModelUrlNormalizer;
-import org.apache.maven.api.services.model.UrlNormalizer;
 
 /**
  * Normalizes URLs to remove the ugly parent references "../" that got potentially inserted by URL adjustment during
@@ -38,13 +36,6 @@
 @Singleton
 public class DefaultModelUrlNormalizer implements ModelUrlNormalizer {
 
-    private final UrlNormalizer urlNormalizer;
-
-    @Inject
-    public DefaultModelUrlNormalizer(UrlNormalizer urlNormalizer) {
-        this.urlNormalizer = urlNormalizer;
-    }
-
     @Override
     public Model normalize(Model model, ModelBuilderRequest request) {
         if (model == null) {
@@ -75,6 +66,6 @@ public Model normalize(Model model, ModelBuilderRequest request) {
     }
 
     private String normalize(String url) {
-        return urlNormalizer.normalize(url);
+        return DefaultUrlNormalizer.normalize(url);
     }
 }
diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultUrlNormalizer.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultUrlNormalizer.java
index dbbe5b37d6..771bdcfa75 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultUrlNormalizer.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultUrlNormalizer.java
@@ -18,20 +18,16 @@
  */
 package org.apache.maven.impl;
 
-import org.apache.maven.api.di.Named;
-import org.apache.maven.api.di.Singleton;
-import org.apache.maven.api.services.model.UrlNormalizer;
-
 /**
- * Normalizes a URL.
+ * Normalizes a URL by removing parent directory references ("/../").
  *
+ * <p>Internal utility, not part of the public API.
  */
-@Named
-@Singleton
-public class DefaultUrlNormalizer implements UrlNormalizer {
+public final class DefaultUrlNormalizer {
+
+    private DefaultUrlNormalizer() {}
 
-    @Override
-    public String normalize(String url) {
+    public static String normalize(String url) {
         String result = url;
 
         if (result != null) {
diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java
index 91aabe162e..372ff69549 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java
@@ -106,7 +106,6 @@
 import org.apache.maven.api.services.model.ModelUrlNormalizer;
 import org.apache.maven.api.services.model.ModelValidator;
 import org.apache.maven.api.services.model.ModelVersionParser;
-import org.apache.maven.api.services.model.PathTranslator;
 import org.apache.maven.api.services.model.PluginConfigurationExpander;
 import org.apache.maven.api.services.model.PluginManagementInjector;
 import org.apache.maven.api.services.model.ProfileInjector;
@@ -162,7 +161,6 @@ public class DefaultModelBuilder implements ModelBuilder {
     private final List<ModelTransformer> transformers;
     private final ModelResolver modelResolver;
     private final Interpolator interpolator;
-    private final PathTranslator pathTranslator;
     private final RootLocator rootLocator;
 
     @SuppressWarnings("checkstyle:ParameterNumber")
@@ -186,7 +184,6 @@ public DefaultModelBuilder(
             @Nullable List<ModelTransformer> transformers,
             ModelResolver modelResolver,
             Interpolator interpolator,
-            PathTranslator pathTranslator,
             RootLocator rootLocator) {
         this.modelProcessor = modelProcessor;
         this.modelValidator = modelValidator;
@@ -206,7 +203,6 @@ public DefaultModelBuilder(
         this.transformers = transformers;
         this.modelResolver = modelResolver;
         this.interpolator = interpolator;
-        this.pathTranslator = pathTranslator;
         this.rootLocator = rootLocator;
     }
 
@@ -2812,7 +2808,6 @@ static boolean usesSystemScope(Dependency dependency) {
 
     private DefaultProfileActivationContext getProfileActivationContext(ModelBuilderRequest request, Model model) {
         return new DefaultProfileActivationContext(
-                pathTranslator,
                 rootLocator,
                 interpolator,
                 request.getActiveProfileIds(),
diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelInterpolator.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelInterpolator.java
index 2effe0f66b..da729b4af6 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelInterpolator.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelInterpolator.java
@@ -44,9 +44,8 @@
 import org.apache.maven.api.services.ModelProblemCollector;
 import org.apache.maven.api.services.ModelSource;
 import org.apache.maven.api.services.model.ModelInterpolator;
-import org.apache.maven.api.services.model.PathTranslator;
 import org.apache.maven.api.services.model.RootLocator;
-import org.apache.maven.api.services.model.UrlNormalizer;
+import org.apache.maven.impl.DefaultUrlNormalizer;
 import org.apache.maven.impl.model.reflection.ReflectionValueExtractor;
 import org.apache.maven.model.v4.MavenTransformer;
 
@@ -80,19 +79,11 @@ public class DefaultModelInterpolator implements ModelInterpolator {
             "project.scm.developerConnection",
             "project.distributionManagement.site.url");
 
-    private final PathTranslator pathTranslator;
-    private final UrlNormalizer urlNormalizer;
     private final RootLocator rootLocator;
     private final Interpolator interpolator;
 
     @Inject
-    public DefaultModelInterpolator(
-            PathTranslator pathTranslator,
-            UrlNormalizer urlNormalizer,
-            RootLocator rootLocator,
-            Interpolator interpolator) {
-        this.pathTranslator = pathTranslator;
-        this.urlNormalizer = urlNormalizer;
+    public DefaultModelInterpolator(RootLocator rootLocator, Interpolator interpolator) {
         this.rootLocator = rootLocator;
         this.interpolator = interpolator;
     }
@@ -171,11 +162,11 @@ private String postProcess(Path projectDir, ModelBuilderRequest request, String
         // path translation
         String exp = unprefix(expression, getProjectPrefixes(request));
         if (TRANSLATED_PATH_EXPRESSIONS.contains(exp)) {
-            value = pathTranslator.alignToBaseDirectory(value, projectDir);
+            value = DefaultPathTranslator.alignToBaseDirectory(value, projectDir);
         }
         // normalize url
         if (URL_EXPRESSIONS.contains(expression)) {
-            value = urlNormalizer.normalize(value);
+            value = DefaultUrlNormalizer.normalize(value);
         }
         return value;
     }
diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelPathTranslator.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelPathTranslator.java
index 52ebbbf9d9..4fec222e85 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelPathTranslator.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelPathTranslator.java
@@ -24,7 +24,6 @@
 import java.util.Objects;
 import java.util.function.BiFunction;
 
-import org.apache.maven.api.di.Inject;
 import org.apache.maven.api.di.Named;
 import org.apache.maven.api.di.Singleton;
 import org.apache.maven.api.model.Build;
@@ -34,7 +33,6 @@
 import org.apache.maven.api.model.Source;
 import org.apache.maven.api.services.ModelBuilderRequest;
 import org.apache.maven.api.services.model.ModelPathTranslator;
-import org.apache.maven.api.services.model.PathTranslator;
 
 /**
  * Resolves relative paths within a model against a specific base directory.
@@ -44,13 +42,6 @@
 @Singleton
 public class DefaultModelPathTranslator implements ModelPathTranslator {
 
-    private final PathTranslator pathTranslator;
-
-    @Inject
-    public DefaultModelPathTranslator(PathTranslator pathTranslator) {
-        this.pathTranslator = pathTranslator;
-    }
-
     @Override
     public Model alignToBaseDirectory(Model model, Path basedir, ModelBuilderRequest request) {
         if (model == null || basedir == null) {
@@ -173,7 +164,7 @@ private Resource alignToBaseDirectory(Resource resource, Path basedir) {
      * @return relocated path, or {@code null} if the given path was null
      */
     private String alignToBaseDirectory(String path, Path basedir) {
-        String newPath = pathTranslator.alignToBaseDirectory(path, basedir);
+        String newPath = DefaultPathTranslator.alignToBaseDirectory(path, basedir);
         return Objects.equals(path, newPath) ? path : newPath;
     }
 }
diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultPathTranslator.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultPathTranslator.java
index 47cd073b8e..0513be3ba6 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultPathTranslator.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultPathTranslator.java
@@ -21,20 +21,16 @@
 import java.io.File;
 import java.nio.file.Path;
 
-import org.apache.maven.api.di.Named;
-import org.apache.maven.api.di.Singleton;
-import org.apache.maven.api.services.model.PathTranslator;
-
 /**
  * Resolves relative paths against a specific base directory.
  *
+ * <p>Internal utility, not part of the public API.
  */
-@Named
-@Singleton
-public class DefaultPathTranslator implements PathTranslator {
+public final class DefaultPathTranslator {
+
+    private DefaultPathTranslator() {}
 
-    @Override
-    public String alignToBaseDirectory(String path, Path basedir) {
+    public static String alignToBaseDirectory(String path, Path basedir) {
         String result = path;
 
         if (path != null && basedir != null) {
diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultProfileActivationContext.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultProfileActivationContext.java
index 0fa7765d14..08cef4afb6 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultProfileActivationContext.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultProfileActivationContext.java
@@ -39,7 +39,6 @@
 import org.apache.maven.api.services.InterpolatorException;
 import org.apache.maven.api.services.ModelBuilderException;
 import org.apache.maven.api.services.ProjectBuilderException;
-import org.apache.maven.api.services.model.PathTranslator;
 import org.apache.maven.api.services.model.ProfileActivationContext;
 import org.apache.maven.api.services.model.RootLocator;
 
@@ -160,7 +159,6 @@ private boolean matchesExists(Map<ExistRequest, Boolean> exists, DefaultProfileA
         }
     }
 
-    private final PathTranslator pathTranslator;
     private final RootLocator rootLocator;
     private final Interpolator interpolator;
 
@@ -171,9 +169,7 @@ private boolean matchesExists(Map<ExistRequest, Boolean> exists, DefaultProfileA
     private Model model;
     final Record record;
 
-    public DefaultProfileActivationContext(
-            PathTranslator pathTranslator, RootLocator rootLocator, Interpolator interpolator) {
-        this.pathTranslator = pathTranslator;
+    public DefaultProfileActivationContext(RootLocator rootLocator, Interpolator interpolator) {
         this.rootLocator = rootLocator;
         this.interpolator = interpolator;
         this.record = null;
@@ -181,7 +177,6 @@ public DefaultProfileActivationContext(
 
     @SuppressWarnings("checkstyle:ParameterNumber")
     public DefaultProfileActivationContext(
-            PathTranslator pathTranslator,
             RootLocator rootLocator,
             Interpolator interpolator,
             List<String> activeProfileIds,
@@ -190,7 +185,6 @@ public DefaultProfileActivationContext(
             Map<String, String> userProperties,
             Model model) {
         this(
-                pathTranslator,
                 rootLocator,
                 interpolator,
                 activeProfileIds,
@@ -203,7 +197,6 @@ public DefaultProfileActivationContext(
 
     @SuppressWarnings("checkstyle:ParameterNumber")
     private DefaultProfileActivationContext(
-            PathTranslator pathTranslator,
             RootLocator rootLocator,
             Interpolator interpolator,
             List<String> activeProfileIds,
@@ -212,7 +205,6 @@ private DefaultProfileActivationContext(
             Map<String, String> userProperties,
             Model model,
             Record record) {
-        this.pathTranslator = pathTranslator;
         this.rootLocator = rootLocator;
         this.interpolator = interpolator;
         this.activeProfileIds = activeProfileIds;
@@ -225,7 +217,6 @@ private DefaultProfileActivationContext(
 
     DefaultProfileActivationContext start() {
         return new DefaultProfileActivationContext(
-                pathTranslator,
                 rootLocator,
                 interpolator,
                 activeProfileIds,
@@ -385,7 +376,7 @@ public String interpolatePath(String path) throws InterpolatorException {
             }
             return r;
         });
-        return pathTranslator.alignToBaseDirectory(absolutePath, model.getProjectDirectory());
+        return DefaultPathTranslator.alignToBaseDirectory(absolutePath, model.getProjectDirectory());
     }
 
     @Override
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultUrlNormalizerTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultUrlNormalizerTest.java
index 1ea3fa0078..3457c665c5 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultUrlNormalizerTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultUrlNormalizerTest.java
@@ -25,45 +25,49 @@
 
 class DefaultUrlNormalizerTest {
 
-    private final DefaultUrlNormalizer sut = new DefaultUrlNormalizer();
-
     @Test
     void normalizeShouldHandleNullAndEdgeCases() {
-        assertNull(sut.normalize(null));
-        assertEquals("", sut.normalize(""));
-        assertEquals("/", sut.normalize("/../"));
-        assertEquals("", sut.normalize("a/../"));
-        assertEquals("b", sut.normalize("a/../b"));
-        assertEquals("b/d", sut.normalize("a/../b/c/../d"));
-        assertEquals("b/c/d", sut.normalize("a/../b/c/d"));
-        assertEquals("b/c", sut.normalize("a/../b/c"));
-        assertEquals("b/", sut.normalize("a/../b/c/../"));
-        assertEquals("../", sut.normalize("../"));
+        assertNull(DefaultUrlNormalizer.normalize(null));
+        assertEquals("", DefaultUrlNormalizer.normalize(""));
+        assertEquals("/", DefaultUrlNormalizer.normalize("/../"));
+        assertEquals("", DefaultUrlNormalizer.normalize("a/../"));
+        assertEquals("b", DefaultUrlNormalizer.normalize("a/../b"));
+        assertEquals("b/d", DefaultUrlNormalizer.normalize("a/../b/c/../d"));
+        assertEquals("b/c/d", DefaultUrlNormalizer.normalize("a/../b/c/d"));
+        assertEquals("b/c", DefaultUrlNormalizer.normalize("a/../b/c"));
+        assertEquals("b/", DefaultUrlNormalizer.normalize("a/../b/c/../"));
+        assertEquals("../", DefaultUrlNormalizer.normalize("../"));
     }
 
     @Test
     void normalizeShouldPreserveHttpUrlTrailingSlash() {
-        assertEquals("https://example.com/path", sut.normalize("https://example.com/path"));
-        assertEquals("https://example.com/path/", sut.normalize("https://example.com/path/"));
+        assertEquals("https://example.com/path", DefaultUrlNormalizer.normalize("https://example.com/path"));
+        assertEquals("https://example.com/path/", DefaultUrlNormalizer.normalize("https://example.com/path/"));
     }
 
     @Test
     void normalizeShouldCollapseParentReferencesInUrl() {
-        assertEquals("https://example.com/child", sut.normalize("https://example.com/parent/../child"));
-        assertEquals("https://example.com/child", sut.normalize("https://example.com/grand/parent/../../child"));
+        assertEquals(
+                "https://example.com/child", DefaultUrlNormalizer.normalize("https://example.com/parent/../child"));
+        assertEquals(
+                "https://example.com/child",
+                DefaultUrlNormalizer.normalize("https://example.com/grand/parent/../../child"));
     }
 
     @Test
     void normalizeHandlesDoubleSlashesAfterParent() {
-        assertEquals("https://example.com//child", sut.normalize("https://example.com/parent/..//child"));
-        assertEquals("https://example.com/child", sut.normalize("https://example.com/parent//../child"));
+        assertEquals(
+                "https://example.com//child", DefaultUrlNormalizer.normalize("https://example.com/parent/..//child"));
+        assertEquals(
+                "https://example.com/child", DefaultUrlNormalizer.normalize("https://example.com/parent//../child"));
     }
 
     @Test
     void normalizeShouldPreserveOriginalUrlStructure() {
-        assertEquals("file:////some/server", sut.normalize("file:////some/server"));
-        assertEquals("https://example.com/a%20b/c%20d", sut.normalize("https://example.com/a%20b/c%20d"));
-        assertEquals("https://example.com/a b/c d", sut.normalize("https://example.com/a b/c d"));
-        assertEquals("ht!tps:/bad_url", sut.normalize("ht!tps:/bad_url"));
+        assertEquals("file:////some/server", DefaultUrlNormalizer.normalize("file:////some/server"));
+        assertEquals(
+                "https://example.com/a%20b/c%20d", DefaultUrlNormalizer.normalize("https://example.com/a%20b/c%20d"));
+        assertEquals("https://example.com/a b/c d", DefaultUrlNormalizer.normalize("https://example.com/a b/c d"));
+        assertEquals("ht!tps:/bad_url", DefaultUrlNormalizer.normalize("ht!tps:/bad_url"));
     }
 }
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelBuilderTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelBuilderTest.java
index 3386dcd726..0ea386898a 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelBuilderTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelBuilderTest.java
@@ -1705,7 +1705,7 @@ private static DefaultProfileActivationContext.Record recordActiveProfile(
     private static DefaultProfileActivationContext newProfileActivationContext(
             List<String> activeIds, List<String> inactiveIds) {
         return new DefaultProfileActivationContext(
-                null, null, null, activeIds, inactiveIds, Map.of(), Map.of(), Model.newInstance());
+                null, null, activeIds, inactiveIds, Map.of(), Map.of(), Model.newInstance());
     }
 
     @Provides
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelPathTranslatorTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelPathTranslatorTest.java
index be71eff2d5..b452a5fcde 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelPathTranslatorTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelPathTranslatorTest.java
@@ -37,7 +37,7 @@ class DefaultModelPathTranslatorTest {
 
     @BeforeEach
     void setUp() {
-        translator = new DefaultModelPathTranslator(new DefaultPathTranslator());
+        translator = new DefaultModelPathTranslator();
         basedir = Path.of("/home/user/myproject").toAbsolutePath();
     }
 
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/profile/AbstractProfileActivatorTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/profile/AbstractProfileActivatorTest.java
index 3829f03e49..9213ff6a3c 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/profile/AbstractProfileActivatorTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/profile/AbstractProfileActivatorTest.java
@@ -26,7 +26,6 @@
 import org.apache.maven.api.services.model.ProfileActivationContext;
 import org.apache.maven.api.services.model.ProfileActivator;
 import org.apache.maven.impl.model.DefaultInterpolator;
-import org.apache.maven.impl.model.DefaultPathTranslator;
 import org.apache.maven.impl.model.DefaultProfileActivationContext;
 import org.apache.maven.impl.model.rootlocator.DefaultRootLocator;
 import org.junit.jupiter.api.AfterEach;
@@ -58,8 +57,7 @@ void tearDown() throws Exception {
     }
 
     protected DefaultProfileActivationContext newContext() {
-        return new DefaultProfileActivationContext(
-                new DefaultPathTranslator(), new FakeRootLocator(), new DefaultInterpolator());
+        return new DefaultProfileActivationContext(new FakeRootLocator(), new DefaultInterpolator());
     }
 
     protected ProfileActivationContext newContext(
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/profile/ConditionParserTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/profile/ConditionParserTest.java
index 088928eefa..84130fd4f2 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/profile/ConditionParserTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/profile/ConditionParserTest.java
@@ -27,7 +27,6 @@
 import org.apache.maven.impl.DefaultModelVersionParser;
 import org.apache.maven.impl.DefaultVersionParser;
 import org.apache.maven.impl.model.DefaultInterpolator;
-import org.apache.maven.impl.model.DefaultPathTranslator;
 import org.apache.maven.impl.model.DefaultProfileActivationContext;
 import org.apache.maven.impl.model.profile.ConditionParser.ExpressionFunction;
 import org.eclipse.aether.util.version.GenericVersionScheme;
@@ -59,9 +58,7 @@ void setUp() {
 
     private ProfileActivationContext createMockContext() {
         DefaultProfileActivationContext context = new DefaultProfileActivationContext(
-                new DefaultPathTranslator(),
-                new AbstractProfileActivatorTest.FakeRootLocator(),
-                new DefaultInterpolator());
+                new AbstractProfileActivatorTest.FakeRootLocator(), new DefaultInterpolator());
         context.setSystemProperties(Map.of(
                 "os.name", "windows",
                 "os.arch", "amd64",
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/profile/ConditionProfileActivatorTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/profile/ConditionProfileActivatorTest.java
index 017244f597..816dbc1bfc 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/profile/ConditionProfileActivatorTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/profile/ConditionProfileActivatorTest.java
@@ -31,7 +31,6 @@
 import org.apache.maven.impl.DefaultModelVersionParser;
 import org.apache.maven.impl.DefaultVersionParser;
 import org.apache.maven.impl.model.DefaultInterpolator;
-import org.apache.maven.impl.model.DefaultPathTranslator;
 import org.apache.maven.impl.model.DefaultProfileActivationContext;
 import org.eclipse.aether.util.version.GenericVersionScheme;
 import org.junit.jupiter.api.BeforeEach;
@@ -480,8 +479,8 @@ private Profile newProfile(ActivationFile activationFile) {
     }
 
     protected ProfileActivationContext newFileContext(Path path) {
-        DefaultProfileActivationContext context = new DefaultProfileActivationContext(
-                new DefaultPathTranslator(), new FakeRootLocator(), new DefaultInterpolator());
+        DefaultProfileActivationContext context =
+                new DefaultProfileActivationContext(new FakeRootLocator(), new DefaultInterpolator());
 
         context.setModel(Model.newBuilder().pomFile(path.resolve("pom.xml")).build());
         return context;
diff --git a/impl/maven-testing/src/main/java/org/apache/maven/testing/plugin/MojoExtension.java b/impl/maven-testing/src/main/java/org/apache/maven/testing/plugin/MojoExtension.java
index 59f2144ffc..d8604a3782 100644
--- a/impl/maven-testing/src/main/java/org/apache/maven/testing/plugin/MojoExtension.java
+++ b/impl/maven-testing/src/main/java/org/apache/maven/testing/plugin/MojoExtension.java
@@ -80,7 +80,6 @@
 import org.apache.maven.di.impl.DIException;
 import org.apache.maven.impl.InternalSession;
 import org.apache.maven.impl.model.DefaultModelPathTranslator;
-import org.apache.maven.impl.model.DefaultPathTranslator;
 import org.apache.maven.internal.impl.DefaultLog;
 import org.apache.maven.internal.xml.XmlPlexusConfiguration;
 import org.apache.maven.lifecycle.internal.MojoDescriptorCreator;
@@ -243,7 +242,7 @@ public Object resolveParameter(ParameterContext parameterContext, ExtensionConte
                     try (Reader r = openPomUrl(holder, pom, new Path[1])) {
                         Model localModel = new MavenStaxReader().read(r);
                         model = new MavenMerger().merge(localModel, model, false, null);
-                        model = new DefaultModelPathTranslator(new DefaultPathTranslator())
+                        model = new DefaultModelPathTranslator()
                                 .alignToBaseDirectory(model, Paths.get(getBasedir()), null);
                     }
                 }
@@ -437,8 +436,8 @@ public void beforeEach(ExtensionContext context) throws Exception {
         } else {
             model = new MavenMerger().merge(tmodel, defaultModel, false, null);
         }
-        final Model alignedModel = new DefaultModelPathTranslator(new DefaultPathTranslator())
-                .alignToBaseDirectory(model, Paths.get(getBasedir()), null);
+        final Model alignedModel =
+                new DefaultModelPathTranslator().alignToBaseDirectory(model, Paths.get(getBasedir()), null);
         context.getStore(MOJO_EXTENSION).put(Model.class, alignedModel);
 
         // mojo execution
diff --git a/impl/maven-testing/src/main/java/org/apache/maven/testing/plugin/stubs/RepositorySystemSupplier.java b/impl/maven-testing/src/main/java/org/apache/maven/testing/plugin/stubs/RepositorySystemSupplier.java
index 3ac83063e0..71b92235c1 100644
--- a/impl/maven-testing/src/main/java/org/apache/maven/testing/plugin/stubs/RepositorySystemSupplier.java
+++ b/impl/maven-testing/src/main/java/org/apache/maven/testing/plugin/stubs/RepositorySystemSupplier.java
@@ -31,7 +31,6 @@
 import org.apache.maven.impl.DefaultModelXmlFactory;
 import org.apache.maven.impl.DefaultPluginConfigurationExpander;
 import org.apache.maven.impl.DefaultSuperPomProvider;
-import org.apache.maven.impl.DefaultUrlNormalizer;
 import org.apache.maven.impl.model.DefaultDependencyManagementImporter;
 import org.apache.maven.impl.model.DefaultDependencyManagementInjector;
 import org.apache.maven.impl.model.DefaultInheritanceAssembler;
@@ -42,7 +41,6 @@
 import org.apache.maven.impl.model.DefaultModelPathTranslator;
 import org.apache.maven.impl.model.DefaultModelProcessor;
 import org.apache.maven.impl.model.DefaultModelValidator;
-import org.apache.maven.impl.model.DefaultPathTranslator;
 import org.apache.maven.impl.model.DefaultPluginManagementInjector;
 import org.apache.maven.impl.model.DefaultProfileInjector;
 import org.apache.maven.impl.model.DefaultProfileSelector;
@@ -1157,13 +1155,9 @@ protected ModelBuilder createModelBuilder() {
                 modelProcessor,
                 new DefaultModelValidator(),
                 new DefaultModelNormalizer(),
-                new DefaultModelInterpolator(
-                        new DefaultPathTranslator(),
-                        new DefaultUrlNormalizer(),
-                        new DefaultRootLocator(),
-                        new DefaultInterpolator()),
-                new DefaultModelPathTranslator(new DefaultPathTranslator()),
-                new DefaultModelUrlNormalizer(new DefaultUrlNormalizer()),
+                new DefaultModelInterpolator(new DefaultRootLocator(), new DefaultInterpolator()),
+                new DefaultModelPathTranslator(),
+                new DefaultModelUrlNormalizer(),
                 new DefaultSuperPomProvider(modelProcessor),
                 new DefaultInheritanceAssembler(),
                 new DefaultProfileSelector(),
@@ -1176,7 +1170,6 @@ protected ModelBuilder createModelBuilder() {
                 List.of(),
                 new DefaultModelResolver(),
                 new DefaultInterpolator(),
-                new DefaultPathTranslator(),
                 new DefaultRootLocator());
     }