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

kwin pushed a commit to branch bugfix/property-interpolation
in repository https://gitbox.apache.org/repos/asf/maven-doxia-sitetools.git

commit cd6157a0ecb3f2464b82103439a608f2c90f9f6d
Author: Konrad Windszus <[email protected]>
AuthorDate: Thu Mar 26 15:33:59 2026 +0100

    Interpolate using user and system properties in Site Descriptor
    
    This closes #629
---
 .../apache/maven/doxia/tools/DefaultSiteTool.java  | 55 ++++++++++++++++++----
 .../org/apache/maven/doxia/tools/SiteTool.java     | 31 ++++++++++++
 2 files changed, 77 insertions(+), 9 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 dfccf7e..4ec8318 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
@@ -38,6 +38,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Properties;
 import java.util.StringTokenizer;
 
 import org.apache.commons.io.FilenameUtils;
@@ -64,6 +65,7 @@ import 
org.apache.maven.doxia.site.decoration.io.xpp3.DecorationXpp3Reader;
 import org.apache.maven.doxia.site.inheritance.SiteModelInheritanceAssembler;
 import org.apache.maven.doxia.site.io.xpp3.SiteXpp3Reader;
 import org.apache.maven.doxia.site.io.xpp3.SiteXpp3Writer;
+import org.apache.maven.execution.MavenExecutionRequest;
 import org.apache.maven.model.DistributionManagement;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.project.MavenProject;
@@ -374,10 +376,24 @@ public class DefaultSiteTool implements SiteTool {
         }
     }
 
