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 081a0e8  Allow to set an alternative source directory (for editing) 
(#625)
081a0e8 is described below

commit 081a0e848e0a1a07545fcb8dc75b9311354cb097
Author: Konrad Windszus <[email protected]>
AuthorDate: Sat Mar 28 10:25:40 2026 +0100

    Allow to set an alternative source directory (for editing) (#625)
    
    Always check if a file is existing before returning true for isEditable
    and non-null for getDoxiaSourcePath()/getDoxiaSourcePath(String)
    
    This closes #277
---
 .../doxia/siterenderer/DefaultSiteRenderer.java    |  30 +--
 .../siterenderer/DocumentRenderingContext.java     | 206 ++++++++++++++++++---
 .../doxia/siterenderer/SiteRenderingContext.java   |  38 +++-
 .../siterenderer/DefaultSiteRendererTest.java      |  10 +-
 .../siterenderer/DocumentRenderingContextTest.java | 116 ++++++++++++
 .../doxia/siterenderer/RenderingContextTest.java   |  76 --------
 6 files changed, 352 insertions(+), 124 deletions(-)

diff --git 
a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java
 
b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java
index 82ed93e..861cfea 100644
--- 
a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java
+++ 
b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DefaultSiteRenderer.java
@@ -198,12 +198,11 @@ public class DefaultSiteRenderer implements Renderer {
 
                     addModuleFiles(
                             siteRenderingContext.getRootDirectory(),
+                            siteDirectory,
                             moduleBasedir,
                             module,
                             excludes,
-                            files,
-                            siteDirectory.isEditable(),
-                            siteDirectory.isSkipDuplicates());
+                            files);
                 }
             }
         }
