You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kw...@apache.org on 2025/02/12 12:30:19 UTC

(maven-doxia-sitetools) branch support-site-directories-skipping-duplicates created (now ca90124)

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

kwin pushed a change to branch support-site-directories-skipping-duplicates
in repository https://gitbox.apache.org/repos/asf/maven-doxia-sitetools.git


      at ca90124  [DOXIASITETOOLS-359] Support site directories where duplicates are skipped

This branch includes the following new commits:

     new ca90124  [DOXIASITETOOLS-359] Support site directories where duplicates are skipped

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(maven-doxia-sitetools) 01/01: [DOXIASITETOOLS-359] Support site directories where duplicates are skipped

Posted by kw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch support-site-directories-skipping-duplicates
in repository https://gitbox.apache.org/repos/asf/maven-doxia-sitetools.git

commit ca90124c96ccc7a0e3d1e989aec2bc0c8c8c7a9b
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Wed Feb 12 13:14:09 2025 +0100

    [DOXIASITETOOLS-359] Support site directories where duplicates are
    skipped
    
    Usually a duplicate relative file path in multiple site directories lead
    to a RendererException (because only one can end up in the built site).
    For some cases it is beneficial to add source directories where
    duplicates should be just silently skipped (for example to allow
    overwriting certain files in previous sources).
---
 .../doxia/siterenderer/DefaultSiteRenderer.java    | 15 +++++---
 .../doxia/siterenderer/SiteRenderingContext.java   | 17 ++++++++
 .../siterenderer/DefaultSiteRendererTest.java      | 45 +++++++++++++++++++++-
 3 files changed, 70 insertions(+), 7 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 465b795..97100c8 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
@@ -171,7 +171,8 @@ public class DefaultSiteRenderer implements Renderer {
                             module,
                             excludes,
                             files,
-                            siteDirectory.isEditable());
+                            siteDirectory.isEditable(),
+                            siteDirectory.isSkipDuplicates());
                 }
             }
         }
@@ -198,7 +199,7 @@ public class DefaultSiteRenderer implements Renderer {
             ParserModule module,
             String excludes,
             Map<String, DocumentRenderer> files,
-            boolean editable)
+            boolean editable, boolean skipDuplicates)
             throws IOException, RendererException {
         if (!moduleBasedir.exists() || ArrayUtils.isEmpty(module.getExtensions())) {
             return;
@@ -231,8 +232,8 @@ public class DefaultSiteRenderer implements Renderer {
                 }
 
                 String key = docRenderingContext.getOutputName();
-
-                if (files.containsKey(key)) {
+                boolean foundDuplicate = files.containsKey(key);
+                if (foundDuplicate && !skipDuplicates) {
                     DocumentRenderer docRenderer = files.get(key);
 
                     DocumentRenderingContext originalDocRenderingContext = docRenderer.getRenderingContext();
@@ -247,7 +248,7 @@ public class DefaultSiteRenderer implements Renderer {
                 // Handle key without case differences
                 // -----------------------------------------------------------------------
                 String originalKey = caseInsensitiveFiles.put(key.toLowerCase(Locale.ROOT), key);
-                if (originalKey != null) {
+                if (originalKey != null && !skipDuplicates) {
                     DocumentRenderingContext originalDocRenderingContext =
                             files.get(originalKey).getRenderingContext();
 
@@ -265,7 +266,9 @@ public class DefaultSiteRenderer implements Renderer {
                     }
                 }
 
-                files.put(key, new DoxiaDocumentRenderer(docRenderingContext));
+                if (!foundDuplicate) {
+                    files.put(key, new DoxiaDocumentRenderer(docRenderingContext));
+                }
             }
         }
     }
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 03c2d28..152c9e5 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
@@ -43,10 +43,23 @@ public class SiteRenderingContext {
     public static class SiteDirectory {
         private File path;
         private boolean editable;
+        private boolean skipDuplicates;
 
         public SiteDirectory(File path, boolean editable) {
+            this(path, editable, false);
+        }
+
+        /**
+         * 
+         * @param path
+         * @param 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
+         */
+        public SiteDirectory(File path, boolean editable, boolean skipDuplicates) {
             this.path = path;
             this.editable = editable;
+            this.skipDuplicates = skipDuplicates;
         }
 
         public File getPath() {
@@ -56,6 +69,10 @@ public class SiteRenderingContext {
         public boolean isEditable() {
             return editable;
         }
+
+        public boolean isSkipDuplicates() {
+            return skipDuplicates;
+        }
     }
 
     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 8a2c04e..4ae29be 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
@@ -31,9 +31,11 @@ import java.io.StringWriter;
 import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
 import java.util.jar.JarOutputStream;
 import java.util.zip.ZipEntry;
 
@@ -67,9 +69,15 @@ import static org.codehaus.plexus.testing.PlexusExtension.getTestFile;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
-import static org.mockito.Mockito.*;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 /**
  * @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
@@ -319,6 +327,41 @@ public class DefaultSiteRendererTest {
         assertFalse(r.matchVersion("1.7", "1.8"));
     }
 
+    @Test
+    public void testLocateDocumentFiles() throws IOException, RendererException {
+        SiteRenderingContext context = new SiteRenderingContext();
+        File sourceDirectory = getTestFile("src/test/resources/site-validate");
+        context.setRootDirectory(sourceDirectory);
+        context.addSiteDirectory(new SiteDirectory(sourceDirectory, true));
+        Set<String> outputFiles = siteRenderer.locateDocumentFiles(context).keySet();
+        Set<String> expectedOutputFiles = new HashSet<>();
+        expectedOutputFiles.add("entityTest.html");
+        assertEquals(expectedOutputFiles, outputFiles);
+    }
+
+    @Test
+    public void testLocateDocumentFilesWithNameClashes() throws IOException, RendererException {
+        SiteRenderingContext context = new SiteRenderingContext();
+        File sourceDirectory = getTestFile("src/test/resources/site-validate");
+        context.setRootDirectory(sourceDirectory);
+        context.addSiteDirectory(new SiteDirectory(sourceDirectory, true));
+        context.addSiteDirectory(new SiteDirectory(sourceDirectory, true));
+        assertThrows(RendererException.class, () -> siteRenderer.locateDocumentFiles(context));
+    }
+
+    @Test
+    public void testLocateDocumentFilesWithNameClashesInSkippingDuplicatesDirectory() throws IOException, RendererException {
+        SiteRenderingContext context = new SiteRenderingContext();
+        File sourceDirectory = getTestFile("src/test/resources/site-validate");
+        context.setRootDirectory(sourceDirectory);
+        context.addSiteDirectory(new SiteDirectory(sourceDirectory, true));
+        context.addSiteDirectory(new SiteDirectory(sourceDirectory, true, true));
+        Set<String> outputFiles = siteRenderer.locateDocumentFiles(context).keySet();
+        Set<String> expectedOutputFiles = new HashSet<>();
+        expectedOutputFiles.add("entityTest.html");
+        assertEquals(expectedOutputFiles, outputFiles);
+    }
+
     private SiteRenderingContext getSiteRenderingContext(SiteModel siteModel, String siteDir, boolean validate)
             throws RendererException, IOException {
         File skinFile = minimalSkinJar;