diff --git a/src/main/java/org/apache/maven/reporting/AbstractMavenReport.java b/src/main/java/org/apache/maven/reporting/AbstractMavenReport.java index ceeebac..2001157 100644 --- a/src/main/java/org/apache/maven/reporting/AbstractMavenReport.java +++ b/src/main/java/org/apache/maven/reporting/AbstractMavenReport.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -41,6 +42,8 @@ import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink; import org.apache.maven.doxia.tools.SiteTool; import org.apache.maven.doxia.tools.SiteToolException; +import org.apache.maven.model.ReportPlugin; +import org.apache.maven.model.Reporting; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecution; import org.apache.maven.plugin.MojoExecutionException; @@ -50,6 +53,7 @@ import org.apache.maven.shared.utils.WriterFactory; import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; +import org.codehaus.plexus.util.PathTool; import org.codehaus.plexus.util.ReaderFactory; import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.repository.RemoteRepository; @@ -461,4 +465,56 @@ public boolean canGenerateReport() throws MavenReportException { * @throws MavenReportException if any */ protected abstract void executeReport(Locale locale) throws MavenReportException; + + /** + * Returns the (Test) Source XRef location as passthrough if provided, otherwise returns the + * default value. + * + * @param location the XRef location provided via plugin parameter, if any + * @param test whether it is test source + * @return the actual (Test) Source XRef location + */ + protected File getXrefLocation(File location, boolean test) { + return location != null ? location : new File(getReportOutputDirectory(), test ? "xref-test" : "xref"); + } + + /** + * Contructs the (Test) Source XRef location relative to the {@link #getReportOutputDirectory()} + * with {@link #getXrefLocation(File, boolean)}. + * + * @param location the XRef location provided via plugin parameter, if any + * @param test whether it is test source + * @return the constructed (Test) Source XRef location + */ + protected String constructXrefLocation(File location, boolean test) { + String constructedLocation = null; + File xrefLocation = getXrefLocation(location, test); + + String relativePath = + PathTool.getRelativePath(getReportOutputDirectory().getAbsolutePath(), xrefLocation.getAbsolutePath()); + if (relativePath == null || relativePath.isEmpty()) { + relativePath = "."; + } + relativePath = relativePath + "/" + xrefLocation.getName(); + if (xrefLocation.exists()) { + // XRef was already generated by manual execution of a lifecycle binding + constructedLocation = relativePath; + } else { + // Not yet generated - check if the report is on its way + Reporting reporting = project.getModel().getReporting(); + List reportPlugins = + reporting != null ? reporting.getPlugins() : Collections.emptyList(); + for (ReportPlugin plugin : reportPlugins) { + String artifactId = plugin.getArtifactId(); + if ("maven-jxr-plugin".equals(artifactId)) { + constructedLocation = relativePath; + } + } + } + + if (constructedLocation == null) { + getLog().warn("Unable to locate" + (test ? " Test" : "") + " Source XRef to link to -- DISABLED"); + } + return constructedLocation; + } }