@@ -228,32 +227,27 @@ public class DefaultSiteRenderer implements Renderer {
      * Populates the files map with {@link DocumentRenderer}s per output name 
in parameter {@code files} for all files in the moduleBasedir matching the 
module extensions,
      * taking care of duplicates if needed.
      *
-     * @param rootDir
+     * @param siteRootDirectory
+     * @param siteDirectory
      * @param moduleBasedir
      * @param module
      * @param excludes
      * @param files
-     * @param editable
-     * @param skipDuplicates
      * @throws IOException
      * @throws RendererException
      */
     private void addModuleFiles(
-            File rootDir,
+            File siteRootDirectory,
+            SiteDirectory siteDirectory,
             File moduleBasedir,
             ParserModule module,
             String excludes,
-            Map<String, DocumentRenderer> files,
-            boolean editable,
-            boolean skipDuplicates)
+            Map<String, DocumentRenderer> files)
             throws IOException, RendererException {
         if (!moduleBasedir.exists() || 
ArrayUtils.isEmpty(module.getExtensions())) {
             return;
         }
 
-        String moduleRelativePath =
-                PathTool.getRelativeFilePath(rootDir.getAbsolutePath(), 
moduleBasedir.getAbsolutePath());
-
         List<String> allFiles = FileUtils.getFileNames(moduleBasedir, "**/*", 
excludes, false);
 
         for (String extension : module.getExtensions()) {
@@ -268,14 +262,20 @@ public class DefaultSiteRenderer implements Renderer {
 
             for (String doc : docs) {
                 DocumentRenderingContext docRenderingContext = new 
DocumentRenderingContext(
-                        moduleBasedir, moduleRelativePath, doc, 
module.getParserId(), extension, editable);
+                        moduleBasedir,
+                        doc,
+                        module.getParserId(),
+                        extension,
+                        siteRootDirectory,
+                        siteDirectory.getPath(),
+                        siteDirectory.getEditableSourceDirectories());
 
                 // TODO: DOXIA-111: we need a general filter here that knows 
how to alter the context
                 if (endsWithIgnoreCase(doc, ".vm")) {
                     docRenderingContext.setAttribute("velocity", "true");
                 }
 
-                if (!checkForDuplicate(docRenderingContext, files, 
skipDuplicates)) {
+                if (!checkForDuplicate(docRenderingContext, files, 
siteDirectory.isSkipDuplicates())) {
                     String key = docRenderingContext.getOutputName();
                     files.put(key, new 
DoxiaDocumentRenderer(docRenderingContext));
                 }
diff --git 
a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DocumentRenderingContext.java
 
b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DocumentRenderingContext.java
index b176c83..8d2be1e 100644
--- 
a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DocumentRenderingContext.java
+++ 
b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/DocumentRenderingContext.java
@@ -19,8 +19,11 @@
 package org.apache.maven.doxia.siterenderer;
 
 import java.io.File;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 
 import org.codehaus.plexus.util.PathTool;
 
@@ -32,26 +35,59 @@ import org.codehaus.plexus.util.PathTool;
  * @since 1.5 (was since 1.1 in o.a.m.d.sink.render)
  */
 public class DocumentRenderingContext {
-    private final File basedir;
 
-    private final String basedirRelativePath;
+    /** absolute path to the source base directory (not null, pseudo value 
when not a Doxia source), this is parser format specific. Must start with 
{@link #siteRootDirectory}. */
+    private final File basedir;
 
+    /** {@link #basedir} relative path to the document's source including 
{@link #extension}. May be {@code null} if not rendered from a Doxia source */
     private final String inputPath;
 
+    /** same as {@link #inputPath} but with extension replaced with {@code 
.html}, this is parser format specific */
     private final String outputPath;
 
+    /** the Doxia module parser id associated to this document, may be null if 
document not rendered from a Doxia source. */
     private final String parserId;
 
-    private final String relativePath;
-
+    /** the source document filename extension, may be null if document not 
rendered from a Doxia source. */
     private final String extension;
 
     private Map<String, String> attributes;
 
-    private final boolean editable;
+    /**
+     * The absolute paths of directories which may contain the original 
editable source.
+     * If empty document is not editable.
+     */
+    private final Collection<File> sourceDirectories;
+
+    /** The project's build directory, may be {@code null} rendered from a 
Doxia source) */
+    private final File rootDirectory;
+
+    /** The site's root directory, must be below {@link #rootDirectory}, may 
be {@code null} if not rendered from a Doxia source */
+    private final File siteRootDirectory;
 
+    /** optional descriptive text of the plugin which generated the output 
(usually Maven coordinates). Only set when document is not based on a Doxia 
source. */
     private final String generator;
 
+    static File stripSuffixFromPath(File file, String suffix) {
+        File relevantFile = file;
+        if (suffix == null || suffix.isEmpty()) {
+            return relevantFile;
+        }
+        File currentSuffixPart = new File(suffix);
+        // compare elements from end, suffix should be a suffix of file
+        do {
+            if (currentSuffixPart.getName().equals(relevantFile.getName())) {
+                relevantFile = relevantFile.getParentFile();
+                if (relevantFile == null) {
+                    throw new IllegalArgumentException("Suffix " + suffix + " 
has more elements than file " + file);
+                }
+            } else {
+                throw new IllegalArgumentException("Suffix " + suffix + " is 
not a suffix of file " + file);
+            }
+        } while ((currentSuffixPart = currentSuffixPart.getParentFile()) != 
null);
+        return relevantFile;
+    }
+
     /**
      * <p>
      * Constructor for rendering context when document is not rendered from a 
Doxia markup source.
@@ -64,9 +100,20 @@ public class DocumentRenderingContext {
      * @since 1.8
      */
     public DocumentRenderingContext(File basedir, String document, String 
generator) {
-        this(basedir, null, document, null, null, false, generator);
+        this(basedir, document, null, null, null, null, 
Collections.emptySet(), generator);
     }
 
+    /**
+     *
+     * @param basedir
+     * @param basedirRelativePath
+     * @param document
+     * @param parserId
+     * @param extension
+     * @param editable
+     * @deprecated Use {@link #DocumentRenderingContext(File, String, String, 
String, File, File, Collection, String)} instead.
+     */
+    @Deprecated
     public DocumentRenderingContext(
             File basedir,
             String basedirRelativePath,
@@ -79,20 +126,50 @@ public class DocumentRenderingContext {
 
     /**
      * <p>
-     * Constructor for document rendering context.
+     * Constructor for rendering context when document is a Doxia markup 
source.
      * </p>
+     * Same as {@link #DocumentRenderingContext(File, String, String, String, 
File, File, Collection, String)} with {@code generator} set to {@code null}.
      *
      * @param basedir the source base directory (not null, pseudo value when 
not a Doxia source).
-     * @param basedirRelativePath the relative path from root (null if not 
Doxia source)
      * @param document the source document path.
-     * @param parserId the Doxia module parser id associated to this document, 
may be null if document not rendered from
+     * @param parserId the Doxia module parser id associated with this 
document, may be null if document not rendered from
      *            a Doxia source.
      * @param extension the source document filename extension, may be null if 
document not rendered from
      *            a Doxia source.
-     * @param editable is the document editable as source, i.e. not generated?
-     * @param generator the generator (in general a reporting goal: 
<code>groupId:artifactId:version:goal</code>)
+     * @param rootDirectory the absolute project's root directory (not null), 
usually {@code project.basedir}, must be an ancestor of {@code 
siteRootDirectory}
+     * @param siteRootDirectory the absolute site's root directory (not null), 
must start with {@code rootDirectory}, often ends with {@code /src/site}
+     * @param sourceDirectories the absolute paths of directories which may 
contain the original editable source.
+     * @since 2.1
+     */
+    public DocumentRenderingContext(
+            File basedir,
+            String document,
+            String parserId,
+            String extension,
+            File rootDirectory,
+            File siteRootDirectory,
+            Collection<File> sourceDirectories) {
+        this(basedir, document, parserId, extension, rootDirectory, 
siteRootDirectory, sourceDirectories, null);
+    }
+
+    /**
+     * <p>
+     * Constructor for document rendering context.
+     * </p>
+     *
+     * @param basedir the absolute source base directory (not null, pseudo 
value when not a Doxia source).
+     * @param basedirRelativePath the relative path of {@code #basedir} from 
project root (null if not Doxia source)
+     * @param document the source document path.
+     * @param parserId the Doxia module parser id associated with this 
document, may be null if document not rendered from
+     *            a Doxia source.
+     * @param extension the source document filename extension, may be null if 
document not rendered from
+     *            a Doxia source.
+     * @param editable {@code true} if the document is editable as source, 
i.e. not generated, {@code false} otherwise.
+     * @param generator the generator of this document (in general a reporting 
goal: <code>groupId:artifactId:version:goal</code>), not set when document is 
based on a Doxia source.
      * @since 1.8
+     * @deprecated Use {@link #DocumentRenderingContext(File, String, String, 
String, File, File, Collection, String)} instead.
      */
+    @Deprecated
     public DocumentRenderingContext(
             File basedir,
             String basedirRelativePath,
@@ -101,6 +178,46 @@ public class DocumentRenderingContext {
             String extension,
             boolean editable,
             String generator) {
+        this(
+                basedir,
+                document,
+                parserId,
+                extension,
+                stripSuffixFromPath(basedir, basedirRelativePath),
+                // assume that site root is the parent of basedir (i.e. module 
specific source directory is directly
+                // below site root)
+                basedir.getParentFile(),
+                editable ? Collections.singleton(basedir) : 
Collections.emptySet(),
+                generator);
+    }
+
+    /**
+     * <p>
+     * Constructor for document rendering context.
+     * </p>
+     *
+     * @param basedir the source base directory (not null, pseudo value when 
not a Doxia source).
+     * @param document the source document path.
+     * @param parserId the Doxia module parser id associated with this 
document, may be null if document not rendered from
+     *            a Doxia source.
+     * @param extension the source document filename extension, may be null if 
document not rendered from
+     *            a Doxia source.
+     * @param rootDirectory the absolute project's root directory (not null), 
usually {@code project.basedir}, must be an ancestor of {@code 
siteRootDirectory}
+     * @param siteRootDirectory the absolute site's root directory (not null), 
must start with {@code rootDirectory}, often ends with {@code /src/site}
+     * @param sourceDirectories the absolute paths of directories which may 
contain the original editable source.
+     * @param generator the generator (in general a reporting goal: 
<code>groupId:artifactId:version:goal</code>)
+     * @since 2.1
+     */
+    @SuppressWarnings("checkstyle:parameternumber")
+    public DocumentRenderingContext(
+            File basedir,
+            String document,
+            String parserId,
+            String extension,
+            File rootDirectory,
+            File siteRootDirectory,
+            Collection<File> sourceDirectories,
+            String generator) {
         this.basedir = basedir;
         this.parserId = parserId;
         this.extension = extension;
@@ -110,10 +227,23 @@ public class DocumentRenderingContext {
         document = document.replace('\\', '/');
         this.inputPath = document;
 
+        if (rootDirectory == null) {
+            if (siteRootDirectory != null) {
+                throw new IllegalArgumentException("Root directory must not be 
null when site root directory is set");
+            }
+        } else {
+            Objects.requireNonNull(
+                    siteRootDirectory, "Site root directory must not be null 
when root directory is set");
+            if 
(!siteRootDirectory.getPath().startsWith(rootDirectory.getPath())) {
+                throw new IllegalArgumentException("Site root directory " + 
siteRootDirectory
+                        + " must start with root directory " + rootDirectory);
+            }
+        }
+        this.rootDirectory = rootDirectory;
+        this.siteRootDirectory = siteRootDirectory;
         if (extension != null && !extension.isEmpty()) {
-            this.basedirRelativePath = basedirRelativePath.replace('\\', '/');
             // document comes from a Doxia source: see DoxiaDocumentRenderer
-            this.editable = editable;
+            this.sourceDirectories = sourceDirectories;
 
             // here we know the parserId and extension, we can play with this 
to get output name from document:
             // - index.xml -> index.html
@@ -126,13 +256,9 @@ public class DocumentRenderingContext {
             this.outputPath = filePathWithoutExt + ".html";
         } else {
             // document does not come from a Doxia source but direct Sink API, 
so no file extension to strip
-            this.basedirRelativePath = null;
-            this.editable = false;
+            this.sourceDirectories = Collections.emptySet();
             this.outputPath = document + ".html";
         }
-
-        this.relativePath = PathTool.getRelativePath(basedir.getPath(), new 
File(basedir, inputPath).getPath())
-                .replace('\\', '/');
     }
 
     /**
@@ -189,12 +315,13 @@ public class DocumentRenderingContext {
     }
 
     /**
-     * Get the relative path to site root.
+     * Get the relative path of the parent directory of this document to site 
root.
      *
      * @return the relative path to site root
      */
     public String getRelativePath() {
-        return relativePath;
+        return PathTool.getRelativePath(basedir.getPath(), new File(basedir, 
inputPath).getPath())
+                .replace('\\', '/');
     }
 
     /**
@@ -233,7 +360,7 @@ public class DocumentRenderingContext {
      * @since 1.8
      */
     public boolean isEditable() {
-        return editable;
+        return getDoxiaSourcePath() != null;
     }
 
     /**
@@ -257,27 +384,54 @@ public class DocumentRenderingContext {
     }
 
     /**
-     * Get the relative path of basedir (when a Doxia source)
+     * Get the project root relative path of basedir (when a Doxia source). 
For example {@code src/site/markdown}.
      *
      * @return the relative path of basedir when a Doxia source, or 
<code>null</code> if not a Doxia source
      * @since 1.8
      */
     public String getBasedirRelativePath() {
-        return basedirRelativePath;
+        if (!isDoxiaSource()) {
+            return null;
+        }
+        return PathTool.getRelativeFilePath(rootDirectory.getPath(), 
basedir.getPath());
+    }
+
+    /**
+     * Get the site root relative path of basedir (when a Doxia source). For 
example {@code markdown}.
+     *
+     * @return the relative path of basedir when a Doxia source, or 
<code>null</code> if not a Doxia source
+     */
+    private String getBasedirRelativePathAgainstSiteRoot() {
+        if (!isDoxiaSource()) {
+            return null;
+        }
+        return PathTool.getRelativeFilePath(siteRootDirectory.getPath(), 
basedir.getPath());
     }
 
     /**
-     * Get the relative path to Doxia source from build root.
+     * Get the relative path to Doxia source from build root. The file 
separators in the returned path are {@code /} regardless of the platform..
      *
      * @return the relative path to Doxia source from build root, or 
<code>null</code> if not a Doxia source
      * @since 1.8
      */
     public String getDoxiaSourcePath() {
-        return isDoxiaSource() ? (basedirRelativePath + '/' + inputPath) : 
null;
+        if (!isDoxiaSource()) {
+            return null;
+        } else {
+            for (File sourceDirectory : sourceDirectories) {
+                File sourceFile = new File(sourceDirectory, 
getBasedirRelativePathAgainstSiteRoot() + '/' + inputPath);
+                if (sourceFile.exists()) {
+                    return 
PathTool.getRelativeFilePath(rootDirectory.getPath(), sourceFile.getPath())
+                            .replace('\\', '/');
+                }
+            }
+        }
+        return null;
     }
 
     /**
-     * Get url of the Doxia source calculate from given base url.
+     * Get absolute url of the Doxia source calculate from given base url.
+     * Used from Skins to render an edit button.
      *
      * @param base the base url to use
      * @return the resulting url
diff --git 
a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
 
b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
index 64db4c7..6b461f9 100644
--- 
a/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
+++ 
b/doxia-site-renderer/src/main/java/org/apache/maven/doxia/siterenderer/SiteRenderingContext.java
@@ -20,8 +20,10 @@ package org.apache.maven.doxia.siterenderer;
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -44,6 +46,7 @@ public class SiteRenderingContext {
         private File path;
         private boolean editable;
         private boolean skipDuplicates;
+        private final Collection<File> editableSourceDirectories = new 
LinkedHashSet<>();
 
         public SiteDirectory(File path, boolean editable) {
             this(path, editable, false);
@@ -51,8 +54,8 @@ public class SiteRenderingContext {
 
         /**
          *
-         * @param path
-         * @param editable
+         * @param path path to the site directory containing Doxia sources 
files, expected to have a Doxia Site layout, i.e. one directory per Doxia 
parser module
+         * @param editable {@code true} if the site directory is expected to 
be editable
          * @param skipDuplicates flag indicating if duplicates in this 
directory should be skipped ({@code true}) or lead to an exception ({@code 
false})
          * @since 2.1
          */
@@ -73,6 +76,37 @@ public class SiteRenderingContext {
         public boolean isSkipDuplicates() {
             return skipDuplicates;
         }
+
+        /**
+         * Add an alternative source directory to this site directory.
+         * This will implicitly turn it into an editable site directory. 
Multiple source directories can be used, the first one containing a file with a 
given name will be used for that file,
+         * the others will be ignored. This allows to have a main source 
directory and an optional overlay directory with custom files.
+         * Only necessary to call if the source directory is different from 
the site directory, otherwise the site directory will be used as source 
directory.
+         * @param sourceDirectory
+         * @since 2.1
+         */
+        public void addAlternativeEditableSourceDirectory(File 
sourceDirectory) {
+            editableSourceDirectories.add(sourceDirectory);
+            editable = true;
+        }
+
+        /**
+         * Get the source directories for this site directory. If no 
alternative source directory has been added via {@link 
#addAlternativeEditableSourceDirectory(File)}
+         * the site directory itself ({@link #getPath()}) will be returned as 
the only source directory.
+         * If the site directory is not editable, an empty collection will be 
returned.
+         * @return the source directories for this site directory
+         * @since 2.1
+         */
+        public Collection<File> getEditableSourceDirectories() {
+            if (!editable) {
+                return Collections.emptyList();
+            }
+            if (editableSourceDirectories.isEmpty()) {
+                return Collections.singleton(path);
+            } else {
+                return 
Collections.unmodifiableCollection(editableSourceDirectories);
+            }
+        }
     }
 
     private String inputEncoding = ReaderFactory.FILE_ENCODING;
diff --git 
a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
 
b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
index d41ed81..10796ff 100644
--- 
a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
+++ 
b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DefaultSiteRendererTest.java
@@ -181,8 +181,8 @@ public class DefaultSiteRendererTest {
         SiteRenderer siteRenderer = container.lookup(SiteRenderer.class);
         ReflectionUtils.setVariableValueInObject(siteRenderer, "doxia", 
doxiaSpy);
 
-        DocumentRenderingContext docRenderingContext =
-                new DocumentRenderingContext(testBasedir, "", testDocument, 
"xdoc", "", false);
+        DocumentRenderingContext docRenderingContext = new 
DocumentRenderingContext(
+                testBasedir, "src/test/resources/site/xdoc", testDocument, 
"xdoc", "", false);
 
         try {
             siteRenderer.renderDocument(null, docRenderingContext, new 
SiteRenderingContext());
@@ -212,8 +212,8 @@ public class DefaultSiteRendererTest {
         SiteRenderer siteRenderer = container.lookup(SiteRenderer.class);
         ReflectionUtils.setVariableValueInObject(siteRenderer, "doxia", 
doxiaSpy);
 
-        DocumentRenderingContext docRenderingContext =
-                new DocumentRenderingContext(testBasedir, "", 
testDocumentName, "xdoc", "", false);
+        DocumentRenderingContext docRenderingContext = new 
DocumentRenderingContext(
+                testBasedir, "src/test/resources/site/xdoc", testDocumentName, 
"xdoc", "", false);
 
         try {
             siteRenderer.renderDocument(null, docRenderingContext, new 
SiteRenderingContext());
@@ -335,7 +335,7 @@ public class DefaultSiteRendererTest {
 
         
siteRenderingContext.setTemplateName("org/apache/maven/doxia/siterenderer/velocity-toolmanager.vm");
         DocumentRenderingContext docRenderingContext =
-                new DocumentRenderingContext(new File(""), "document.html", 
"generator");
+                new DocumentRenderingContext(new File("."), "document.html", 
"generator");
         SiteRendererSink sink = new SiteRendererSink(docRenderingContext);
         siteRenderer.mergeDocumentIntoSite(writer, sink, siteRenderingContext);
 
diff --git 
a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DocumentRenderingContextTest.java
 
b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DocumentRenderingContextTest.java
new file mode 100644
index 0000000..e455b0d
--- /dev/null
+++ 
b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/DocumentRenderingContextTest.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.doxia.siterenderer;
+
+import java.io.File;
+import java.util.Collections;
+
+import org.codehaus.plexus.testing.PlexusExtension;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+class DocumentRenderingContextTest {
+
+    @Test
+    void stripSuffixFromPath() {
+        assertEquals(
+                new File("test/base/some/suffix"),
+                DocumentRenderingContext.stripSuffixFromPath(new 
File("test/base/some/suffix"), null));
+        assertEquals(
+                new File("test/base/some/suffix"),
+                DocumentRenderingContext.stripSuffixFromPath(new 
File("test/base/some/suffix"), ""));
+        assertEquals(
+                new File("test/base/some"),
+                DocumentRenderingContext.stripSuffixFromPath(new 
File("test/base/some/suffix"), "suffix"));
+        assertEquals(
+                new File("test/base"),
+                DocumentRenderingContext.stripSuffixFromPath(new 
File("test/base/some/suffix"), "some/suffix"));
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> DocumentRenderingContext.stripSuffixFromPath(new 
File("test/base/some/suffix"), "other/suffix"));
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> DocumentRenderingContext.stripSuffixFromPath(new 
File("some/suffix"), "test/base/some/suffix"));
+    }
+
+    @Test
+    void getDoxiaSource() {
+        // non Doxia markup source
+        DocumentRenderingContext renderingContext =
+                new DocumentRenderingContext(new File("test/base"), 
"test/base/some/file.html", "generator");
+        assertNull(renderingContext.getDoxiaSourcePath());
+        File rootDirectory = PlexusExtension.getTestFile("");
+        File siteDirectory = 
PlexusExtension.getTestFile("target/test-classes/site");
+        File sourceDirectory = 
PlexusExtension.getTestFile("src/test/resources/site");
+        renderingContext = new DocumentRenderingContext(
+                new File(siteDirectory, "markdown"),
+                "mermaid.md",
+                "markdown",
+                "md",
+                rootDirectory,
+                siteDirectory,
+                Collections.singleton(sourceDirectory));
+        assertEquals("src/test/resources/site/markdown/mermaid.md", 
renderingContext.getDoxiaSourcePath());
+    }
+
+    /**
+     * Test getRelativePath() with various file paths.
+     *
+     * @throws java.lang.Exception if any.
+     */
+    @Test
+    void filePathWithDot() throws Exception {
+        File baseDir = new File("." + File.separatorChar + "test" + 
File.separatorChar + "resources");
+
+        String document = "file.with.dot.in.name.xml";
+        String baseDirRelativePath = "test" + File.separatorChar + "resources";
+        DocumentRenderingContext docRenderingContext =
+                new DocumentRenderingContext(baseDir, baseDirRelativePath, 
document, "", "xml", false);
+        assertEquals("file.with.dot.in.name.html", 
docRenderingContext.getOutputPath());
+        assertEquals(".", docRenderingContext.getRelativePath());
+
+        document = "file.with.dot.in.name";
+        docRenderingContext = new DocumentRenderingContext(baseDir, document, 
"generator"); // not Doxia source
+        assertEquals("file.with.dot.in.name.html", 
docRenderingContext.getOutputPath());
+        assertEquals(".", docRenderingContext.getRelativePath());
+
+        document = "index.xml.vm";
+        docRenderingContext = new DocumentRenderingContext(baseDir, 
baseDirRelativePath, document, "", "xml", false);
+        assertEquals("index.html", docRenderingContext.getOutputPath());
+        assertEquals(".", docRenderingContext.getRelativePath());
+
+        document = "download.apt.vm";
+        docRenderingContext = new DocumentRenderingContext(baseDir, 
baseDirRelativePath, document, "", "apt", false);
+        assertEquals("download.html", docRenderingContext.getOutputPath());
+        assertEquals(".", docRenderingContext.getRelativePath());
+
+        document = "path/file.apt";
+        docRenderingContext = new DocumentRenderingContext(baseDir, 
baseDirRelativePath, document, "", "apt", false);
+        assertEquals("path/file.html", docRenderingContext.getOutputPath());
+        assertEquals("..", docRenderingContext.getRelativePath());
+
+        document = "path/file";
+        docRenderingContext = new DocumentRenderingContext(baseDir, document, 
"generator"); // not Doxia source
+        assertEquals("path/file.html", docRenderingContext.getOutputPath());
+        assertEquals("..", docRenderingContext.getRelativePath());
+    }
+}
diff --git 
a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/RenderingContextTest.java
 
b/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/RenderingContextTest.java
deleted file mode 100644
index 5e8fae5..0000000
--- 
a/doxia-site-renderer/src/test/java/org/apache/maven/doxia/siterenderer/RenderingContextTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.doxia.siterenderer;
-
-import java.io.File;
-
-import org.codehaus.plexus.testing.PlexusTest;
-import org.junit.jupiter.api.Test;
-
-import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * @author <a href="mailto:[email protected]";>olamy</a>
- * @since 20 oct. 07
- */
-@PlexusTest
-class RenderingContextTest {
-
-    /**
-     * Test getRelativePath() with various file paths.
-     *
-     * @throws java.lang.Exception if any.
-     */
-    @Test
-    void filePathWithDot() throws Exception {
-        File baseDir = new File(getBasedir() + File.separatorChar + "test" + 
File.separatorChar + "resources");
-
-        String document = "file.with.dot.in.name.xml";
-        DocumentRenderingContext docRenderingContext =
-                new DocumentRenderingContext(baseDir, "test", document, "", 
"xml", false);
-        assertEquals("file.with.dot.in.name.html", 
docRenderingContext.getOutputPath());
-        assertEquals(".", docRenderingContext.getRelativePath());
-
-        document = "file.with.dot.in.name";
-        docRenderingContext = new DocumentRenderingContext(baseDir, document, 
"generator"); // not Doxia source
-        assertEquals("file.with.dot.in.name.html", 
docRenderingContext.getOutputPath());
-        assertEquals(".", docRenderingContext.getRelativePath());
-
-        document = "index.xml.vm";
-        docRenderingContext = new DocumentRenderingContext(baseDir, "test", 
document, "", "xml", false);
-        assertEquals("index.html", docRenderingContext.getOutputPath());
-        assertEquals(".", docRenderingContext.getRelativePath());
-
-        document = "download.apt.vm";
-        docRenderingContext = new DocumentRenderingContext(baseDir, "test", 
document, "", "apt", false);
-        assertEquals("download.html", docRenderingContext.getOutputPath());
-        assertEquals(".", docRenderingContext.getRelativePath());
-
-        document = "path/file.apt";
-        docRenderingContext = new DocumentRenderingContext(baseDir, "test", 
document, "", "apt", false);
-        assertEquals("path/file.html", docRenderingContext.getOutputPath());
-        assertEquals("..", docRenderingContext.getRelativePath());
-
-        document = "path/file";
-        docRenderingContext = new DocumentRenderingContext(baseDir, document, 
"generator"); // not Doxia source
-        assertEquals("path/file.html", docRenderingContext.getOutputPath());
-        assertEquals("..", docRenderingContext.getRelativePath());
-    }
-}


Reply via email to