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

michaelo pushed a commit to branch replace-old-resolution
in repository https://gitbox.apache.org/repos/asf/maven-doxia-sitetools.git

commit 41e782bdead030334005aa79d9d523e41be7880d
Author: Michael Osipov <[email protected]>
AuthorDate: Sun Mar 12 22:42:29 2023 +0100

    First try
---
 .../apache/maven/doxia/tools/DefaultSiteTool.java  | 294 +++++++++++----------
 .../org/apache/maven/doxia/tools/SiteTool.java     |  21 +-
 2 files changed, 165 insertions(+), 150 deletions(-)

diff --git 
a/doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/DefaultSiteTool.java
 
b/doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/DefaultSiteTool.java
index 7b95cb8..1824783 100644
--- 
a/doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/DefaultSiteTool.java
+++ 
b/doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/DefaultSiteTool.java
@@ -40,11 +40,13 @@ import java.util.Objects;
 import java.util.StringTokenizer;
 
 import org.apache.commons.io.FilenameUtils;
+import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.ArtifactUtils;
+import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.artifact.handler.ArtifactHandler;
+import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
 import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
 import org.apache.maven.artifact.resolver.ArtifactResolver;
 import 
org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
 import org.apache.maven.artifact.versioning.VersionRange;
@@ -77,6 +79,13 @@ import org.codehaus.plexus.util.ReaderFactory;
 import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.ArtifactType;
