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><menu ref="parent"/></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><menu ref="reports"/></code>. Notice this menu reference is translated into
