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


The following commit(s) were added to refs/heads/master by this push:
     new 46fd5e9586 Add ModelLocator#locateExistingPom to abstract a bit more 
(#1237)
46fd5e9586 is described below

commit 46fd5e95860069c8839aae6085026c7bff9bcdc0
Author: Guillaume Nodet <gno...@gmail.com>
AuthorDate: Mon Sep 11 18:15:00 2023 +0200

    Add ModelLocator#locateExistingPom to abstract a bit more (#1237)
---
 .../maven/project/DefaultProjectBuilder.java       | 10 +--
 .../collector/MultiModuleCollectionStrategy.java   |  9 +--
 .../main/java/org/apache/maven/cli/MavenCli.java   | 13 +---
 maven-model-builder/pom.xml                        |  1 +
 .../maven/model/building/DefaultModelBuilder.java  |  3 +-
 .../model/building/DefaultModelProcessor.java      | 84 ++++++++++++++++++----
 .../model/building/DefaultTransformerContext.java  |  4 +-
 .../maven/model/building/FileModelSource.java      |  8 +--
 .../maven/model/locator/DefaultModelLocator.java   | 17 ++++-
 .../apache/maven/model/locator/ModelLocator.java   | 10 +++
 .../maven/model/transform/ParentXMLFilter.java     |  8 +--
 11 files changed, 119 insertions(+), 48 deletions(-)

diff --git 
a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java 
b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
index 1e1568e819..6b52e4eade 100644
--- 
a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
+++ 
b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
@@ -497,15 +497,11 @@ public class DefaultProjectBuilder implements 
ProjectBuilder {
 
                 module = module.replace('\\', File.separatorChar).replace('/', 
File.separatorChar);
 
-                File moduleFile = new File(basedir, module);
+                File moduleFile = modelProcessor.locateExistingPom(new 
File(basedir, module));
 
-                if (moduleFile.isDirectory()) {
-                    moduleFile = modelProcessor.locatePom(moduleFile);
-                }
-
-                if (!moduleFile.isFile()) {
+                if (moduleFile == null) {
                     ModelProblem problem = new DefaultModelProblem(
-                            "Child module " + moduleFile + " of " + pomFile + 
" does not exist",
+                            "Child module " + module + " of " + pomFile + " 
does not exist",
                             ModelProblem.Severity.ERROR,
                             ModelProblem.Version.BASE,
                             model,
diff --git 
a/maven-core/src/main/java/org/apache/maven/project/collector/MultiModuleCollectionStrategy.java
 
b/maven-core/src/main/java/org/apache/maven/project/collector/MultiModuleCollectionStrategy.java
index fa38120f49..9f81694d40 100644
--- 
a/maven-core/src/main/java/org/apache/maven/project/collector/MultiModuleCollectionStrategy.java
+++ 
b/maven-core/src/main/java/org/apache/maven/project/collector/MultiModuleCollectionStrategy.java
@@ -97,15 +97,16 @@ public class MultiModuleCollectionStrategy implements 
ProjectCollectionStrategy
     }
 
     private File getMultiModuleProjectPomFile(MavenExecutionRequest request) {
-        if 
(request.getPom().getParentFile().equals(request.getMultiModuleProjectDirectory()))
 {
+        File multiModuleProjectDirectory = 
request.getMultiModuleProjectDirectory();
+        if 
(request.getPom().getParentFile().equals(multiModuleProjectDirectory)) {
             return request.getPom();
         } else {
-            File multiModuleProjectPom = 
modelLocator.locatePom(request.getMultiModuleProjectDirectory());
-            if (!multiModuleProjectPom.exists()) {
+            File multiModuleProjectPom = 
modelLocator.locateExistingPom(multiModuleProjectDirectory);
+            if (multiModuleProjectPom == null) {
                 LOGGER.info(
                         "Maven detected that the requested POM file is part of 
a multi-module project, "
                                 + "but could not find a pom.xml file in the 
multi-module root directory '{}'.",
-                        request.getMultiModuleProjectDirectory());
+                        multiModuleProjectDirectory);
                 LOGGER.info("The reactor is limited to all projects under: "
                         + request.getPom().getParent());
                 return request.getPom();
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java 
b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
index a1b6e032b5..99cf7dcf2c 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
@@ -1354,18 +1354,11 @@ public class MavenCli {
             current = resolveFile(new File(alternatePomFile), 
workingDirectory);
         }
 
-        File pom;
-        if (current.isDirectory() && modelProcessor != null) {
-            pom = modelProcessor.locatePom(current);
+        if (modelProcessor != null) {
+            return modelProcessor.locateExistingPom(current);
         } else {
-            pom = current;
+            return current.isFile() ? current : null;
         }
-
-        if (pom.isFile()) {
-            return pom;
-        }
-
-        return null;
     }
 
     // Visible for testing
diff --git a/maven-model-builder/pom.xml b/maven-model-builder/pom.xml
index 6e2975dd3b..dccf9056f9 100644
--- a/maven-model-builder/pom.xml
+++ b/maven-model-builder/pom.xml
@@ -144,6 +144,7 @@ under the License.
               
<exclude>org.apache.maven.model.interpolation.StringSearchModelInterpolator</exclude>
               
<exclude>org.apache.maven.model.interpolation.StringVisitorModelInterpolator</exclude>
               
<exclude>org.apache.maven.model.io.DefaultModelReader#DefaultModelReader():CONSTRUCTOR_REMOVED</exclude>
+              
<exclude>org.apache.maven.model.locator.ModelLocator#locateExistingPom(java.io.File):METHOD_NEW_DEFAULT</exclude>
               
<exclude>org.apache.maven.model.management.DefaultDependencyManagementInjector$ManagementModelMerger</exclude>
               
<exclude>org.apache.maven.model.management.DefaultPluginManagementInjector$ManagementModelMerger</exclude>
               <exclude>org.apache.maven.model.merge.MavenModelMerger</exclude>
diff --git 
a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
 
b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
index 9502c49ae0..ed76d6065c 100644
--- 
a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
+++ 
b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
@@ -1894,7 +1894,8 @@ public class DefaultModelBuilder implements ModelBuilder {
             return new TransformerContext() {
                 @Override
                 public Path locate(Path path) {
-                    return modelProcessor.locatePom(path.toFile()).toPath();
+                    File file = 
modelProcessor.locateExistingPom(path.toFile());
+                    return file != null ? file.toPath() : null;
                 }
 
                 @Override
diff --git 
a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProcessor.java
 
b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProcessor.java
index 916e80d42d..26eb70bb48 100644
--- 
a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProcessor.java
+++ 
b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProcessor.java
@@ -26,9 +26,11 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Reader;
+import java.nio.file.Path;
 import java.util.Map;
+import java.util.Objects;
 
-import org.apache.maven.model.Model;
+import org.apache.maven.building.Source;
 import org.apache.maven.model.io.ModelReader;
 import org.apache.maven.model.locator.ModelLocator;
 import org.eclipse.sisu.Typed;
@@ -63,32 +65,88 @@ import org.eclipse.sisu.Typed;
 @Typed(ModelProcessor.class)
 public class DefaultModelProcessor implements ModelProcessor {
 
-    private final ModelLocator locator;
-    private final ModelReader reader;
+    private final ModelLocator modelLocator;
+    private final ModelReader modelReader;
 
     @Inject
-    public DefaultModelProcessor(ModelLocator locator, ModelReader reader) {
-        this.locator = locator;
-        this.reader = reader;
+    public DefaultModelProcessor(ModelLocator modelLocator, ModelReader 
modelReader) {
+        this.modelLocator = modelLocator;
+        this.modelReader = modelReader;
     }
 
     @Override
     public File locatePom(File projectDirectory) {
-        return locator.locatePom(projectDirectory);
+        return locatePom(projectDirectory.toPath()).toFile();
+    }
+
+    public Path locatePom(Path projectDirectory) {
+        // Note that the ModelProcessor#locatePom never returns null
+        // while the ModelParser#locatePom needs to return an existing path!
+        Path pom = modelLocator.locatePom(projectDirectory.toFile()).toPath();
+        if (!pom.equals(projectDirectory) && 
!pom.getParent().equals(projectDirectory)) {
+            throw new IllegalArgumentException("The POM found does not belong 
to the given directory: " + pom);
+        }
+        return pom;
+    }
+
+    public File locateExistingPom(File projectDirectory) {
+        Path path = locateExistingPom(projectDirectory.toPath());
+        return path != null ? path.toFile() : null;
+    }
+
+    public Path locateExistingPom(Path projectDirectory) {
+        // Note that the ModelProcessor#locatePom never returns null
+        File f = modelLocator.locateExistingPom(projectDirectory.toFile());
+        Path pom = f != null ? f.toPath() : null;
+        if (pom != null && !pom.equals(projectDirectory) && 
!pom.getParent().equals(projectDirectory)) {
+            throw new IllegalArgumentException("The POM found does not belong 
to the given directory: " + pom);
+        }
+        return pom;
+    }
+
+    protected org.apache.maven.api.model.Model read(
+            Path pomFile, InputStream input, Reader reader, Map<String, ?> 
options) throws IOException {
+        Source source = (Source) options.get(ModelProcessor.SOURCE);
+        if (pomFile == null && source instanceof 
org.apache.maven.building.FileSource) {
+            pomFile = ((org.apache.maven.building.FileSource) 
source).getFile().toPath();
+        }
+        return readXmlModel(pomFile, input, reader, options);
+    }
+
+    private org.apache.maven.api.model.Model readXmlModel(
+            Path pomFile, InputStream input, Reader reader, Map<String, ?> 
options) throws IOException {
+        if (pomFile != null) {
+            return modelReader.read(pomFile.toFile(), options).getDelegate();
+        } else if (input != null) {
+            return modelReader.read(input, options).getDelegate();
+        } else {
+            return modelReader.read(reader, options).getDelegate();
+        }
     }
 
     @Override
-    public Model read(File input, Map<String, ?> options) throws IOException {
-        return reader.read(input, options);
+    public org.apache.maven.model.Model read(File file, Map<String, ?> 
options) throws IOException {
+        Objects.requireNonNull(file, "file cannot be null");
+        Path path = file.toPath();
+        org.apache.maven.api.model.Model model = read(path, null, null, 
options);
+        return new org.apache.maven.model.Model(model);
     }
 
     @Override
-    public Model read(Reader input, Map<String, ?> options) throws IOException 
{
-        return reader.read(input, options);
+    public org.apache.maven.model.Model read(InputStream input, Map<String, ?> 
options) throws IOException {
+        Objects.requireNonNull(input, "input cannot be null");
+        try (InputStream in = input) {
+            org.apache.maven.api.model.Model model = read(null, in, null, 
options);
+            return new org.apache.maven.model.Model(model);
+        }
     }
 
     @Override
-    public Model read(InputStream input, Map<String, ?> options) throws 
IOException {
-        return reader.read(input, options);
+    public org.apache.maven.model.Model read(Reader reader, Map<String, ?> 
options) throws IOException {
+        Objects.requireNonNull(reader, "reader cannot be null");
+        try (Reader r = reader) {
+            org.apache.maven.api.model.Model model = read(null, null, r, 
options);
+            return new org.apache.maven.model.Model(model);
+        }
     }
 }
diff --git 
a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultTransformerContext.java
 
b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultTransformerContext.java
index b933df316f..1497b128b3 100644
--- 
a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultTransformerContext.java
+++ 
b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultTransformerContext.java
@@ -18,6 +18,7 @@
  */
 package org.apache.maven.model.building;
 
+import java.io.File;
 import java.nio.file.Path;
 import java.util.Map;
 import java.util.Objects;
@@ -100,7 +101,8 @@ class DefaultTransformerContext implements 
TransformerContext {
 
     @Override
     public Path locate(Path path) {
-        return modelLocator.locatePom(path.toFile()).toPath();
+        File file = modelLocator.locateExistingPom(path.toFile());
+        return file != null ? file.toPath() : null;
     }
 
     static class GAKey {
diff --git 
a/maven-model-builder/src/main/java/org/apache/maven/model/building/FileModelSource.java
 
b/maven-model-builder/src/main/java/org/apache/maven/model/building/FileModelSource.java
index 858c42b8a1..5bbf0eb32f 100644
--- 
a/maven-model-builder/src/main/java/org/apache/maven/model/building/FileModelSource.java
+++ 
b/maven-model-builder/src/main/java/org/apache/maven/model/building/FileModelSource.java
@@ -54,13 +54,11 @@ public class FileModelSource extends FileSource implements 
ModelSource3 {
     public ModelSource3 getRelatedSource(ModelLocator locator, String relPath) 
{
         relPath = relPath.replace('\\', File.separatorChar).replace('/', 
File.separatorChar);
 
-        File relatedPom = new File(getFile().getParentFile(), relPath);
+        File path = new File(getFile().getParentFile(), relPath);
 
-        if (relatedPom.isDirectory() && locator != null) {
-            relatedPom = locator.locatePom(relatedPom);
-        }
+        File relatedPom = locator.locateExistingPom(path);
 
-        if (relatedPom.isFile() && relatedPom.canRead()) {
+        if (relatedPom != null) {
             return new 
FileModelSource(relatedPom.toPath().normalize().toFile());
         }
 
diff --git 
a/maven-model-builder/src/main/java/org/apache/maven/model/locator/DefaultModelLocator.java
 
b/maven-model-builder/src/main/java/org/apache/maven/model/locator/DefaultModelLocator.java
index 1a8ab6d760..eb51e75475 100644
--- 
a/maven-model-builder/src/main/java/org/apache/maven/model/locator/DefaultModelLocator.java
+++ 
b/maven-model-builder/src/main/java/org/apache/maven/model/locator/DefaultModelLocator.java
@@ -33,6 +33,21 @@ public class DefaultModelLocator implements ModelLocator {
 
     @Override
     public File locatePom(File projectDirectory) {
-        return new File(projectDirectory, "pom.xml");
+        return projectDirectory != null ? projectDirectory : new File(".");
+    }
+
+    @Override
+    public File locateExistingPom(File project) {
+        if (project == null || project.isDirectory()) {
+            project = locatePom(project);
+        }
+        if (project.isDirectory()) {
+            File pom = new File(project, "pom.xml");
+            return pom.isFile() ? pom : null;
+        } else if (project.isFile()) {
+            return project;
+        } else {
+            return null;
+        }
     }
 }
diff --git 
a/maven-model-builder/src/main/java/org/apache/maven/model/locator/ModelLocator.java
 
b/maven-model-builder/src/main/java/org/apache/maven/model/locator/ModelLocator.java
index c187a4d47f..27b073c71d 100644
--- 
a/maven-model-builder/src/main/java/org/apache/maven/model/locator/ModelLocator.java
+++ 
b/maven-model-builder/src/main/java/org/apache/maven/model/locator/ModelLocator.java
@@ -37,4 +37,14 @@ public interface ModelLocator {
      * @return The path to the (possibly non-existent) POM file, never {@code 
null}.
      */
     File locatePom(File projectDirectory);
+
+    /**
+     * Returns the file containing the pom or null if a pom can not be found 
at the given file or in the given directory.
+     */
+    default File locateExistingPom(File project) {
+        if (project == null || project.isDirectory()) {
+            project = locatePom(project);
+        }
+        return project.isFile() ? project : null;
+    }
 }
diff --git 
a/maven-model-transform/src/main/java/org/apache/maven/model/transform/ParentXMLFilter.java
 
b/maven-model-transform/src/main/java/org/apache/maven/model/transform/ParentXMLFilter.java
index 4361bfdf7f..a9cea3d282 100644
--- 
a/maven-model-transform/src/main/java/org/apache/maven/model/transform/ParentXMLFilter.java
+++ 
b/maven-model-transform/src/main/java/org/apache/maven/model/transform/ParentXMLFilter.java
@@ -20,7 +20,6 @@ package org.apache.maven.model.transform;
 
 import javax.xml.stream.XMLStreamReader;
 
-import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
@@ -132,12 +131,9 @@ class ParentXMLFilter extends NodeBufferingParser {
     }
 
     protected Optional<RelativeProject> resolveRelativePath(Path relativePath, 
String groupId, String artifactId) {
-        Path pomPath = projectPath.resolve(relativePath).normalize();
-        if (Files.isDirectory(pomPath) && modelLocator != null) {
-            pomPath = modelLocator.apply(pomPath);
-        }
+        Path pomPath = 
modelLocator.apply(projectPath.resolve(relativePath).normalize());
 
-        if (pomPath == null || !Files.isRegularFile(pomPath)) {
+        if (pomPath == null) {
             return Optional.empty();
         }
 

Reply via email to