+import org.eclipse.aether.resolution.ArtifactRequest;
+import org.eclipse.aether.resolution.ArtifactResolutionException;
+import org.eclipse.aether.resolution.ArtifactResult;
+import org.eclipse.aether.transfer.ArtifactNotFoundException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -95,16 +104,16 @@ public class DefaultSiteTool implements SiteTool {
     // ----------------------------------------------------------------------
 
     /**
-     * The component that is used to resolve additional artifacts required.
+     * The component that is used to resolve additional required artifacts.
      */
     @Inject
-    private ArtifactResolver artifactResolver;
+    protected RepositorySystem repositorySystem;
 
     /**
-     * The component used for creating artifact instances.
+     * The component used for getting artifact handler managers.
      */
     @Inject
-    private ArtifactFactory artifactFactory;
+    private ArtifactHandlerManager artifactHandlerManager;
 
     /**
      * Internationalization.
@@ -128,36 +137,45 @@ public class DefaultSiteTool implements SiteTool {
     // Public methods
     // ----------------------------------------------------------------------
 
+    /** {@inheritDoc} */
     public Artifact getSkinArtifactFromRepository(
-            ArtifactRepository localRepository,
+            RepositorySystemSession repoSession,
             List<ArtifactRepository> remoteArtifactRepositories,
-            DecorationModel decoration)
+            Skin skin)
             throws SiteToolException {
-        Objects.requireNonNull(localRepository, "localRepository cannot be 
null");
+        Objects.requireNonNull(repoSession, "repoSession cannot be null");
         Objects.requireNonNull(remoteArtifactRepositories, 
"remoteArtifactRepositories cannot be null");
-        Objects.requireNonNull(decoration, "decoration cannot be null");
-        Skin skin = Objects.requireNonNull(decoration.getSkin(), 
"decoration.skin cannot be null");
+        Objects.requireNonNull(skin, "skin cannot be null");
 
         String version = skin.getVersion();
-        Artifact artifact;
         try {
             if (version == null) {
                 version = Artifact.RELEASE_VERSION;
             }
             VersionRange versionSpec = 
VersionRange.createFromVersionSpec(version);
-            artifact = artifactFactory.createDependencyArtifact(
-                    skin.getGroupId(), skin.getArtifactId(), versionSpec, 
"jar", null, null);
-
-            artifactResolver.resolve(artifact, remoteArtifactRepositories, 
localRepository);
+            String type = "jar";
+            Artifact artifact = new DefaultArtifact(skin.getGroupId(), 
skin.getArtifactId(), versionSpec,
+                    Artifact.SCOPE_RUNTIME, type, null,
+                    artifactHandlerManager.getArtifactHandler(type));
+             ArtifactRequest request = new ArtifactRequest(
+                    RepositoryUtils.toArtifact(artifact),
+                    RepositoryUtils.toRepos(remoteArtifactRepositories),
+                    "remote-skin");
+            ArtifactResult result = 
repositorySystem.resolveArtifact(repoSession, request);
+
+            if (!result.isResolved())
+                throw new SiteToolException(
+                        "The skin '" + ArtifactUtils.key(artifact) + "' does 
not exist",
+                        result.getExceptions().stream().filter(
+                                e -> (e instanceof ArtifactNotFoundException))
+                                .findFirst().orElse(null));
+
+            return RepositoryUtils.toArtifact(result.getArtifact());
         } catch (InvalidVersionSpecificationException e) {
             throw new SiteToolException("The skin version '" + version + "' is 
not valid", e);
         } catch (ArtifactResolutionException e) {
             throw new SiteToolException("Unable to find skin", e);
-        } catch (ArtifactNotFoundException e) {
-            throw new SiteToolException("The skin does not exist", e);
         }
-
-        return artifact;
     }
 
     /**
@@ -325,8 +343,8 @@ public class DefaultSiteTool implements SiteTool {
      * Get a site descriptor from one of the repositories.
      *
      * @param project the Maven project, not null.
-     * @param localRepository the Maven local repository, not null.
-     * @param repositories the Maven remote repositories, not null.
+     * @param repoSession the repository system session, not null.
+     * @param remoteArtifactRepositories the Maven remote repositories, not 
null.
      * @param locale the locale wanted for the site descriptor, not null.
      * See {@link #getSiteDescriptor(File, Locale)} for details.
      * @return the site descriptor into the local repository after download of 
it from repositories or null if not
@@ -335,17 +353,17 @@ public class DefaultSiteTool implements SiteTool {
      */
     File getSiteDescriptorFromRepository(
             MavenProject project,
-            ArtifactRepository localRepository,
-            List<ArtifactRepository> repositories,
+            RepositorySystemSession repoSession,
+            List<ArtifactRepository> remoteArtifactRepositories,
             Locale locale)
             throws SiteToolException {
         Objects.requireNonNull(project, "project cannot be null");
-        Objects.requireNonNull(localRepository, "localRepository cannot be 
null");
-        Objects.requireNonNull(repositories, "repositories cannot be null");
+        Objects.requireNonNull(repoSession, "repoSession cannot be null");
+        Objects.requireNonNull(remoteArtifactRepositories, 
"remoteArtifactRepositories cannot be null");
         Objects.requireNonNull(locale, "locale cannot be null");
 
         try {
-            return resolveSiteDescriptor(project, localRepository, 
repositories, locale);
+            return resolveSiteDescriptor(project, repoSession, 
remoteArtifactRepositories, locale);
         } catch (ArtifactNotFoundException e) {
             LOGGER.debug("Unable to locate site descriptor", e);
             return null;
@@ -362,20 +380,20 @@ public class DefaultSiteTool implements SiteTool {
             Locale locale,
             MavenProject project,
             List<MavenProject> reactorProjects,
-            ArtifactRepository localRepository,
-            List<ArtifactRepository> repositories)
+            RepositorySystemSession repoSession,
+            List<ArtifactRepository> remoteArtifactRepositories)
             throws SiteToolException {
         Objects.requireNonNull(locale, "locale cannot be null");
         Objects.requireNonNull(project, "project cannot be null");
         Objects.requireNonNull(reactorProjects, "reactorProjects cannot be 
null");
-        Objects.requireNonNull(localRepository, "localRepository cannot be 
null");
-        Objects.requireNonNull(repositories, "repositories cannot be null");
+        Objects.requireNonNull(repoSession, "repoSession cannot be null");
+        Objects.requireNonNull(remoteArtifactRepositories, 
"remoteArtifactRepositories cannot be null");
 
         LOGGER.debug("Computing decoration model of '" + project.getId() + "' 
for "
                 + (locale.equals(SiteTool.DEFAULT_LOCALE) ? "default locale" : 
"locale '" + locale + "'"));
 
         Map.Entry<DecorationModel, MavenProject> result =
-                getDecorationModel(0, siteDirectory, locale, project, 
reactorProjects, localRepository, repositories);
+                getDecorationModel(0, siteDirectory, locale, project, 
reactorProjects, repoSession, remoteArtifactRepositories);
         DecorationModel decorationModel = result.getKey();
         MavenProject parentProject = result.getValue();
 
@@ -397,7 +415,7 @@ public class DefaultSiteTool implements SiteTool {
         }
 
         try {
-            populateModulesMenu(decorationModel, locale, project, 
reactorProjects, localRepository, true);
+            populateModulesMenu(decorationModel, locale, project, 
reactorProjects, repoSession.getLocalRepository(), true);
         } catch (IOException e) {
             throw new SiteToolException("Error while populating modules menu", 
e);
         }
@@ -796,8 +814,8 @@ public class DefaultSiteTool implements SiteTool {
 
     /**
      * @param project not null
-     * @param localRepository not null
-     * @param repositories not null
+     * @param repoSession the repository system session not null
+     * @param remoteArtifactRepositories not null
      * @param locale not null
      * @return the resolved site descriptor
      * @throws IOException if any
@@ -806,129 +824,125 @@ public class DefaultSiteTool implements SiteTool {
      */
     private File resolveSiteDescriptor(
             MavenProject project,
-            ArtifactRepository localRepository,
-            List<ArtifactRepository> repositories,
+            RepositorySystemSession repoSession,
+            List<ArtifactRepository> remoteArtifactRepositories,
             Locale locale)
             throws IOException, ArtifactResolutionException, 
ArtifactNotFoundException {
         String variant = locale.getVariant();
         String country = locale.getCountry();
         String language = locale.getLanguage();
 
+        String type = "xml";
+        ArtifactHandler artifactHandler = 
artifactHandlerManager.getArtifactHandler(type);
+
         Artifact artifact = null;
         File siteDescriptor = null;
         boolean found = false;
 
         if (!variant.isEmpty()) {
             String localeStr = language + "_" + country + "_" + variant;
-            // TODO: this is a bit crude - proper type, or proper handling as 
metadata rather than an artifact in 2.1?
-            artifact = artifactFactory.createArtifactWithClassifier(
-                    project.getGroupId(), project.getArtifactId(), 
project.getVersion(), "xml", "site_" + localeStr);
-
-            try {
-                artifactResolver.resolve(artifact, repositories, 
localRepository);
-
-                siteDescriptor = artifact.getFile();
-
-                // we use zero length files to avoid re-resolution (see below)
-                if (siteDescriptor.length() > 0) {
-                    found = true;
-                } else {
+            artifact = new DefaultArtifact(project.getGroupId(), 
project.getArtifactId(), project.getVersion(),
+                    Artifact.SCOPE_RUNTIME, type, "site_" + localeStr,
+                    artifactHandler);
+             ArtifactRequest request = new ArtifactRequest(
+                    RepositoryUtils.toArtifact(artifact),
+                    RepositoryUtils.toRepos(remoteArtifactRepositories),
+                    "remote-site-descriptor");
+
+             ArtifactResult result = 
repositorySystem.resolveArtifact(repoSession, request);
+
+             if (result.isResolved()) {
+                siteDescriptor = result.getArtifact().getFile();
+                found = true;
+             } else {
+                Exception anfe = result.getExceptions().stream().filter(
+                         e -> (e instanceof 
ArtifactNotFoundException)).findFirst().orElse(null);
+                 if (anfe == null) {
                     LOGGER.debug("No site descriptor found for '" + 
project.getId() + "' for locale '" + localeStr
-                            + "', trying without variant...");
-                }
-            } catch (ArtifactNotFoundException e) {
-                LOGGER.debug("Unable to locate site descriptor for locale '" + 
localeStr + "'", e);
-
-                // we can afford to write an empty descriptor here as we don't 
expect it to turn up later in the
-                // remote repository, because the parent was already released 
(and snapshots are updated
-                // automatically if changed)
-                siteDescriptor = new File(localRepository.getBasedir(), 
localRepository.pathOf(artifact));
-                siteDescriptor.getParentFile().mkdirs();
-                siteDescriptor.createNewFile();
-            }
+                             + "', trying without variant...");
+                 } else {
+                    LOGGER.debug("Unable to locate site descriptor for locale 
'" + localeStr + "'", anfe);
+                 }
+             }
         }
 
         if (!found && !country.isEmpty()) {
             String localeStr = language + "_" + country;
-            // TODO: this is a bit crude - proper type, or proper handling as 
metadata rather than an artifact in 2.1?
-            artifact = artifactFactory.createArtifactWithClassifier(
-                    project.getGroupId(), project.getArtifactId(), 
project.getVersion(), "xml", "site_" + localeStr);
-
-            try {
-                artifactResolver.resolve(artifact, repositories, 
localRepository);
-
-                siteDescriptor = artifact.getFile();
-
-                // we use zero length files to avoid re-resolution (see below)
-                if (siteDescriptor.length() > 0) {
-                    found = true;
-                } else {
+            artifact = new DefaultArtifact(project.getGroupId(), 
project.getArtifactId(), project.getVersion(),
+                    Artifact.SCOPE_RUNTIME, type, "site_" + localeStr,
+                    artifactHandler);
+             ArtifactRequest request = new ArtifactRequest(
+                    RepositoryUtils.toArtifact(artifact),
+                    RepositoryUtils.toRepos(remoteArtifactRepositories),
+                    "remote-site-descriptor");
+
+             ArtifactResult result = 
repositorySystem.resolveArtifact(repoSession, request);
+
+             if (result.isResolved()) {
+                siteDescriptor = result.getArtifact().getFile();
+                found = true;
+             } else {
+                Exception anfe = result.getExceptions().stream().filter(
+                         e -> (e instanceof 
ArtifactNotFoundException)).findFirst().orElse(null);
+                 if (anfe == null) {
                     LOGGER.debug("No site descriptor found for '" + 
project.getId() + "' for locale '" + localeStr
-                            + "', trying without country...");
-                }
-            } catch (ArtifactNotFoundException e) {
-                LOGGER.debug("Unable to locate site descriptor for locale '" + 
localeStr + "'", e);
-
-                // we can afford to write an empty descriptor here as we don't 
expect it to turn up later in the
-                // remote repository, because the parent was already released 
(and snapshots are updated
-                // automatically if changed)
-                siteDescriptor = new File(localRepository.getBasedir(), 
localRepository.pathOf(artifact));
-                siteDescriptor.getParentFile().mkdirs();
-                siteDescriptor.createNewFile();
-            }
+                             + "', trying without country...");
+                 } else {
+                    LOGGER.debug("Unable to locate site descriptor for locale 
'" + localeStr + "'", anfe);
+                 }
+             }
         }
 
         if (!found && !language.isEmpty()) {
             String localeStr = language;
-            // TODO: this is a bit crude - proper type, or proper handling as 
metadata rather than an artifact in 2.1?
-            artifact = artifactFactory.createArtifactWithClassifier(
-                    project.getGroupId(), project.getArtifactId(), 
project.getVersion(), "xml", "site_" + localeStr);
-
-            try {
-                artifactResolver.resolve(artifact, repositories, 
localRepository);
-
-                siteDescriptor = artifact.getFile();
-
-                // we use zero length files to avoid re-resolution (see below)
-                if (siteDescriptor.length() > 0) {
-                    found = true;
-                } else {
+            artifact = new DefaultArtifact(project.getGroupId(), 
project.getArtifactId(), project.getVersion(),
+                    Artifact.SCOPE_RUNTIME, type, "site_" + localeStr,
+                    artifactHandler);
+             ArtifactRequest request = new ArtifactRequest(
+                    RepositoryUtils.toArtifact(artifact),
+                    RepositoryUtils.toRepos(remoteArtifactRepositories),
+                    "remote-site-descriptor");
+
+             ArtifactResult result = 
repositorySystem.resolveArtifact(repoSession, request);
+
+             if (result.isResolved()) {
+                siteDescriptor = result.getArtifact().getFile();
+                found = true;
+             } else {
+                Exception anfe = result.getExceptions().stream().filter(
+                         e -> (e instanceof 
ArtifactNotFoundException)).findFirst().orElse(null);
+                 if (anfe == null) {
                     LOGGER.debug("No site descriptor found for '" + 
project.getId() + "' for locale '" + localeStr
-                            + "', trying default locale...");
-                }
-            } catch (ArtifactNotFoundException e) {
-                LOGGER.debug("Unable to locate site descriptor for locale '" + 
localeStr + "'", e);
-
-                // we can afford to write an empty descriptor here as we don't 
expect it to turn up later in the
-                // remote repository, because the parent was already released 
(and snapshots are updated
-                // automatically if changed)
-                siteDescriptor = new File(localRepository.getBasedir(), 
localRepository.pathOf(artifact));
-                siteDescriptor.getParentFile().mkdirs();
-                siteDescriptor.createNewFile();
-            }
+                             + "', trying default locale...");
+                 } else {
+                    LOGGER.debug("Unable to locate site descriptor for locale 
'" + localeStr + "'", anfe);
+                 }
+             }
         }
 
         if (!found) {
-            artifact = artifactFactory.createArtifactWithClassifier(
-                    project.getGroupId(), project.getArtifactId(), 
project.getVersion(), "xml", "site");
-            try {
-                artifactResolver.resolve(artifact, repositories, 
localRepository);
-            } catch (ArtifactNotFoundException e) {
-                // see above regarding this zero length file
-                siteDescriptor = new File(localRepository.getBasedir(), 
localRepository.pathOf(artifact));
-                siteDescriptor.getParentFile().mkdirs();
-                siteDescriptor.createNewFile();
-
-                throw e;
-            }
-
-            siteDescriptor = artifact.getFile();
-
-            // we use zero length files to avoid re-resolution (see below)
-            if (siteDescriptor.length() == 0) {
-                LOGGER.debug("No site descriptor found for '" + 
project.getId() + "' with default locale.");
-                siteDescriptor = null;
-            }
+            artifact = new DefaultArtifact(project.getGroupId(), 
project.getArtifactId(), project.getVersion(),
+                    Artifact.SCOPE_RUNTIME, type, "site",
+                    artifactHandler);
+             ArtifactRequest request = new ArtifactRequest(
+                    RepositoryUtils.toArtifact(artifact),
+                    RepositoryUtils.toRepos(remoteArtifactRepositories),
+                    "remote-site-descriptor");
+
+             ArtifactResult result = 
repositorySystem.resolveArtifact(repoSession, request);
+
+             if (result.isResolved()) {
+                siteDescriptor = result.getArtifact().getFile();
+             } else {
+                Exception anfe = result.getExceptions().stream().filter(
+                         e -> (e instanceof 
ArtifactNotFoundException)).findFirst().orElse(null);
+                 if (anfe == null) {
+                    LOGGER.debug("No site descriptor found for '" + 
project.getId() + "' with default locale.");
+                    siteDescriptor = null;
+                 } else {
+                    throw (ArtifactNotFoundException) anfe;
+                 }
+             }
         }
 
         return siteDescriptor;
@@ -940,8 +954,8 @@ public class DefaultSiteTool implements SiteTool {
      * @param locale not null
      * @param project not null
      * @param reactorProjects not null
-     * @param localRepository not null
-     * @param repositories not null
+     * @param repoSession not null
+     * @param remoteArtifactRepositories not null
      * @return the decoration model depending the locale and the parent project
      * @throws SiteToolException if any
      */
@@ -951,15 +965,15 @@ public class DefaultSiteTool implements SiteTool {
             Locale locale,
             MavenProject project,
             List<MavenProject> reactorProjects,
-            ArtifactRepository localRepository,
-            List<ArtifactRepository> repositories)
+            RepositorySystemSession repoSession,
+            List<ArtifactRepository> remoteArtifactRepositories)
             throws SiteToolException {
         // 1. get site descriptor File
         File siteDescriptor;
         if (project.getBasedir() == null) {
             // POM is in the repository: look into the repository for site 
descriptor
             try {
-                siteDescriptor = getSiteDescriptorFromRepository(project, 
localRepository, repositories, locale);
+                siteDescriptor = getSiteDescriptorFromRepository(project, 
repoSession, remoteArtifactRepositories, locale);
             } catch (SiteToolException e) {
                 throw new SiteToolException("The site descriptor cannot be 
resolved from the repository", e);
             }
@@ -1021,8 +1035,8 @@ public class DefaultSiteTool implements SiteTool {
                             locale,
                             parentProject,
                             reactorProjects,
-                            localRepository,
-                            repositories)
+                            repoSession,
+                            remoteArtifactRepositories)
                     .getKey();
 
             // MSHARED-116 requires an empty decoration model (instead of a 
null one)
diff --git 
a/doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/SiteTool.java
 
b/doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/SiteTool.java
index c31d30e..c4e3578 100644
--- 
a/doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/SiteTool.java
+++ 
b/doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/SiteTool.java
@@ -26,8 +26,10 @@ import java.util.Map;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.doxia.site.decoration.DecorationModel;
+import org.apache.maven.doxia.site.decoration.Skin;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.reporting.MavenReport;
+import org.eclipse.aether.RepositorySystemSession;
 
 /**
  * Tool to play with <a href="http://maven.apache.org/doxia/";>Doxia</a> objects
@@ -46,17 +48,16 @@ public interface SiteTool {
     /**
      * Get a skin artifact from one of the repositories.
      *
-     * @param localRepository the Maven local repository, not null.
+     * @param repoSession the repository system session, not null.
      * @param remoteArtifactRepositories the Maven remote repositories, not 
null.
-     * @param decoration the Doxia site descriptor model, not null.
-     * @return the <code>Skin</code> artifact defined in a 
<code>DecorationModel</code> from a given project and a
-     * local repository
+     * @param skin the Skin model, not null.
+     * @return the <code>Skin</code> artifact defined in a 
<code>DecorationModel</code> from a given project
      * @throws SiteToolException if any
      */
     Artifact getSkinArtifactFromRepository(
-            ArtifactRepository localRepository,
+            RepositorySystemSession repoSession,
             List<ArtifactRepository> remoteArtifactRepositories,
-            DecorationModel decoration)
+            Skin skin)
             throws SiteToolException;
 
     /**
@@ -115,8 +116,8 @@ public interface SiteTool {
      * See {@link #getSiteDescriptor(File, Locale)} for details.
      * @param project the Maven project, not null.
      * @param reactorProjects the Maven reactor projects, not null.
-     * @param localRepository the Maven local repository, not null.
-     * @param repositories the Maven remote repositories, not null.
+     * @param repoSession the repository system session, not null.
+     * @param remoteArtifactRepositories the Maven remote repositories, not 
null.
      * @return the <code>DecorationModel</code> object corresponding to the 
<code>site.xml</code> file with some
      * interpolations.
      * @throws SiteToolException if any
@@ -127,8 +128,8 @@ public interface SiteTool {
             Locale locale,
             MavenProject project,
             List<MavenProject> reactorProjects,
-            ArtifactRepository localRepository,
-            List<ArtifactRepository> repositories)
+            RepositorySystemSession repoSession,
+            List<ArtifactRepository> remoteArtifactRepositories)
             throws SiteToolException;
 
     /**

Reply via email to