-    /** {@inheritDoc} */
+    @Override
+    public SiteModel getSiteModel(
+            File siteDirectory,
+            Locale locale,
+            MavenProject project,
+            List<MavenProject> reactorProjects,
+            RepositorySystemSession repoSession,
+            List<RemoteRepository> remoteProjectRepositories)
+            throws SiteToolException {
+        return getSiteModel(
+                siteDirectory, locale, null, project, reactorProjects, 
repoSession, remoteProjectRepositories);
+    }
+
+    @Override
     public SiteModel getSiteModel(
             File siteDirectory,
             Locale locale,
+            MavenExecutionRequest request,
             MavenProject project,
             List<MavenProject> reactorProjects,
             RepositorySystemSession repoSession,
@@ -393,7 +409,7 @@ public class DefaultSiteTool implements SiteTool {
                 + (locale.equals(SiteTool.DEFAULT_LOCALE) ? "default locale" : 
"locale '" + locale + "'"));
 
         Map.Entry<SiteModel, MavenProject> result =
-                getSiteModel(0, siteDirectory, locale, project, repoSession, 
remoteProjectRepositories);
+                getSiteModel(0, siteDirectory, locale, request, project, 
repoSession, remoteProjectRepositories);
         SiteModel siteModel = result.getKey();
         MavenProject parentProject = result.getValue();
 
@@ -406,7 +422,7 @@ public class DefaultSiteTool implements SiteTool {
         String siteDescriptorContent = siteModelToString(siteModel);
 
         // "classical" late interpolation, after full inheritance
-        siteDescriptorContent = getInterpolatedSiteDescriptorContent(project, 
siteDescriptorContent, false);
+        siteDescriptorContent = getInterpolatedSiteDescriptorContent(request, 
project, siteDescriptorContent, false);
 
         siteModel = readSiteModel(siteDescriptorContent, project, locale);
 
@@ -429,11 +445,12 @@ public class DefaultSiteTool implements SiteTool {
         Objects.requireNonNull(props, "props cannot be null");
 
         // "classical" late interpolation
-        return getInterpolatedSiteDescriptorContent(aProject, 
siteDescriptorContent, false);
+        return getInterpolatedSiteDescriptorContent(null, aProject, 
siteDescriptorContent, false);
     }
 
     private String getInterpolatedSiteDescriptorContent(
-            MavenProject aProject, String siteDescriptorContent, boolean 
isEarly) throws SiteToolException {
+            MavenExecutionRequest request, MavenProject aProject, String 
siteDescriptorContent, boolean isEarly)
+            throws SiteToolException {
         Objects.requireNonNull(aProject, "aProject cannot be null");
         Objects.requireNonNull(siteDescriptorContent, "siteDescriptorContent 
cannot be null");
 
@@ -441,10 +458,11 @@ public class DefaultSiteTool implements SiteTool {
 
         if (isEarly) {
             interpolator.addValueSource(new PrefixedObjectValueSource("this.", 
aProject));
-            interpolator.addValueSource(new 
PrefixedPropertiesValueSource("this.", aProject.getProperties()));
+            interpolator.addValueSource(new 
PrefixedPropertiesValueSource("this.", mergeProperties(request, aProject)));
+
         } else {
             interpolator.addValueSource(new 
PrefixedObjectValueSource("project.", aProject));
-            interpolator.addValueSource(new 
MapBasedValueSource(aProject.getProperties()));
+            interpolator.addValueSource(new 
MapBasedValueSource(mergeProperties(request, aProject)));
 
             try {
                 interpolator.addValueSource(new EnvarBasedValueSource());
@@ -477,6 +495,17 @@ public class DefaultSiteTool implements SiteTool {
         }
     }
 
+    private static Properties mergeProperties(MavenExecutionRequest request, 
MavenProject aProject) {
+        Properties merged = new Properties();
+        if (request != null) {
+            merged.putAll(request.getSystemProperties());
+        }
+        merged.putAll(aProject.getProperties());
+        if (request != null) {
+            merged.putAll(request.getUserProperties());
+        }
+        return merged;
+    }
     /**
      * Populate the pre-defined <code>parent</code> menu of the site model,
      * if used through <code>&lt;menu ref="parent"/&gt;</code>.
@@ -968,6 +997,7 @@ public class DefaultSiteTool implements SiteTool {
             int depth,
             File siteDirectory,
             Locale locale,
+            MavenExecutionRequest request,
             MavenProject project,
             RepositorySystemSession repoSession,
             List<RemoteRepository> remoteProjectRepositories)
@@ -1000,7 +1030,8 @@ public class DefaultSiteTool implements SiteTool {
                 String siteDescriptorContent = 
IOUtil.toString(siteDescriptorReader);
 
                 // interpolate ${this.*} = early interpolation
-                siteDescriptorContent = 
getInterpolatedSiteDescriptorContent(project, siteDescriptorContent, true);
+                siteDescriptorContent =
+                        getInterpolatedSiteDescriptorContent(request, project, 
siteDescriptorContent, true);
 
                 siteModel = readSiteModel(siteDescriptorContent, project, 
locale);
                 siteModel.setLastModified(siteDescriptor.lastModified());
@@ -1035,7 +1066,13 @@ public class DefaultSiteTool implements SiteTool {
             }
 
             SiteModel parentSiteModel = getSiteModel(
-                            depth, parentSiteDirectory, locale, parentProject, 
repoSession, remoteProjectRepositories)
+                            depth,
+                            parentSiteDirectory,
+                            locale,
+                            request,
+                            parentProject,
+                            repoSession,
+                            remoteProjectRepositories)
                     .getKey();
 
             if (siteModel != null) {
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 27d769b..502fcc2 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,6 +26,7 @@ import java.util.Map;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.doxia.site.SiteModel;
 import org.apache.maven.doxia.site.Skin;
+import org.apache.maven.execution.MavenExecutionRequest;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.reporting.MavenReport;
 import org.eclipse.aether.RepositorySystemSession;
@@ -100,7 +101,9 @@ public interface SiteTool {
      * @param siteDescriptorContent the site descriptor file, not null.
      * @return the interpolated site descriptor content.
      * @throws SiteToolException if errors happened during the interpolation.
+     * @deprecated since 2.1.0, use {@link #getSiteModel(File, Locale, 
MavenExecutionRequest, MavenProject, List, RepositorySystemSession, List)} 
instead
      */
+    @Deprecated
     // used by maven-pdf-plugin (should not?)
     String getInterpolatedSiteDescriptorContent(
             Map<String, String> props, MavenProject aProject, String 
siteDescriptorContent) throws SiteToolException;
@@ -119,7 +122,9 @@ public interface SiteTool {
      * interpolations.
      * @throws SiteToolException if any
      * @since 1.7, was previously with other parameter types and order
+     * @deprecated since 2.1.0, use {@link #getSiteModel(File, Locale, 
MavenExecutionRequest, MavenProject, List, RepositorySystemSession, List)} 
instead
      */
+    @Deprecated
     SiteModel getSiteModel(
             File siteDirectory,
             Locale locale,
@@ -129,6 +134,32 @@ public interface SiteTool {
             List<RemoteRepository> remoteProjectRepositories)
             throws SiteToolException;
 
+    /**
+     * Get a site model for a project.
+     *
+     * @param siteDirectory the site directory, may be null if project from 
repository
+     * @param locale the locale used for the i18n in SiteModel, not null.
+     * See {@link #getSiteDescriptor(File, Locale)} for details.
+     * @param project the Maven project, not null.
+     * @param request the Maven execution request (may be null). This is 
needed to get the user properties and the system properties for interpolation.
+     * @param reactorProjects the Maven reactor projects, not null.
+     * @param repoSession the repository system session, not null.
+     * @param remoteProjectRepositories the Maven remote project repositories, 
not null.
+     * @return the <code>SiteModel</code> object corresponding to the 
<code>site.xml</code> file with some
+     * interpolations.
+     * @throws SiteToolException if any
+     * @since 2.1.0, was previously with other parameter types and order
+     */
+    SiteModel getSiteModel(
+            File siteDirectory,
+            Locale locale,
+            MavenExecutionRequest request,
+            MavenProject project,
+            List<MavenProject> reactorProjects,
+            RepositorySystemSession repoSession,
+            List<RemoteRepository> remoteProjectRepositories)
+            throws SiteToolException;
+
     /**
      * Populate the pre-defined <code>reports</code> menu of the site model,
      * if used through <code>&lt;menu ref="reports"/&gt;</code>. Notice this 
menu reference is translated into

Reply via email to