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

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


The following commit(s) were added to refs/heads/master by this push:
     new 00f634b  Interpolate using user and system properties in Site 
Descriptor (#630)
00f634b is described below

commit 00f634b6a839f057aaa2bce08cd9a35d8160d3ed
Author: Konrad Windszus <[email protected]>
AuthorDate: Tue Mar 31 11:41:35 2026 +0200

    Interpolate using user and system properties in Site Descriptor (#630)
    
    This closes #629
---
 .../apache/maven/doxia/tools/DefaultSiteTool.java  | 85 +++++++++++++++++++---
 .../org/apache/maven/doxia/tools/SiteTool.java     | 31 ++++++++
 doxia-integration-tools/src/site/apt/index.apt     |  1 +
 .../org/apache/maven/doxia/tools/SiteToolTest.java | 33 +++++++++
 .../unit/interpolation-parent-test/pom.xml         |  2 +
 .../interpolation-parent-test/src/site/site.xml    | 10 ++-
 6 files changed, 151 insertions(+), 11 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..9450da4 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,8 @@ 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.DefaultMavenExecutionRequest;
+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,16 +377,38 @@ public class DefaultSiteTool implements SiteTool {
         }
     }
 
-    /** {@inheritDoc} */
+    @Override
+    @Deprecated
+    public SiteModel getSiteModel(
+            File siteDirectory,
+            Locale locale,
+            MavenProject project,
+            List<MavenProject> reactorProjects,
+            RepositorySystemSession repoSession,
+            List<RemoteRepository> remoteProjectRepositories)
+            throws SiteToolException {
+        return getSiteModel(
+                siteDirectory,
+                locale,
+                new DefaultMavenExecutionRequest(),
+                project,
+                reactorProjects,
+                repoSession,
+                remoteProjectRepositories);
+    }
+
+    @Override
     public SiteModel getSiteModel(
             File siteDirectory,
             Locale locale,
+            MavenExecutionRequest request,
             MavenProject project,
             List<MavenProject> reactorProjects,
             RepositorySystemSession repoSession,
             List<RemoteRepository> remoteProjectRepositories)
             throws SiteToolException {
         Objects.requireNonNull(locale, "locale cannot be null");
+        Objects.requireNonNull(locale, "request cannot be null");
         Objects.requireNonNull(project, "project cannot be null");
         Objects.requireNonNull(reactorProjects, "reactorProjects cannot be 
null");
         Objects.requireNonNull(repoSession, "repoSession cannot be null");
@@ -393,7 +418,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 +431,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);
 
@@ -423,17 +448,31 @@ public class DefaultSiteTool implements SiteTool {
         return siteModel;
     }
 
-    /** {@inheritDoc} */
+    @Override
+    @Deprecated
     public String getInterpolatedSiteDescriptorContent(
             Map<String, String> props, MavenProject aProject, String 
siteDescriptorContent) throws SiteToolException {
         Objects.requireNonNull(props, "props cannot be null");
 
         // "classical" late interpolation
-        return getInterpolatedSiteDescriptorContent(aProject, 
siteDescriptorContent, false);
+        return getInterpolatedSiteDescriptorContent(
+                new DefaultMavenExecutionRequest(), aProject, 
siteDescriptorContent, false);
     }
 
+    /**
+     * Interpolation similar to what <a 
href="https://github.com/apache/maven/blob/add3c9d4578ec56bfe7377cd26a486039c5b4af7/compat/maven-model-builder/src/main/java/org/apache/maven/model/interpolation/AbstractStringBasedModelInterpolator.java#L52";>AbstractStringBasedModelInterpolator.java</a>
+     * is doing.
+     * @param request
+     * @param aProject
+     * @param siteDescriptorContent
+     * @param isEarly
+     * @return the interpolated site descriptor content
+     * @throws SiteToolException
+     */
     private String getInterpolatedSiteDescriptorContent(
-            MavenProject aProject, String siteDescriptorContent, boolean 
isEarly) throws SiteToolException {
+            MavenExecutionRequest request, MavenProject aProject, String 
siteDescriptorContent, boolean isEarly)
+            throws SiteToolException {
+        Objects.requireNonNull(request, "request cannot be null");
         Objects.requireNonNull(aProject, "aProject cannot be null");
         Objects.requireNonNull(siteDescriptorContent, "siteDescriptorContent 
cannot be null");
 
@@ -442,9 +481,10 @@ public class DefaultSiteTool implements SiteTool {
         if (isEarly) {
             interpolator.addValueSource(new PrefixedObjectValueSource("this.", 
aProject));
             interpolator.addValueSource(new 
PrefixedPropertiesValueSource("this.", aProject.getProperties()));
+
         } 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 +517,25 @@ public class DefaultSiteTool implements SiteTool {
         }
     }
 
+    /**
+     * Merge properties from different sources in the following order (with 
later sources overriding earlier ones):
+     * <ol>
+     *    <li>System properties from the Maven execution request</li>
+     *    <li>Project properties from the Maven project</li>
+     *    <li>User properties from the Maven execution request</li>
+     * </ol>
+     * @param request
+     * @param aProject
+     * @return
+     */
+    private static Properties mergeProperties(MavenExecutionRequest request, 
MavenProject aProject) {
+        Properties merged = new Properties();
+        merged.putAll(request.getSystemProperties());
+        merged.putAll(aProject.getProperties());
+        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 +1027,7 @@ public class DefaultSiteTool implements SiteTool {
             int depth,
             File siteDirectory,
             Locale locale,
+            MavenExecutionRequest request,
             MavenProject project,
             RepositorySystemSession repoSession,
             List<RemoteRepository> remoteProjectRepositories)
@@ -1000,7 +1060,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 +1096,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..b3863d4 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, not 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
diff --git a/doxia-integration-tools/src/site/apt/index.apt 
b/doxia-integration-tools/src/site/apt/index.apt
index 77a6bb9..da87a9a 100644
--- a/doxia-integration-tools/src/site/apt/index.apt
+++ b/doxia-integration-tools/src/site/apt/index.apt
@@ -53,6 +53,7 @@ Maven Doxia Integration Tools
   * with <<early>> interpolation, replacement happens <<before>> inheritance: 
this was the default behaviour for <<<project.*>>>
   values until Doxia Sitetools 1.7 (used in 
{{{/plugins/maven-site-plugin/history.html} Maven Site Plugin 3.5}}), when 
these early and late interpolation definitions didn't exist.
   Since Doxia Sitetools 1.7.1 (used in 
{{{/plugins/maven-site-plugin/history.html} Maven Site Plugin 3.5.1}}), early 
interpolation happens for <<<this.*>>> values.
+  Early interpolation doesn't support user and system properties.
 
   []
 
diff --git 
a/doxia-integration-tools/src/test/java/org/apache/maven/doxia/tools/SiteToolTest.java
 
b/doxia-integration-tools/src/test/java/org/apache/maven/doxia/tools/SiteToolTest.java
index 5a20f64..f33b019 100644
--- 
a/doxia-integration-tools/src/test/java/org/apache/maven/doxia/tools/SiteToolTest.java
+++ 
b/doxia-integration-tools/src/test/java/org/apache/maven/doxia/tools/SiteToolTest.java
@@ -30,6 +30,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
+import java.util.Properties;
 
 import org.apache.maven.doxia.site.LinkItem;
 import org.apache.maven.doxia.site.SiteModel;
@@ -38,6 +39,8 @@ import org.apache.maven.doxia.site.io.xpp3.SiteXpp3Reader;
 import org.apache.maven.doxia.site.io.xpp3.SiteXpp3Writer;
 import org.apache.maven.doxia.tools.stubs.MavenProjectStub;
 import org.apache.maven.doxia.tools.stubs.SiteToolMavenProjectStub;
+import org.apache.maven.execution.DefaultMavenExecutionRequest;
+import org.apache.maven.execution.MavenExecutionRequest;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
 import org.codehaus.plexus.testing.PlexusTest;
@@ -329,6 +332,7 @@ class SiteToolTest {
         SiteModel model = tool.getSiteModel(
                 new File(project.getBasedir(), "src/site"),
                 SiteTool.DEFAULT_LOCALE,
+                new DefaultMavenExecutionRequest(),
                 project,
                 reactorProjects,
                 newRepoSession(),
@@ -355,6 +359,7 @@ class SiteToolTest {
         SiteModel modelFromRepo = tool.getSiteModel(
                 null,
                 SiteTool.DEFAULT_LOCALE,
+                new DefaultMavenExecutionRequest(),
                 project,
                 reactorProjects,
                 newRepoSession(),
@@ -383,6 +388,7 @@ class SiteToolTest {
         SiteModel model = tool.getSiteModel(
                 new File(project.getBasedir(), siteDirectory),
                 SiteTool.DEFAULT_LOCALE,
+                new DefaultMavenExecutionRequest(),
                 project,
                 reactorProjects,
                 newRepoSession(),
@@ -455,12 +461,26 @@ class SiteToolTest {
         SiteToolMavenProjectStub childProject = new 
SiteToolMavenProjectStub("interpolation-child-test");
         childProject.setParent(parentProject);
         
childProject.setDistgributionManagementSiteUrl("dav+https://davs.codehaus.org/site/child";);
+        Properties effectiveProperties = new Properties();
+        effectiveProperties.putAll(parentProject.getProperties());
+        effectiveProperties.putAll(childProject.getProperties());
+        childProject.setProperties(effectiveProperties);
 
         List<MavenProject> reactorProjects = 
Collections.<MavenProject>singletonList(parentProject);
+        MavenExecutionRequest request = new DefaultMavenExecutionRequest();
+        Properties userProperties = new Properties();
+        userProperties.setProperty("userProp1", "from user properties");
+        userProperties.setProperty("my_property2", "from user properties");
+        request.setUserProperties(userProperties);
+        Properties systemProperties = new Properties();
+        systemProperties.setProperty("systemProp1", "from system properties");
+        systemProperties.setProperty("my_property3", "from system properties");
+        request.setSystemProperties(systemProperties);
 
         SiteModel model = tool.getSiteModel(
                 new File(childProject.getBasedir(), "src/site"),
                 SiteTool.DEFAULT_LOCALE,
+                request,
                 childProject,
                 reactorProjects,
                 newRepoSession(),
@@ -489,6 +509,10 @@ class SiteToolTest {
 
         // late interpolation of project properties
         assertEquals("my_property = from child pom.xml", 
links.next().getName());
+        // must be overridden by user property
+        assertEquals("my_property2 = from user properties", 
links.next().getName());
+        // must not be overridden by system property
+        assertEquals("my_property3 = from parent pom.xml", 
links.next().getName());
         // early interpolation of project properties: DOXIASITETOOLS-158
         assertEquals("this.my_property = from parent pom.xml", 
links.next().getName());
 
@@ -500,6 +524,12 @@ class SiteToolTest {
 
         // property overrides env
         assertEquals("PATH = PATH property from pom", links.next().getName());
+
+        // user properties
+        assertEquals("userProp1 = from user properties", 
links.next().getName());
+
+        // system properties
+        assertEquals("systemProp1 = from system properties", 
links.next().getName());
     }
 
     /**
@@ -516,6 +546,7 @@ class SiteToolTest {
         SiteModel model = tool.getSiteModel(
                 new File(project.getBasedir(), "src/site"),
                 SiteTool.DEFAULT_LOCALE,
+                new DefaultMavenExecutionRequest(),
                 project,
                 reactorProjects,
                 newRepoSession(),
@@ -565,6 +596,7 @@ class SiteToolTest {
                 () -> tool.getSiteModel(
                         new File(project.getBasedir(), "src/site"),
                         SiteTool.DEFAULT_LOCALE,
+                        new DefaultMavenExecutionRequest(),
                         project,
                         reactorProjects,
                         repoSession,
@@ -577,6 +609,7 @@ class SiteToolTest {
             tool.getSiteModel(
                     new File(project.getBasedir(), "src/site"),
                     SiteTool.DEFAULT_LOCALE,
+                    new DefaultMavenExecutionRequest(),
                     project,
                     reactorProjects,
                     repoSession,
diff --git 
a/doxia-integration-tools/src/test/resources/unit/interpolation-parent-test/pom.xml
 
b/doxia-integration-tools/src/test/resources/unit/interpolation-parent-test/pom.xml
index 28545f8..a0a6a20 100644
--- 
a/doxia-integration-tools/src/test/resources/unit/interpolation-parent-test/pom.xml
+++ 
b/doxia-integration-tools/src/test/resources/unit/interpolation-parent-test/pom.xml
@@ -31,6 +31,8 @@ under the License.
 
   <properties>
     <my_property>from parent pom.xml</my_property>
+    <my_property2>from parent pom.xml</my_property2>
+    <my_property3>from parent pom.xml</my_property3>
     <name>name property</name>
   </properties>
 </project>
diff --git 
a/doxia-integration-tools/src/test/resources/unit/interpolation-parent-test/src/site/site.xml
 
b/doxia-integration-tools/src/test/resources/unit/interpolation-parent-test/src/site/site.xml
index 7943471..a9bb770 100644
--- 
a/doxia-integration-tools/src/test/resources/unit/interpolation-parent-test/src/site/site.xml
+++ 
b/doxia-integration-tools/src/test/resources/unit/interpolation-parent-test/src/site/site.xml
@@ -35,13 +35,19 @@ under the License.
       <item name="name = ${name}" href="${this.url}" />
       <!-- early interpolation from project model -->
       <item name="this.name = ${this.name}" href="${this.url}" />
-      <!-- late interpolation of properties -->
+      <!-- late interpolation of model properties -->
       <item name="my_property = ${my_property}" href="." />
-      <!-- early interpolation of properties -->
+      <item name="my_property2 = ${my_property2}" href="." />
+      <item name="my_property3 = ${my_property3}" href="." />
+      <!-- early interpolation of model properties -->
       <item name="this.my_property = ${this.my_property}" href="." />
       <!-- interpolation of env vars -->
       <item name="env.PATH = ${env.PATH}" href="${this.url}" />
       <item name="PATH = ${PATH}" href="${this.url}" /><!-- property 
interpolated before env var in child -->
+      <!-- interpolation of user properties -->
+      <item name="userProp1 = ${userProp1}" href="." />
+      <!-- interpolation of system properties -->
+      <item name="systemProp1 = ${systemProp1}" href="." />
     </links>
     <breadcrumbs>
       <item name="Maven"  href="../index.html" />

Reply via email to