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><menu ref="parent"/></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><menu ref="reports"/></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" />