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

vy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/logging-log4j-tools.git

commit 8fda8c5b1c2d0b79bb2c7710893752731649974d
Author: Volkan Yazıcı <[email protected]>
AuthorDate: Thu Feb 29 14:06:58 2024 +0100

    Add type filter support to generators
---
 ...neratorMojo.java => AbstractGeneratorMojo.java} |  40 +--
 .../docgen/maven/DocumentationGeneratorMojo.java   |  27 +--
 .../log4j/docgen/maven/SchemaGeneratorMojo.java    |  29 +--
 .../logging/log4j/docgen/maven/TypeFilterMojo.java |  88 +++++++
 .../logging/log4j/docgen/generator/BaseTypes.java  |   4 +-
 .../docgen/generator/DocumentationGenerator.java   |   2 +-
 .../generator/DocumentationGeneratorArgs.java      |   5 +
 .../log4j/docgen/generator/SchemaGenerator.java    |  10 +-
 .../docgen/generator/SchemaGeneratorArgs.java      |   7 +-
 .../logging/log4j/docgen/generator/TypeLookup.java |  20 +-
 .../log4j/docgen/generator/base-java-types.xml     |  69 ------
 .../generator/DocumentationGeneratorTest.java      |   4 +
 .../docgen/generator/SchemaGeneratorTest.java      |   3 +-
 ....log4j.core.config.LoggerConfig.RootLogger.adoc |   2 +-
 ...che.logging.log4j.core.config.LoggerConfig.adoc |   2 +-
 .../plugins-to-freemarker-output/scalars.adoc      |  54 -----
 .../log4j-core/java.io.Serializable.adoc           |  27 ---
 .../log4j-core/java.lang.Cloneable.adoc            |  28 ---
 .../log4j-core/java.lang.Iterable.adoc             |  27 ---
 .../log4j-core/java.lang.Object.adoc               | 269 ---------------------
 .../log4j-core/java.lang.Runnable.adoc             |  29 ---
 .../log4j-core/java.util.Comparator.adoc           |  27 ---
 ....logging.log4j.core.appender.AsyncAppender.adoc |   4 +-
 ...ogging.log4j.core.appender.ConsoleAppender.adoc |   2 +-
 ...gging.log4j.core.appender.FailoverAppender.adoc |   2 +-
 ...e.logging.log4j.core.appender.FileAppender.adoc |   2 +-
 ...e.logging.log4j.core.appender.HttpAppender.adoc |   2 +-
 ...g4j.core.appender.MemoryMappedFileAppender.adoc |   2 +-
 ...g.log4j.core.appender.OutputStreamAppender.adoc |   2 +-
 ...g4j.core.appender.RandomAccessFileAppender.adoc |   2 +-
 ...ng.log4j.core.appender.RollingFileAppender.adoc |   2 +-
 ...e.appender.RollingRandomAccessFileAppender.adoc |   2 +-
 ...e.logging.log4j.core.appender.SmtpAppender.adoc |   2 +-
 ...logging.log4j.core.appender.SyslogAppender.adoc |   4 +-
 ...logging.log4j.core.appender.WriterAppender.adoc |   2 +-
 ...nder.db.jdbc.DriverManagerConnectionSource.adoc |   2 +-
 ...g.log4j.core.appender.db.jdbc.JdbcAppender.adoc |   6 +-
 ...ogging.log4j.core.appender.mom.JmsAppender.adoc |   2 +-
 ...4j.core.appender.mom.jeromq.JeroMqAppender.adoc |   2 +-
 ...og4j.core.appender.mom.kafka.KafkaAppender.adoc |   2 +-
 ...ng.log4j.core.appender.nosql.NoSqlAppender.adoc |   9 +-
 ...ender.rewrite.LoggerNameLevelRewritePolicy.adoc |   2 +-
 ...g4j.core.appender.rewrite.MapRewritePolicy.adoc |   2 +-
 ...og4j.core.appender.rewrite.RewriteAppender.adoc |   2 +-
 ...logging.log4j.core.appender.routing.Routes.adoc |   2 +-
 ...og4j.core.appender.routing.RoutingAppender.adoc |   2 +-
 ...4j.core.async.AsyncLoggerConfig.RootLogger.adoc |   4 +-
 ...logging.log4j.core.async.AsyncLoggerConfig.adoc |   4 +-
 ....log4j.core.config.LoggerConfig.RootLogger.adoc |   4 +-
 ...g.log4j.core.filter.DynamicThresholdFilter.adoc |   2 +-
 ...ache.logging.log4j.core.filter.RegexFilter.adoc |   2 +-
 ...ing.log4j.core.filter.StructuredDataFilter.adoc |   2 +-
 ...g.log4j.core.filter.ThreadContextMapFilter.adoc |   2 +-
 ...pache.logging.log4j.core.layout.GelfLayout.adoc |   7 +-
 ...pache.logging.log4j.core.layout.JsonLayout.adoc |   7 +-
 ...ing.log4j.core.layout.LevelPatternSelector.adoc |   2 +-
 ...che.logging.log4j.core.layout.LoggerFields.adoc |   2 +-
 ...ng.log4j.core.layout.MarkerPatternSelector.adoc |   2 +-
 ...he.logging.log4j.core.layout.Rfc5424Layout.adoc |   2 +-
 ...ng.log4j.core.layout.ScriptPatternSelector.adoc |   2 +-
 ...che.logging.log4j.core.layout.SyslogLayout.adoc |   5 +
 ...apache.logging.log4j.core.layout.XmlLayout.adoc |   7 +-
 ...pache.logging.log4j.core.layout.YamlLayout.adoc |   7 +-
 ...4j.layout.template.json.JsonTemplateLayout.adoc |   2 +-
 .../freemarker-output/scalars.adoc                 |  89 -------
 .../src/test/resources/templates/plugin.adoc.ftl   |  30 ++-
 .../src/test/resources/templates/scalars.adoc.ftl  |   4 +-
 .../tools/internal/test/util/FileTestUtils.java    |   5 +-
 68 files changed, 251 insertions(+), 778 deletions(-)

diff --git 
a/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/SchemaGeneratorMojo.java
 
b/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/AbstractGeneratorMojo.java
similarity index 51%
copy from 
log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/SchemaGeneratorMojo.java
copy to 
log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/AbstractGeneratorMojo.java
index 193db22..36603ba 100644
--- 
a/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/SchemaGeneratorMojo.java
+++ 
b/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/AbstractGeneratorMojo.java
@@ -17,25 +17,11 @@
 package org.apache.logging.log4j.docgen.maven;
 
 import java.io.File;
-import java.util.Set;
-import javax.xml.stream.XMLStreamException;
-import org.apache.logging.log4j.docgen.PluginSet;
-import org.apache.logging.log4j.docgen.generator.SchemaGenerator;
-import org.apache.logging.log4j.docgen.generator.SchemaGeneratorArgs;
 import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.jspecify.annotations.Nullable;
 
-/**
- * Goal generating an XSD from a given plugin descriptor, e.g., {@code 
plugins.xml}.
- *
- * @see SchemaGenerator
- */
-@Mojo(name = "generate-schema", defaultPhase = 
LifecyclePhase.GENERATE_RESOURCES, threadSafe = true)
-public class SchemaGeneratorMojo extends AbstractMojo {
+abstract class AbstractGeneratorMojo extends AbstractMojo {
 
     /**
      * The paths of the plugin descriptor XML files.
@@ -45,7 +31,7 @@ public class SchemaGeneratorMojo extends AbstractMojo {
      */
     @Nullable
     @Parameter(property = "log4j.docgen.descriptorFiles")
-    private File[] descriptorFiles;
+    File[] descriptorFiles;
 
     /**
      * The {@link java.nio.file.FileSystem#getPathMatcher(String) 
PathMatcher}s to populate the paths of the plugin descriptor XML files.
@@ -55,24 +41,12 @@ public class SchemaGeneratorMojo extends AbstractMojo {
      */
     @Nullable
     @Parameter
-    private PathMatcherMojo[] descriptorFileMatchers;
+    PathMatcherMojo[] descriptorFileMatchers;
 
     /**
-     * The path of the XSD file to write to
+     * Predicate for filtering types that the generator will operate on.
      */
-    @Parameter(property = "log4j.docgen.schemaFile", required = true)
-    private File schemaFile;
-
-    @Override
-    public void execute() throws MojoExecutionException {
-        final Set<PluginSet> pluginSets =
-                PluginSets.ofDescriptorFilesAndFileMatchers(descriptorFiles, 
descriptorFileMatchers);
-        try {
-            final SchemaGeneratorArgs generatorArgs = new 
SchemaGeneratorArgs(pluginSets, schemaFile.toPath());
-            SchemaGenerator.generateSchema(generatorArgs);
-        } catch (final XMLStreamException error) {
-            final String message = String.format("failed generating the schema 
file `%s`", schemaFile);
-            throw new MojoExecutionException(message, error);
-        }
-    }
+    @Nullable
+    @Parameter
+    TypeFilterMojo typeFilter;
 }
diff --git 
a/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/DocumentationGeneratorMojo.java
 
b/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/DocumentationGeneratorMojo.java
index 16c3c41..4ea6e6d 100644
--- 
a/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/DocumentationGeneratorMojo.java
+++ 
b/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/DocumentationGeneratorMojo.java
@@ -18,15 +18,14 @@ package org.apache.logging.log4j.docgen.maven;
 
 import java.io.File;
 import java.util.Set;
+import java.util.function.Predicate;
 import org.apache.logging.log4j.docgen.PluginSet;
 import org.apache.logging.log4j.docgen.generator.DocumentationGenerator;
 import org.apache.logging.log4j.docgen.generator.DocumentationGeneratorArgs;
 import org.apache.logging.log4j.docgen.generator.DocumentationTemplate;
-import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
-import org.jspecify.annotations.Nullable;
 
 /**
  * Goal generating documentation by feeding the configuration collected from 
the provided plugin descriptors (e.g., {@code plugins.xml}) to the FreeMarker 
templates provided.
@@ -34,27 +33,7 @@ import org.jspecify.annotations.Nullable;
  * @see DocumentationGenerator
  */
 @Mojo(name = "generate-documentation", defaultPhase = 
LifecyclePhase.GENERATE_RESOURCES, threadSafe = true)
-public class DocumentationGeneratorMojo extends AbstractMojo {
-
-    /**
-     * The paths of the plugin descriptor XML files.
-     * <p>
-     * If you want to provide to a multitude of files, you might want to use 
{@link #descriptorFileMatchers} instead.
-     * </p>
-     */
-    @Nullable
-    @Parameter(property = "log4j.docgen.descriptorFiles")
-    private File[] descriptorFiles;
-
-    /**
-     * The {@link java.nio.file.FileSystem#getPathMatcher(String) 
PathMatcher}s to populate the paths of the plugin descriptor XML files.
-     * <p>
-     * If you want to refer to a particular file, you might want to use {@link 
#descriptorFiles} instead.
-     * </p>
-     */
-    @Nullable
-    @Parameter
-    private PathMatcherMojo[] descriptorFileMatchers;
+public class DocumentationGeneratorMojo extends AbstractGeneratorMojo {
 
     /**
      * The path to the FreeMarker template directory.
@@ -84,8 +63,10 @@ public class DocumentationGeneratorMojo extends AbstractMojo 
{
     public void execute() {
         final Set<PluginSet> pluginSets =
                 PluginSets.ofDescriptorFilesAndFileMatchers(descriptorFiles, 
descriptorFileMatchers);
+        final Predicate<String> classNameFilter = typeFilter != null ? 
typeFilter.createPredicate() : ignored -> true;
         final DocumentationGeneratorArgs generatorArgs = new 
DocumentationGeneratorArgs(
                 pluginSets,
+                classNameFilter,
                 templateDirectory.toPath(),
                 toApiModel(scalarsTemplate),
                 toApiModel(pluginTemplate),
diff --git 
a/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/SchemaGeneratorMojo.java
 
b/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/SchemaGeneratorMojo.java
index 193db22..26f8366 100644
--- 
a/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/SchemaGeneratorMojo.java
+++ 
b/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/SchemaGeneratorMojo.java
@@ -18,16 +18,15 @@ package org.apache.logging.log4j.docgen.maven;
 
 import java.io.File;
 import java.util.Set;
+import java.util.function.Predicate;
 import javax.xml.stream.XMLStreamException;
 import org.apache.logging.log4j.docgen.PluginSet;
 import org.apache.logging.log4j.docgen.generator.SchemaGenerator;
 import org.apache.logging.log4j.docgen.generator.SchemaGeneratorArgs;
-import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
-import org.jspecify.annotations.Nullable;
 
 /**
  * Goal generating an XSD from a given plugin descriptor, e.g., {@code 
plugins.xml}.
@@ -35,27 +34,7 @@ import org.jspecify.annotations.Nullable;
  * @see SchemaGenerator
  */
 @Mojo(name = "generate-schema", defaultPhase = 
LifecyclePhase.GENERATE_RESOURCES, threadSafe = true)
-public class SchemaGeneratorMojo extends AbstractMojo {
-
-    /**
-     * The paths of the plugin descriptor XML files.
-     * <p>
-     * If you want to provide to a multitude of files, you might want to use 
{@link #descriptorFileMatchers} instead.
-     * </p>
-     */
-    @Nullable
-    @Parameter(property = "log4j.docgen.descriptorFiles")
-    private File[] descriptorFiles;
-
-    /**
-     * The {@link java.nio.file.FileSystem#getPathMatcher(String) 
PathMatcher}s to populate the paths of the plugin descriptor XML files.
-     * <p>
-     * If you want to refer to a particular file, you might want to use {@link 
#descriptorFiles} instead.
-     * </p>
-     */
-    @Nullable
-    @Parameter
-    private PathMatcherMojo[] descriptorFileMatchers;
+public class SchemaGeneratorMojo extends AbstractGeneratorMojo {
 
     /**
      * The path of the XSD file to write to
@@ -67,8 +46,10 @@ public class SchemaGeneratorMojo extends AbstractMojo {
     public void execute() throws MojoExecutionException {
         final Set<PluginSet> pluginSets =
                 PluginSets.ofDescriptorFilesAndFileMatchers(descriptorFiles, 
descriptorFileMatchers);
+        final Predicate<String> classNameFilter = typeFilter != null ? 
typeFilter.createPredicate() : ignored -> true;
         try {
-            final SchemaGeneratorArgs generatorArgs = new 
SchemaGeneratorArgs(pluginSets, schemaFile.toPath());
+            final SchemaGeneratorArgs generatorArgs =
+                    new SchemaGeneratorArgs(pluginSets, classNameFilter, 
schemaFile.toPath());
             SchemaGenerator.generateSchema(generatorArgs);
         } catch (final XMLStreamException error) {
             final String message = String.format("failed generating the schema 
file `%s`", schemaFile);
diff --git 
a/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/TypeFilterMojo.java
 
b/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/TypeFilterMojo.java
new file mode 100644
index 0000000..ac808e8
--- /dev/null
+++ 
b/log4j-docgen-maven-plugin/src/main/java/org/apache/logging/log4j/docgen/maven/TypeFilterMojo.java
@@ -0,0 +1,88 @@
+/*
+ * 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.logging.log4j.docgen.maven;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Predicate;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.jspecify.annotations.Nullable;
+
+/**
+ * Models a predicate for filtering types that a generator will operate on.
+ */
+public final class TypeFilterMojo {
+
+    /**
+     * The regular expressions that will be matched against the class name 
(e.g., {@code java.lang.String}) to determine the types that will be 
<em>included</em> for processing by the generator.
+     * <p>
+     * The type will be included if it matches one or more patterns.
+     * </p><p>
+     * The collection defaults to {@code [".*"]}, that is, all types are 
accepted.
+     * </p>
+     */
+    @Nullable
+    @Parameter
+    private String[] includes;
+
+    /**
+     * The regular expressions that will be matched against the class name 
(e.g., {@code java.lang.String}) to determine the types that will be 
<em>excluded</em> for processing the generator.
+     * <p>
+     * The type will be excluded if it matches one or more patterns.
+     * </p><p>
+     * The collection is empty by default, that is, no types will be discarded.
+     * </p>
+     */
+    @Nullable
+    @Parameter
+    private String[] excludes;
+
+    Predicate<String> createPredicate() {
+        final String[] effectiveIncludes = includes != null && includes.length 
> 0 ? includes : new String[] {".*"};
+        final List<Pattern> inclusionPatterns = compilePatterns("includes", 
effectiveIncludes);
+        final List<Pattern> exclusionPatterns = compilePatterns("excludes", 
excludes);
+        return (final String className) -> {
+            final boolean included = inclusionPatterns.stream()
+                    .anyMatch(pattern -> pattern.matcher(className).matches());
+            if (included) {
+                final boolean excluded = exclusionPatterns.stream()
+                        .anyMatch(pattern -> 
pattern.matcher(className).matches());
+                return !excluded;
+            }
+            return false;
+        };
+    }
+
+    private static List<Pattern> compilePatterns(final String fieldName, 
@Nullable final String[] patterns) {
+        if (patterns == null || patterns.length == 0) {
+            return Collections.emptyList();
+        }
+        return Arrays.stream(patterns)
+                .map(pattern -> {
+                    try {
+                        return Pattern.compile(pattern);
+                    } catch (final Exception error) {
+                        final String message = String.format("invalid `%s` 
pattern: `%s`", fieldName, pattern);
+                        throw new IllegalArgumentException(message, error);
+                    }
+                })
+                .collect(Collectors.toList());
+    }
+}
diff --git 
a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/BaseTypes.java
 
b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/BaseTypes.java
index 355e4f3..4127f7f 100644
--- 
a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/BaseTypes.java
+++ 
b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/BaseTypes.java
@@ -28,9 +28,7 @@ final class BaseTypes {
     static final Set<PluginSet> PLUGIN_SETS = readBaseTypes();
 
     private static Set<PluginSet> readBaseTypes() {
-        return Stream.of("base-java-types.xml", "base-log4j-types.xml")
-                .map(BaseTypes::readBaseTypes)
-                .collect(Collectors.toSet());
+        return 
Stream.of("base-log4j-types.xml").map(BaseTypes::readBaseTypes).collect(Collectors.toSet());
     }
 
     private static PluginSet readBaseTypes(final String resourceName) {
diff --git 
a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/DocumentationGenerator.java
 
b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/DocumentationGenerator.java
index c2a6871..e1b1bb0 100644
--- 
a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/DocumentationGenerator.java
+++ 
b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/DocumentationGenerator.java
@@ -41,7 +41,7 @@ public final class DocumentationGenerator {
         requireNonNull(args, "args");
         final List<PluginSet> extendedSets = 
Stream.concat(BaseTypes.PLUGIN_SETS.stream(), args.pluginSets.stream())
                 .collect(Collectors.toList());
-        final TypeLookup lookup = TypeLookup.of(extendedSets);
+        final TypeLookup lookup = TypeLookup.of(extendedSets, 
args.classNameFilter);
         final Collection<ArtifactSourcedType> scalarTypes = new TreeSet<>();
         lookup.forEach((className, sourcedType) -> {
             final Type type = sourcedType.type;
diff --git 
a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/DocumentationGeneratorArgs.java
 
b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/DocumentationGeneratorArgs.java
index f2dbfde..5da94de 100644
--- 
a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/DocumentationGeneratorArgs.java
+++ 
b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/DocumentationGeneratorArgs.java
@@ -20,12 +20,15 @@ import static java.util.Objects.requireNonNull;
 
 import java.nio.file.Path;
 import java.util.Set;
+import java.util.function.Predicate;
 import org.apache.logging.log4j.docgen.PluginSet;
 
 public final class DocumentationGeneratorArgs {
 
     final Set<PluginSet> pluginSets;
 
+    final Predicate<String> classNameFilter;
+
     final Path templateDirectory;
 
     final DocumentationTemplate scalarsTemplate;
@@ -36,11 +39,13 @@ public final class DocumentationGeneratorArgs {
 
     public DocumentationGeneratorArgs(
             final Set<PluginSet> pluginSets,
+            final Predicate<String> classNameFilter,
             final Path templateDirectory,
             final DocumentationTemplate scalarsTemplate,
             final DocumentationTemplate pluginTemplate,
             final DocumentationTemplate interfaceTemplate) {
         this.pluginSets = requireNonNull(pluginSets, "pluginSets");
+        this.classNameFilter = requireNonNull(classNameFilter, 
"classNameFilter");
         this.templateDirectory = requireNonNull(templateDirectory, 
"templateDirectory");
         this.scalarsTemplate = requireNonNull(scalarsTemplate, 
"scalarsTemplate");
         this.pluginTemplate = requireNonNull(pluginTemplate, "pluginTemplate");
diff --git 
a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/SchemaGenerator.java
 
b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/SchemaGenerator.java
index 6381f55..9a7cccc 100644
--- 
a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/SchemaGenerator.java
+++ 
b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/SchemaGenerator.java
@@ -68,7 +68,7 @@ public final class SchemaGenerator {
         try {
             final List<PluginSet> extendedSets = 
Stream.concat(BaseTypes.PLUGIN_SETS.stream(), args.pluginSets.stream())
                     .collect(Collectors.toList());
-            final TypeLookup lookup = TypeLookup.of(extendedSets);
+            final TypeLookup lookup = TypeLookup.of(extendedSets, 
args.classNameFilter);
             final XMLOutputFactory factory = XMLOutputFactory.newFactory();
             @Nullable final Path schemaFileParent = 
args.schemaFile.getParent();
             if (schemaFileParent != null) {
@@ -207,7 +207,7 @@ public final class SchemaGenerator {
         }
         for (final String implementation : implementations) {
             @Nullable final ArtifactSourcedType sourcedType = 
lookup.get(implementation);
-            if (sourcedType != null) {
+            if (sourcedType != null && sourcedType.type instanceof PluginType) 
{
                 final PluginType pluginType = (PluginType) sourcedType.type;
                 for (final String key : getKeyAndAliases(pluginType)) {
                     writer.writeEmptyElement(XSD_NAMESPACE, "element");
@@ -250,7 +250,11 @@ public final class SchemaGenerator {
         if (xmlType == null) {
             return;
         }
-        final Type rawType = lookup.get(type).type;
+        final ArtifactSourcedType sourcedType = lookup.get(type);
+        if (sourcedType == null) {
+            return;
+        }
+        final Type rawType = sourcedType.type;
         if (!(rawType instanceof AbstractType)) {
             return;
         }
diff --git 
a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/SchemaGeneratorArgs.java
 
b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/SchemaGeneratorArgs.java
index bfb7336..8a1b8ea 100644
--- 
a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/SchemaGeneratorArgs.java
+++ 
b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/SchemaGeneratorArgs.java
@@ -20,16 +20,21 @@ import static java.util.Objects.requireNonNull;
 
 import java.nio.file.Path;
 import java.util.Set;
+import java.util.function.Predicate;
 import org.apache.logging.log4j.docgen.PluginSet;
 
 public final class SchemaGeneratorArgs {
 
     final Set<PluginSet> pluginSets;
 
+    final Predicate<String> classNameFilter;
+
     final Path schemaFile;
 
-    public SchemaGeneratorArgs(final Set<PluginSet> pluginSets, final Path 
schemaFile) {
+    public SchemaGeneratorArgs(
+            final Set<PluginSet> pluginSets, final Predicate<String> 
classNameFilter, final Path schemaFile) {
         this.pluginSets = requireNonNull(pluginSets, "pluginSets");
+        this.classNameFilter = requireNonNull(classNameFilter, 
"classNameFilter");
         this.schemaFile = requireNonNull(schemaFile, "schemaFile");
     }
 }
diff --git 
a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/TypeLookup.java
 
b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/TypeLookup.java
index c77d591..598fcfc 100644
--- 
a/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/TypeLookup.java
+++ 
b/log4j-docgen/src/main/java/org/apache/logging/log4j/docgen/generator/TypeLookup.java
@@ -16,8 +16,10 @@
  */
 package org.apache.logging.log4j.docgen.generator;
 
+import java.util.Iterator;
 import java.util.Set;
 import java.util.TreeMap;
+import java.util.function.Predicate;
 import org.apache.logging.log4j.docgen.AbstractType;
 import org.apache.logging.log4j.docgen.PluginSet;
 import org.apache.logging.log4j.docgen.PluginType;
@@ -27,13 +29,14 @@ final class TypeLookup extends TreeMap<String, 
ArtifactSourcedType> {
 
     private static final long serialVersionUID = 1L;
 
-    static TypeLookup of(final Iterable<? extends PluginSet> pluginSets) {
-        return new TypeLookup(pluginSets);
+    static TypeLookup of(final Iterable<? extends PluginSet> pluginSets, final 
Predicate<String> classNameFilter) {
+        return new TypeLookup(pluginSets, classNameFilter);
     }
 
-    private TypeLookup(final Iterable<? extends PluginSet> pluginSets) {
+    private TypeLookup(final Iterable<? extends PluginSet> pluginSets, final 
Predicate<String> classNameFilter) {
         mergeDescriptors(pluginSets);
         populateTypeHierarchy(pluginSets);
+        filterTypes(classNameFilter);
     }
 
     private void mergeDescriptors(Iterable<? extends PluginSet> pluginSets) {
@@ -103,4 +106,15 @@ final class TypeLookup extends TreeMap<String, 
ArtifactSourcedType> {
             return type;
         }
     }
+
+    private void filterTypes(final Predicate<String> classNameMatcher) {
+        final Iterator<String> classNameIterator = keySet().iterator();
+        while (classNameIterator.hasNext()) {
+            final String className = classNameIterator.next();
+            final boolean matching = classNameMatcher.test(className);
+            if (!matching) {
+                classNameIterator.remove();
+            }
+        }
+    }
 }
diff --git 
a/log4j-docgen/src/main/resources/org/apache/logging/log4j/docgen/generator/base-java-types.xml
 
b/log4j-docgen/src/main/resources/org/apache/logging/log4j/docgen/generator/base-java-types.xml
deleted file mode 100644
index f6fed10..0000000
--- 
a/log4j-docgen/src/main/resources/org/apache/logging/log4j/docgen/generator/base-java-types.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ 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.
-  -->
-<pluginSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-           xmlns="https://logging.apache.org/xml/ns";
-           xsi:schemaLocation="https://logging.apache.org/xml/ns 
https://logging.apache.org/xml/ns/log4j-plugins-0.1.0.xsd";
-           version="0.1.0">
-
-  <description>Java type definitions untraceable from the plugin 
hierarchy.</description>
-
-  <scalars>
-
-    <scalar className="boolean">
-      <description>A boolean value</description>
-      <values>
-        <value name="false">
-          <description>false</description>
-        </value>
-        <value name="true">
-          <description>true</description>
-        </value>
-      </values>
-    </scalar>
-
-    <scalar className="byte">
-      <description>An 8-bit signed integer from `-128` to `127`</description>
-    </scalar>
-
-    <scalar className="short">
-      <description>A 16-bit signed integer from `-32768` to 
`32767`</description>
-    </scalar>
-
-    <scalar className="int">
-      <description>A 32-bit signed integer from `-2147483648` to 
`2147483647`</description>
-    </scalar>
-
-    <scalar className="long">
-      <description>A 64-bit signed integer from `-9223372036854775808` to 
`9223372036854775807`</description>
-    </scalar>
-
-    <scalar className="float">
-      <description>A single precision floating number from `1.40239846e-45` to 
`3.40282347e+38`</description>
-    </scalar>
-
-    <scalar className="double">
-      <description>A double precision floating number from 
`4.94065645841246544e-324` to `1.79769313486231570e+308`</description>
-    </scalar>
-
-    <scalar className="java.lang.String">
-      <description>A string of characters</description>
-    </scalar>
-
-  </scalars>
-
-</pluginSet>
diff --git 
a/log4j-docgen/src/test/java/org/apache/logging/log4j/docgen/generator/DocumentationGeneratorTest.java
 
b/log4j-docgen/src/test/java/org/apache/logging/log4j/docgen/generator/DocumentationGeneratorTest.java
index bf6c814..5627a19 100644
--- 
a/log4j-docgen/src/test/java/org/apache/logging/log4j/docgen/generator/DocumentationGeneratorTest.java
+++ 
b/log4j-docgen/src/test/java/org/apache/logging/log4j/docgen/generator/DocumentationGeneratorTest.java
@@ -23,6 +23,7 @@ import static 
org.apache.logging.log4j.tools.internal.test.util.FileTestUtils.as
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Set;
+import java.util.function.Predicate;
 import org.apache.logging.log4j.docgen.PluginSet;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.CleanupMode;
@@ -30,6 +31,8 @@ import org.junit.jupiter.api.io.TempDir;
 
 public class DocumentationGeneratorTest {
 
+    private static final Predicate<String> CLASS_NAME_MATCHER = className -> 
!className.startsWith("java.");
+
     @Test
     void simple_descriptor_should_work(@TempDir(cleanup = 
CleanupMode.ON_SUCCESS) final Path outputDir) {
         final PluginSet pluginSet = 
readDescriptor("src/test/resources/example-plugins.xml");
@@ -54,6 +57,7 @@ public class DocumentationGeneratorTest {
         final Path templateDirectory = 
Paths.get("src/test/resources/templates");
         final DocumentationGeneratorArgs generatorArgs = new 
DocumentationGeneratorArgs(
                 pluginSets,
+                CLASS_NAME_MATCHER,
                 templateDirectory,
                 new DocumentationTemplate(
                         "scalars.adoc.ftl", 
outputDir.resolve("scalars.adoc").toString()),
diff --git 
a/log4j-docgen/src/test/java/org/apache/logging/log4j/docgen/generator/SchemaGeneratorTest.java
 
b/log4j-docgen/src/test/java/org/apache/logging/log4j/docgen/generator/SchemaGeneratorTest.java
index 64e9da5..40e7ab7 100644
--- 
a/log4j-docgen/src/test/java/org/apache/logging/log4j/docgen/generator/SchemaGeneratorTest.java
+++ 
b/log4j-docgen/src/test/java/org/apache/logging/log4j/docgen/generator/SchemaGeneratorTest.java
@@ -53,7 +53,8 @@ public class SchemaGeneratorTest {
 
         // Generate the schema
         final Path schemaFile = outputDir.resolve("config.xsd");
-        final SchemaGeneratorArgs generatorArgs = new 
SchemaGeneratorArgs(Set.of(pluginSet), schemaFile);
+        final SchemaGeneratorArgs generatorArgs =
+                new SchemaGeneratorArgs(Set.of(pluginSet), ignored -> true, 
schemaFile);
         SchemaGenerator.generateSchema(generatorArgs);
 
         // Return the generated XSD file path
diff --git 
a/log4j-docgen/src/test/resources/plugins-to-freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.config.LoggerConfig.RootLogger.adoc
 
b/log4j-docgen/src/test/resources/plugins-to-freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.config.LoggerConfig.RootLogger.adoc
index 1d2c042..f03e276 100644
--- 
a/log4j-docgen/src/test/resources/plugins-to-freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.config.LoggerConfig.RootLogger.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-to-freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.config.LoggerConfig.RootLogger.adoc
@@ -28,7 +28,7 @@ Configures the root logger
 ----
 <Root includeLocation=""
       level="ERROR">
-    <AppenderRef/>
+    <AppenderRef/><!-- multiple occurrences allowed -->
     <a-Filter-implementation/>
 </Root>
 ----
diff --git 
a/log4j-docgen/src/test/resources/plugins-to-freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.config.LoggerConfig.adoc
 
b/log4j-docgen/src/test/resources/plugins-to-freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.config.LoggerConfig.adoc
index d4286c6..74aebc2 100644
--- 
a/log4j-docgen/src/test/resources/plugins-to-freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.config.LoggerConfig.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-to-freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.config.LoggerConfig.adoc
@@ -29,7 +29,7 @@ Configures a particular logger
 <Logger includeLocation=""
         level=""
         name="">
-    <AppenderRef/>
+    <AppenderRef/><!-- multiple occurrences allowed -->
     <a-Filter-implementation/>
 </Logger>
 ----
diff --git 
a/log4j-docgen/src/test/resources/plugins-to-freemarker-output/scalars.adoc 
b/log4j-docgen/src/test/resources/plugins-to-freemarker-output/scalars.adoc
index d147a94..9bef793 100644
--- a/log4j-docgen/src/test/resources/plugins-to-freemarker-output/scalars.adoc
+++ b/log4j-docgen/src/test/resources/plugins-to-freemarker-output/scalars.adoc
@@ -19,54 +19,6 @@ limitations under the License.
 
 Type converter plugins are used to convert simple `String` values into other 
types.
 
-[#boolean]
-== `boolean`
-
-
-A boolean value
-
-[#boolean-values]
-=== Possible values
-
-`false`:: false
-`true`:: true
-
-[#byte]
-== `byte`
-
-
-An 8-bit signed integer from `-128` to `127`
-
-[#double]
-== `double`
-
-
-A double precision floating number from `4.94065645841246544e-324` to 
`1.79769313486231570e+308`
-
-[#float]
-== `float`
-
-
-A single precision floating number from `1.40239846e-45` to `3.40282347e+38`
-
-[#int]
-== `int`
-
-
-A 32-bit signed integer from `-2147483648` to `2147483647`
-
-[#java_lang_String]
-== `java.lang.String`
-
-
-A string of characters
-
-[#long]
-== `long`
-
-
-A 64-bit signed integer from `-9223372036854775808` to `9223372036854775807`
-
 [#org_apache_logging_log4j_Level]
 == `org.apache.logging.log4j.Level`
 
@@ -114,9 +66,3 @@ Specifies the target of a console appender.
 
 `SYSTEM_OUT`:: Logs to the standard output.
 `SYSTEM_ERR`:: Logs to the standard error.
-
-[#short]
-== `short`
-
-
-A 16-bit signed integer from `-32768` to `32767`
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.io.Serializable.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.io.Serializable.adoc
deleted file mode 100644
index de37d91..0000000
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.io.Serializable.adoc
+++ /dev/null
@@ -1,27 +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
-
-    https://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.
-////
-[#java_io_Serializable]
-= Serializable
-
-Class:: `java.io.Serializable`
-Provider:: `org.apache.logging.log4j:log4j-core`
-
-
-[#java_io_Serializable-implementations]
-== Known implementations
-
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.PathSortByModificationTime.adoc[PathSortByModificationTime]
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.lang.Cloneable.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.lang.Cloneable.adoc
deleted file mode 100644
index 3823ba2..0000000
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.lang.Cloneable.adoc
+++ /dev/null
@@ -1,28 +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
-
-    https://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.
-////
-[#java_lang_Cloneable]
-= Cloneable
-
-Class:: `java.lang.Cloneable`
-Provider:: `org.apache.logging.log4j:log4j-core`
-
-
-[#java_lang_Cloneable-implementations]
-== Known implementations
-
-* 
xref:../log4j-core/org.apache.logging.log4j.core.net.SocketOptions.adoc[SocketOptions]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.net.SocketPerformancePreferences.adoc[SocketPerformancePreferences]
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.lang.Iterable.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.lang.Iterable.adoc
deleted file mode 100644
index 16891df..0000000
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.lang.Iterable.adoc
+++ /dev/null
@@ -1,27 +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
-
-    https://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.
-////
-[#java_lang_Iterable]
-= Iterable
-
-Class:: `java.lang.Iterable`
-Provider:: `org.apache.logging.log4j:log4j-core`
-
-
-[#java_lang_Iterable-implementations]
-== Known implementations
-
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.CompositeFilter.adoc[CompositeFilter]
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.lang.Object.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.lang.Object.adoc
deleted file mode 100644
index 56cd86b..0000000
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.lang.Object.adoc
+++ /dev/null
@@ -1,269 +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
-
-    https://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.
-////
-[#java_lang_Object]
-= Object
-
-Class:: `java.lang.Object`
-Provider:: `org.apache.logging.log4j:log4j-core`
-
-
-[#java_lang_Object-implementations]
-== Known implementations
-
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.AppenderSet.adoc[AppenderSet]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.AsyncAppender.adoc[AsyncAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.ConsoleAppender.adoc[ConsoleAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.CountingNoOpAppender.adoc[CountingNoOpAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.FailoverAppender.adoc[FailoverAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.FailoversPlugin.adoc[FailoversPlugin]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.FileAppender.adoc[FileAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.HttpAppender.adoc[HttpAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.MemoryMappedFileAppender.adoc[MemoryMappedFileAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.NullAppender.adoc[NullAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.OutputStreamAppender.adoc[OutputStreamAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.RandomAccessFileAppender.adoc[RandomAccessFileAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.RollingFileAppender.adoc[RollingFileAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.adoc[RollingRandomAccessFileAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.ScriptAppenderSelector.adoc[ScriptAppenderSelector]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.SmtpAppender.adoc[SmtpAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.SocketAppender.adoc[SocketAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.SyslogAppender.adoc[SyslogAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.WriterAppender.adoc[WriterAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.db.ColumnMapping.adoc[ColumnMapping]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.db.jdbc.ColumnConfig.adoc[ColumnConfig]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.db.jdbc.DataSourceConnectionSource.adoc[DataSourceConnectionSource]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.db.jdbc.DriverManagerConnectionSource.adoc[DriverManagerConnectionSource]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.db.jdbc.FactoryMethodConnectionSource.adoc[FactoryMethodConnectionSource]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender.adoc[JdbcAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.mom.JmsAppender.adoc[JmsAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.mom.jeromq.JeroMqAppender.adoc[JeroMqAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender.adoc[KafkaAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.nosql.NoSqlAppender.adoc[NoSqlAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rewrite.LoggerNameLevelRewritePolicy.adoc[LoggerNameLevelRewritePolicy]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rewrite.MapRewritePolicy.adoc[MapRewritePolicy]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rewrite.PropertiesRewritePolicy.adoc[PropertiesRewritePolicy]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rewrite.RewriteAppender.adoc[RewriteAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.CompositeTriggeringPolicy.adoc[CompositeTriggeringPolicy]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.CronTriggeringPolicy.adoc[CronTriggeringPolicy]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.adoc[DefaultRolloverStrategy]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.DirectWriteRolloverStrategy.adoc[DirectWriteRolloverStrategy]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.NoOpTriggeringPolicy.adoc[NoOpTriggeringPolicy]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.OnStartupTriggeringPolicy.adoc[OnStartupTriggeringPolicy]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.SizeBasedTriggeringPolicy.adoc[SizeBasedTriggeringPolicy]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy.adoc[TimeBasedTriggeringPolicy]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.DeleteAction.adoc[DeleteAction]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.IfAccumulatedFileCount.adoc[IfAccumulatedFileCount]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.IfAccumulatedFileSize.adoc[IfAccumulatedFileSize]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.IfAll.adoc[IfAll]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.IfAny.adoc[IfAny]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.IfFileName.adoc[IfFileName]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.IfLastModified.adoc[IfLastModified]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.IfNot.adoc[IfNot]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.PathSortByModificationTime.adoc[PathSortByModificationTime]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.adoc[PosixViewAttributeAction]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.ScriptCondition.adoc[ScriptCondition]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.routing.IdlePurgePolicy.adoc[IdlePurgePolicy]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.routing.Route.adoc[Route]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.routing.Routes.adoc[Routes]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.routing.RoutingAppender.adoc[RoutingAppender]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.async.ArrayBlockingQueueFactory.adoc[ArrayBlockingQueueFactory]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.async.AsyncLoggerConfig.adoc[AsyncLoggerConfig]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.async.AsyncLoggerConfig.RootLogger.adoc[RootLogger]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.async.AsyncWaitStrategyFactoryConfig.adoc[AsyncWaitStrategyFactoryConfig]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.async.DisruptorBlockingQueueFactory.adoc[DisruptorBlockingQueueFactory]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.async.JCToolsBlockingQueueFactory.adoc[JCToolsBlockingQueueFactory]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.async.LinkedTransferQueueFactory.adoc[LinkedTransferQueueFactory]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.AppenderRef.adoc[AppenderRef]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.AppendersPlugin.adoc[AppendersPlugin]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.CustomLevelConfig.adoc[CustomLevelConfig]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.CustomLevels.adoc[CustomLevels]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.DefaultAdvertiser.adoc[DefaultAdvertiser]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.HttpWatcher.adoc[HttpWatcher]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.LoggerConfig.adoc[LoggerConfig]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.LoggerConfig.RootLogger.adoc[RootLogger]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.LoggersPlugin.adoc[LoggersPlugin]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.PropertiesPlugin.adoc[PropertiesPlugin]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.Property.adoc[Property]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.ScriptsPlugin.adoc[ScriptsPlugin]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.arbiters.ClassArbiter.adoc[ClassArbiter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.arbiters.DefaultArbiter.adoc[DefaultArbiter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.arbiters.EnvironmentArbiter.adoc[EnvironmentArbiter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.arbiters.ScriptArbiter.adoc[ScriptArbiter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.arbiters.SelectArbiter.adoc[SelectArbiter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.arbiters.SystemPropertyArbiter.adoc[SystemPropertyArbiter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.json.JsonConfigurationFactory.adoc[JsonConfigurationFactory]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.BigDecimalConverter.adoc[BigDecimalConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.BigIntegerConverter.adoc[BigIntegerConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.BooleanConverter.adoc[BooleanConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.ByteArrayConverter.adoc[ByteArrayConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.ByteConverter.adoc[ByteConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.CharArrayConverter.adoc[CharArrayConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.CharacterConverter.adoc[CharacterConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.CharsetConverter.adoc[CharsetConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.ClassConverter.adoc[ClassConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.CronExpressionConverter.adoc[CronExpressionConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.DoubleConverter.adoc[DoubleConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.DurationConverter.adoc[DurationConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.FileConverter.adoc[FileConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.FloatConverter.adoc[FloatConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.InetAddressConverter.adoc[InetAddressConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.IntegerConverter.adoc[IntegerConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.LevelConverter.adoc[LevelConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.LongConverter.adoc[LongConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.PathConverter.adoc[PathConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.PatternConverter.adoc[PatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.SecurityProviderConverter.adoc[SecurityProviderConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.ShortConverter.adoc[ShortConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.StringConverter.adoc[StringConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.UriConverter.adoc[UriConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.UrlConverter.adoc[UrlConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.plugins.convert.TypeConverters.UuidConverter.adoc[UuidConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.properties.PropertiesConfigurationFactory.adoc[PropertiesConfigurationFactory]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.xml.XmlConfigurationFactory.adoc[XmlConfigurationFactory]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.config.yaml.YamlConfigurationFactory.adoc[YamlConfigurationFactory]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.BurstFilter.adoc[BurstFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.CompositeFilter.adoc[CompositeFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.DenyAllFilter.adoc[DenyAllFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.DynamicThresholdFilter.adoc[DynamicThresholdFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.LevelMatchFilter.adoc[LevelMatchFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.LevelRangeFilter.adoc[LevelRangeFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.MapFilter.adoc[MapFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.MarkerFilter.adoc[MarkerFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.MutableThreadContextMapFilter.adoc[MutableThreadContextMapFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.NoMarkerFilter.adoc[NoMarkerFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.RegexFilter.adoc[RegexFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.ScriptFilter.adoc[ScriptFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.StringMatchFilter.adoc[StringMatchFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.StructuredDataFilter.adoc[StructuredDataFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.ThreadContextMapFilter.adoc[ThreadContextMapFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.ThresholdFilter.adoc[ThresholdFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.filter.TimeFilter.adoc[TimeFilter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.CsvLogEventLayout.adoc[CsvLogEventLayout]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.CsvParameterLayout.adoc[CsvParameterLayout]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.GelfLayout.adoc[GelfLayout]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.HtmlLayout.adoc[HtmlLayout]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.JsonLayout.adoc[JsonLayout]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.LevelPatternSelector.adoc[LevelPatternSelector]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.LoggerFields.adoc[LoggerFields]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.MarkerPatternSelector.adoc[MarkerPatternSelector]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.MessageLayout.adoc[MessageLayout]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.PatternLayout.adoc[PatternLayout]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.PatternMatch.adoc[PatternMatch]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.Rfc5424Layout.adoc[Rfc5424Layout]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.ScriptPatternSelector.adoc[ScriptPatternSelector]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.SerializedLayout.adoc[SerializedLayout]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.SyslogLayout.adoc[SyslogLayout]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.XmlLayout.adoc[XmlLayout]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.layout.YamlLayout.adoc[YamlLayout]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.ContextMapLookup.adoc[ContextMapLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.DateLookup.adoc[DateLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.EnvironmentLookup.adoc[EnvironmentLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.EventLookup.adoc[EventLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.JavaLookup.adoc[JavaLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.JmxRuntimeInputArgumentsLookup.adoc[JmxRuntimeInputArgumentsLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.JndiLookup.adoc[JndiLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.Log4jLookup.adoc[Log4jLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.LowerLookup.adoc[LowerLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.MainMapLookup.adoc[MainMapLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.MapLookup.adoc[MapLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.MarkerLookup.adoc[MarkerLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.ResourceBundleLookup.adoc[ResourceBundleLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.StructuredDataLookup.adoc[StructuredDataLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.SystemPropertiesLookup.adoc[SystemPropertiesLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.lookup.UpperLookup.adoc[UpperLookup]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.net.MulticastDnsAdvertiser.adoc[MulticastDnsAdvertiser]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.net.SocketAddress.adoc[SocketAddress]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.net.SocketOptions.adoc[SocketOptions]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.net.SocketPerformancePreferences.adoc[SocketPerformancePreferences]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.net.ssl.KeyStoreConfiguration.adoc[KeyStoreConfiguration]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.net.ssl.SslConfiguration.adoc[SslConfiguration]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.net.ssl.TrustStoreConfiguration.adoc[TrustStoreConfiguration]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.AbstractStyleNameConverter.Black.adoc[Black]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.AbstractStyleNameConverter.Blue.adoc[Blue]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.AbstractStyleNameConverter.Cyan.adoc[Cyan]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.AbstractStyleNameConverter.Green.adoc[Green]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.AbstractStyleNameConverter.Magenta.adoc[Magenta]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.AbstractStyleNameConverter.Red.adoc[Red]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.AbstractStyleNameConverter.White.adoc[White]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.AbstractStyleNameConverter.Yellow.adoc[Yellow]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.ClassNamePatternConverter.adoc[ClassNamePatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.DatePatternConverter.adoc[DatePatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.EncodingPatternConverter.adoc[EncodingPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.EndOfBatchPatternConverter.adoc[EndOfBatchPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.EqualsIgnoreCaseReplacementConverter.adoc[EqualsIgnoreCaseReplacementConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.EqualsReplacementConverter.adoc[EqualsReplacementConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.ExtendedThrowablePatternConverter.adoc[ExtendedThrowablePatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.FileDatePatternConverter.adoc[FileDatePatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.FileLocationPatternConverter.adoc[FileLocationPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.FullLocationPatternConverter.adoc[FullLocationPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.HighlightConverter.adoc[HighlightConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.IntegerPatternConverter.adoc[IntegerPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.LevelPatternConverter.adoc[LevelPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.LineLocationPatternConverter.adoc[LineLocationPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.LineSeparatorPatternConverter.adoc[LineSeparatorPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.LoggerFqcnPatternConverter.adoc[LoggerFqcnPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.LoggerPatternConverter.adoc[LoggerPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.MapPatternConverter.adoc[MapPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.MarkerPatternConverter.adoc[MarkerPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.MarkerSimpleNamePatternConverter.adoc[MarkerSimpleNamePatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.MaxLengthConverter.adoc[MaxLengthConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.MdcPatternConverter.adoc[MdcPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.MessagePatternConverter.adoc[MessagePatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.MethodLocationPatternConverter.adoc[MethodLocationPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.NanoTimePatternConverter.adoc[NanoTimePatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.NdcPatternConverter.adoc[NdcPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.ProcessIdPatternConverter.adoc[ProcessIdPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.RegexReplacement.adoc[RegexReplacement]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.RegexReplacementConverter.adoc[RegexReplacementConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.RelativeTimePatternConverter.adoc[RelativeTimePatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.RepeatPatternConverter.adoc[RepeatPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.RootThrowablePatternConverter.adoc[RootThrowablePatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.SequenceNumberPatternConverter.adoc[SequenceNumberPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.StyleConverter.adoc[StyleConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.ThreadIdPatternConverter.adoc[ThreadIdPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.ThreadNamePatternConverter.adoc[ThreadNamePatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.ThreadPriorityPatternConverter.adoc[ThreadPriorityPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.ThrowablePatternConverter.adoc[ThrowablePatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.UuidPatternConverter.adoc[UuidPatternConverter]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.pattern.VariablesNotEmptyReplacementConverter.adoc[VariablesNotEmptyReplacementConverter]
-* xref:../log4j-core/org.apache.logging.log4j.core.script.Script.adoc[Script]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.script.ScriptFile.adoc[ScriptFile]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.script.ScriptRef.adoc[ScriptRef]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.util.KeyValuePair.adoc[KeyValuePair]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.adoc[JsonTemplateLayout]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.EventTemplateAdditionalField.adoc[EventTemplateAdditionalField]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.CaseConverterResolverFactory.adoc[CaseConverterResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.CounterResolverFactory.adoc[CounterResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.EndOfBatchResolverFactory.adoc[EndOfBatchResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.EventAdditionalFieldInterceptor.adoc[EventAdditionalFieldInterceptor]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.EventRootObjectKeyInterceptor.adoc[EventRootObjectKeyInterceptor]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.ExceptionResolverFactory.adoc[ExceptionResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.ExceptionRootCauseResolverFactory.adoc[ExceptionRootCauseResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.LevelResolverFactory.adoc[LevelResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.LoggerResolverFactory.adoc[LoggerResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.MainMapResolverFactory.adoc[MainMapResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.MapResolverFactory.adoc[MapResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.MarkerResolverFactory.adoc[MarkerResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.MessageParameterResolverFactory.adoc[MessageParameterResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.MessageResolverFactory.adoc[MessageResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.PatternResolverFactory.adoc[PatternResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.SourceResolverFactory.adoc[SourceResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.ThreadContextDataResolverFactory.adoc[ThreadContextDataResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.ThreadContextStackResolverFactory.adoc[ThreadContextStackResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.ThreadResolverFactory.adoc[ThreadResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.resolver.TimestampResolverFactory.adoc[TimestampResolverFactory]
-* 
xref:../log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.util.RecyclerFactoryConverter.adoc[RecyclerFactoryConverter]
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.lang.Runnable.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.lang.Runnable.adoc
deleted file mode 100644
index f772164..0000000
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.lang.Runnable.adoc
+++ /dev/null
@@ -1,29 +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
-
-    https://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.
-////
-[#java_lang_Runnable]
-= Runnable
-
-Class:: `java.lang.Runnable`
-Provider:: `org.apache.logging.log4j:log4j-core`
-
-
-[#java_lang_Runnable-implementations]
-== Known implementations
-
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.DeleteAction.adoc[DeleteAction]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction.adoc[PosixViewAttributeAction]
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.routing.IdlePurgePolicy.adoc[IdlePurgePolicy]
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.util.Comparator.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.util.Comparator.adoc
deleted file mode 100644
index 82f5e24..0000000
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/java.util.Comparator.adoc
+++ /dev/null
@@ -1,27 +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
-
-    https://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.
-////
-[#java_util_Comparator]
-= Comparator
-
-Class:: `java.util.Comparator`
-Provider:: `org.apache.logging.log4j:log4j-core`
-
-
-[#java_util_Comparator-implementations]
-== Known implementations
-
-* 
xref:../log4j-core/org.apache.logging.log4j.core.appender.rolling.action.PathSortByModificationTime.adoc[PathSortByModificationTime]
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.AsyncAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.AsyncAppender.adoc
index 17f1448..69b89c4 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.AsyncAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.AsyncAppender.adoc
@@ -38,8 +38,8 @@ The AsyncAppender does not allow a filter to be specified on 
the Appender refere
        shutdownTimeout="">
     <a-Filter-implementation/>
     <a-BlockingQueueFactory-implementation/>
-    <AppenderRef/>
-    <property/>
+    <AppenderRef/><!-- multiple occurrences allowed -->
+    <property/><!-- multiple occurrences allowed -->
 </Async>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.ConsoleAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.ConsoleAppender.adoc
index fffdced..ba22933 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.ConsoleAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.ConsoleAppender.adoc
@@ -43,7 +43,7 @@ OTOH, a Writer cannot print byte streams.
          target="">
     <a-Filter-implementation/>
     <a-Layout-implementation/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
 </Console>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.FailoverAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.FailoverAppender.adoc
index 4538717..f8f284b 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.FailoverAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.FailoverAppender.adoc
@@ -78,7 +78,7 @@ Optional components are denoted by `?`-suffixed types.
 |Tag|Type|Description
 
 |
-|xref:../scalars.adoc#java_lang_String[String]?
+|String?
 a|The name of one or more Appenders to fail over to (at least one is required).
 
 |
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.FileAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.FileAppender.adoc
index 3cb89ba..83d38dd 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.FileAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.FileAppender.adoc
@@ -42,7 +42,7 @@ File Appender.
       name="">
     <a-Filter-implementation/>
     <a-Layout-implementation/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
 </File>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.HttpAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.HttpAppender.adoc
index 856f909..a655bdb 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.HttpAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.HttpAppender.adoc
@@ -35,7 +35,7 @@ Sends log events over HTTP.
       verifyHostname="">
     <a-Filter-implementation/>
     <a-Layout-implementation/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
     <Ssl/>
 </Http>
 ----
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.MemoryMappedFileAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.MemoryMappedFileAppender.adoc
index cc7be56..f8acbf2 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.MemoryMappedFileAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.MemoryMappedFileAppender.adoc
@@ -38,7 +38,7 @@ Memory Mapped File Appender.
                   regionLength="">
     <a-Filter-implementation/>
     <a-Layout-implementation/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
 </MemoryMappedFile>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.OutputStreamAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.OutputStreamAppender.adoc
index bb18838..4a1247a 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.OutputStreamAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.OutputStreamAppender.adoc
@@ -35,7 +35,7 @@ Character encoding is handled within the Layout.
               name="">
     <a-Filter-implementation/>
     <a-Layout-implementation/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
 </OutputStream>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.RandomAccessFileAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.RandomAccessFileAppender.adoc
index 83a7f0e..4f97dee 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.RandomAccessFileAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.RandomAccessFileAppender.adoc
@@ -37,7 +37,7 @@ File Appender.
                   name="">
     <a-Filter-implementation/>
     <a-Layout-implementation/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
 </RandomAccessFile>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.RollingFileAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.RollingFileAppender.adoc
index 71b80c4..1cdc4c5 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.RollingFileAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.RollingFileAppender.adoc
@@ -45,7 +45,7 @@ An appender that writes to files and can roll over at 
intervals.
     <a-Layout-implementation/>
     <a-RolloverStrategy-implementation/>
     <a-TriggeringPolicy-implementation/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
 </RollingFile>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.adoc
index cbd5ec2..2b9254d 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender.adoc
@@ -43,7 +43,7 @@ An appender that writes to random access files and can roll 
over at intervals.
     <a-Layout-implementation/>
     <a-RolloverStrategy-implementation/>
     <a-TriggeringPolicy-implementation/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
 </RollingRandomAccessFile>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.SmtpAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.SmtpAppender.adoc
index d8d5013..7547a99 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.SmtpAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.SmtpAppender.adoc
@@ -51,7 +51,7 @@ This can be modified by setting a filter for the appender.
       to="">
     <a-Filter-implementation/>
     <a-Layout-implementation/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
     <Ssl/>
 </SMTP>
 ----
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.SyslogAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.SyslogAppender.adoc
index 1c55d91..32282cb 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.SyslogAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.SyslogAppender.adoc
@@ -57,8 +57,8 @@ The Syslog Appender.
         reconnectDelayMillis="">
     <a-Filter-implementation/>
     <a-Layout-implementation/>
-    <property/>
-    <LoggerFields/>
+    <property/><!-- multiple occurrences allowed -->
+    <LoggerFields/><!-- multiple occurrences allowed -->
     <SocketOptions/>
     <Ssl/>
 </Syslog>
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.WriterAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.WriterAppender.adoc
index bb96aed..1163cb8 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.WriterAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.WriterAppender.adoc
@@ -30,7 +30,7 @@ Appends log events to a xref:Writer.adoc[].
         name="">
     <a-Filter-implementation/>
     <a-Layout-implementation/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
 </Writer>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.db.jdbc.DriverManagerConnectionSource.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.db.jdbc.DriverManagerConnectionSource.adoc
index 9043d7c..3829c16 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.db.jdbc.DriverManagerConnectionSource.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.db.jdbc.DriverManagerConnectionSource.adoc
@@ -33,7 +33,7 @@ This handy to get you off the ground without having to deal 
with JNDI.
                driverClassName=""
                password=""
                userName="">
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
 </DriverManager>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender.adoc
index 9ce1bcf..e907f33 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.db.jdbc.JdbcAppender.adoc
@@ -39,10 +39,10 @@ This appender can be reconfigured at run time.
       truncateStrings="">
     <a-Filter-implementation/>
     <a-Layout-implementation/>
-    <ColumnMapping/>
-    <Column/>
+    <ColumnMapping/><!-- multiple occurrences allowed -->
+    <Column/><!-- multiple occurrences allowed -->
     <a-ConnectionSource-implementation/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
 </JDBC>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.mom.JmsAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.mom.JmsAppender.adoc
index 14d9a8b..fb80540 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.mom.JmsAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.mom.JmsAppender.adoc
@@ -44,7 +44,7 @@ However, configurations set up for the 2.0 version of the JMS 
appenders will sti
      userName="">
     <a-Filter-implementation/>
     <a-Layout-implementation/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
 </JMS>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.mom.jeromq.JeroMqAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.mom.jeromq.JeroMqAppender.adoc
index 56b3632..e75e308 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.mom.jeromq.JeroMqAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.mom.jeromq.JeroMqAppender.adoc
@@ -52,7 +52,7 @@ Requires the JeroMQ jar (LGPL as of 0.3.5)
         xpubVerbose="">
     <a-Filter-implementation/>
     <a-Layout-implementation/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
 </JeroMQ>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender.adoc
index 4cdbe1f..c9f3619 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.mom.kafka.KafkaAppender.adoc
@@ -35,7 +35,7 @@ Sends log events to an Apache Kafka topic.
        topic="">
     <a-Filter-implementation/>
     <a-Layout-implementation/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
 </Kafka>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.nosql.NoSqlAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.nosql.NoSqlAppender.adoc
index 386accc..c6ef992 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.nosql.NoSqlAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.nosql.NoSqlAppender.adoc
@@ -35,8 +35,9 @@ For examples on how to write your own NoSQL provider, see the 
simple source code
        name="">
     <a-Filter-implementation/>
     <a-Layout-implementation/>
-    <property/>
-    <KeyValuePair/>
+    <a-NoSqlProvider-implementation/>
+    <property/><!-- multiple occurrences allowed -->
+    <KeyValuePair/><!-- multiple occurrences allowed -->
 </NoSql>
 ----
 
@@ -75,6 +76,10 @@ Optional components are denoted by `?`-suffixed types.
 |===
 |Tag|Type|Description
 
+|
+|NoSqlProvider?
+a|Sets the provider.
+
 |property
 
|xref:../log4j-core/org.apache.logging.log4j.core.config.Property.adoc[Property]?
 a|
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.rewrite.LoggerNameLevelRewritePolicy.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.rewrite.LoggerNameLevelRewritePolicy.adoc
index a7c9c52..85c1b1e 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.rewrite.LoggerNameLevelRewritePolicy.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.rewrite.LoggerNameLevelRewritePolicy.adoc
@@ -27,7 +27,7 @@ Rewrites log event levels for a given logger name.
 [source, xml]
 ----
 <LoggerNameLevelRewritePolicy logger="">
-    <KeyValuePair/>
+    <KeyValuePair/><!-- multiple occurrences allowed -->
 </LoggerNameLevelRewritePolicy>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.rewrite.MapRewritePolicy.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.rewrite.MapRewritePolicy.adoc
index 99fb595..b7ba735 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.rewrite.MapRewritePolicy.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.rewrite.MapRewritePolicy.adoc
@@ -27,7 +27,7 @@ This policy modifies events by replacing or possibly adding 
keys and values to t
 [source, xml]
 ----
 <MapRewritePolicy mode="">
-    <KeyValuePair/>
+    <KeyValuePair/><!-- multiple occurrences allowed -->
 </MapRewritePolicy>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.rewrite.RewriteAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.rewrite.RewriteAppender.adoc
index 1e5cb5b..aeaf8fe 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.rewrite.RewriteAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.rewrite.RewriteAppender.adoc
@@ -30,7 +30,7 @@ This Appender allows the logging event to be manipulated 
before it is processed
          name="">
     <a-Filter-implementation/>
     <a-RewritePolicy-implementation/>
-    <AppenderRef/>
+    <AppenderRef/><!-- multiple occurrences allowed -->
 </Rewrite>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.routing.Routes.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.routing.Routes.adoc
index 5bf592a..39129b3 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.routing.Routes.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.routing.Routes.adoc
@@ -27,7 +27,7 @@ Contains the individual Route elements.
 [source, xml]
 ----
 <Routes pattern="">
-    <Route/>
+    <Route/><!-- multiple occurrences allowed -->
     <a-AbstractScript-implementation/>
 </Routes>
 ----
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.routing.RoutingAppender.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.routing.RoutingAppender.adoc
index 9eb8900..49db4b3 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.routing.RoutingAppender.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.appender.routing.RoutingAppender.adoc
@@ -36,7 +36,7 @@ The pattern should contain one or more substitution patterns 
of the form "$${[ke
     <a-RewritePolicy-implementation/>
     <a-PurgePolicy-implementation/>
     <Routes/>
-    <property/>
+    <property/><!-- multiple occurrences allowed -->
     <a-AbstractScript-implementation/>
 </Routing>
 ----
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.async.AsyncLoggerConfig.RootLogger.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.async.AsyncLoggerConfig.RootLogger.adoc
index 5fc0150..2846c5d 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.async.AsyncLoggerConfig.RootLogger.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.async.AsyncLoggerConfig.RootLogger.adoc
@@ -31,8 +31,8 @@ An asynchronous root Logger.
            level=""
            levelAndRefs="">
     <a-Filter-implementation/>
-    <AppenderRef/>
-    <property/>
+    <AppenderRef/><!-- multiple occurrences allowed -->
+    <property/><!-- multiple occurrences allowed -->
 </asyncRoot>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.async.AsyncLoggerConfig.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.async.AsyncLoggerConfig.adoc
index e7a0138..3ea4404 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.async.AsyncLoggerConfig.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.async.AsyncLoggerConfig.adoc
@@ -47,8 +47,8 @@ This means that even with immediateFlush=false, there will 
never be any items le
              levelAndRefs=""
              name="">
     <a-Filter-implementation/>
-    <AppenderRef/>
-    <property/>
+    <AppenderRef/><!-- multiple occurrences allowed -->
+    <property/><!-- multiple occurrences allowed -->
 </asyncLogger>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.config.LoggerConfig.RootLogger.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.config.LoggerConfig.RootLogger.adoc
index 0de3090..8b9cc01 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.config.LoggerConfig.RootLogger.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.config.LoggerConfig.RootLogger.adoc
@@ -31,8 +31,8 @@ The root Logger.
       level=""
       levelAndRefs="">
     <a-Filter-implementation/>
-    <AppenderRef/>
-    <property/>
+    <AppenderRef/><!-- multiple occurrences allowed -->
+    <property/><!-- multiple occurrences allowed -->
 </root>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.DynamicThresholdFilter.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.DynamicThresholdFilter.adoc
index b10f0af..eca4716 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.DynamicThresholdFilter.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.DynamicThresholdFilter.adoc
@@ -32,7 +32,7 @@ By default the context is the xref:ThreadContext.adoc[], but 
users may xref:Cont
                         key=""
                         onMatch=""
                         onMismatch="">
-    <KeyValuePair/>
+    <KeyValuePair/><!-- multiple occurrences allowed -->
 </DynamicThresholdFilter>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.RegexFilter.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.RegexFilter.adoc
index 00e34eb..1b5423b 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.RegexFilter.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.RegexFilter.adoc
@@ -79,7 +79,7 @@ Optional components are denoted by `?`-suffixed types.
 |Tag|Type|Description
 
 |
-|xref:../scalars.adoc#java_lang_String[String]?
+|String?
 a|An array of Strings where each String is a xref:Pattern.adoc[] compilation 
flag.
 
 |===
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.StructuredDataFilter.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.StructuredDataFilter.adoc
index 9fda2b8..1e5e1d7 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.StructuredDataFilter.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.StructuredDataFilter.adoc
@@ -29,7 +29,7 @@ Filter based on data in a StructuredDataMessage.
 <StructuredDataFilter onMatch=""
                       onMismatch=""
                       operator="">
-    <KeyValuePair/>
+    <KeyValuePair/><!-- multiple occurrences allowed -->
 </StructuredDataFilter>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.ThreadContextMapFilter.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.ThreadContextMapFilter.adoc
index 439841f..fd81028 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.ThreadContextMapFilter.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.filter.ThreadContextMapFilter.adoc
@@ -29,7 +29,7 @@ Filter based on a value in the Thread Context Map (MDC).
 <ThreadContextMapFilter onMatch=""
                         onMismatch=""
                         operator="">
-    <KeyValuePair/>
+    <KeyValuePair/><!-- multiple occurrences allowed -->
 </ThreadContextMapFilter>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.GelfLayout.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.GelfLayout.adoc
index 1d39b31..974166e 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.GelfLayout.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.GelfLayout.adoc
@@ -47,8 +47,9 @@ This layout compresses JSON to GZIP or ZLIB (the 
`compressionType`) if log event
             threadContextExcludes=""
             threadContextIncludes=""
             threadContextPrefix="">
+    <a-Serializer-implementation/>
     <a-PatternSelector-implementation/>
-    <KeyValuePair/>
+    <KeyValuePair/><!-- multiple occurrences allowed -->
 </GelfLayout>
 ----
 
@@ -171,6 +172,10 @@ Optional components are denoted by `?`-suffixed types.
 |===
 |Tag|Type|Description
 
+|
+|Serializer?
+a|
+
 |
 
|xref:../log4j-core/org.apache.logging.log4j.core.layout.PatternSelector.adoc[PatternSelector]?
 a|The PatternSelector to use to format the message.
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.JsonLayout.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.JsonLayout.adoc
index 093c590..c890062 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.JsonLayout.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.JsonLayout.adoc
@@ -61,7 +61,8 @@ Supports Lookup expressions.
             properties=""
             propertiesAsList=""
             stacktraceAsString="">
-    <KeyValuePair/>
+    <a-Serializer-implementation/>
+    <KeyValuePair/><!-- multiple occurrences allowed -->
 </JsonLayout>
 ----
 
@@ -162,6 +163,10 @@ Optional components are denoted by `?`-suffixed types.
 |===
 |Tag|Type|Description
 
+|
+|Serializer?
+a|
+
 |KeyValuePair
 
|xref:../log4j-core/org.apache.logging.log4j.core.util.KeyValuePair.adoc[KeyValuePair]?
 a|Additional fields to set on each log event.
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.LevelPatternSelector.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.LevelPatternSelector.adoc
index ecc588c..be39f07 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.LevelPatternSelector.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.LevelPatternSelector.adoc
@@ -30,7 +30,7 @@ Selects the pattern to use based on the Level in the LogEvent.
                       defaultPattern=""
                       disableAnsi=""
                       noConsoleNoAnsi="">
-    <PatternMatch/>
+    <PatternMatch/><!-- multiple occurrences allowed -->
 </LevelPatternSelector>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.LoggerFields.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.LoggerFields.adoc
index 2d9ad9c..8ee04d3 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.LoggerFields.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.LoggerFields.adoc
@@ -29,7 +29,7 @@ A LoggerFields container.
 <LoggerFields discardIfAllFieldsAreEmpty=""
               enterpriseId=""
               sdId="">
-    <KeyValuePair/>
+    <KeyValuePair/><!-- multiple occurrences allowed -->
 </LoggerFields>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.MarkerPatternSelector.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.MarkerPatternSelector.adoc
index 3a0791b..73a1f85 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.MarkerPatternSelector.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.MarkerPatternSelector.adoc
@@ -30,7 +30,7 @@ Selects the pattern to use based on the Marker in the 
LogEvent.
                        defaultPattern=""
                        disableAnsi=""
                        noConsoleNoAnsi="">
-    <PatternMatch/>
+    <PatternMatch/><!-- multiple occurrences allowed -->
 </MarkerPatternSelector>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.Rfc5424Layout.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.Rfc5424Layout.adoc
index 600b715..bd75a8d 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.Rfc5424Layout.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.Rfc5424Layout.adoc
@@ -42,7 +42,7 @@ Formats a log event in accordance with RFC 5424.
                newLine=""
                newLineEscape=""
                useTlsMessageFormat="">
-    <LoggerFields/>
+    <LoggerFields/><!-- multiple occurrences allowed -->
 </Rfc5424Layout>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.ScriptPatternSelector.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.ScriptPatternSelector.adoc
index 37ea7dc..70e21e9 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.ScriptPatternSelector.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.ScriptPatternSelector.adoc
@@ -33,7 +33,7 @@ If no key is returned or there is no match the default 
pattern will be used.
                        defaultPattern=""
                        disableAnsi=""
                        noConsoleNoAnsi="">
-    <PatternMatch/>
+    <PatternMatch/><!-- multiple occurrences allowed -->
     <a-AbstractScript-implementation/>
 </ScriptPatternSelector>
 ----
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.SyslogLayout.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.SyslogLayout.adoc
index b144c95..098d635 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.SyslogLayout.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.SyslogLayout.adoc
@@ -32,6 +32,7 @@ Formats a log event as a BSD Log record.
               header=""
               newLine=""
               newLineEscape="">
+    <a-Serializer-implementation/>
 </SyslogLayout>
 ----
 
@@ -85,4 +86,8 @@ Optional components are denoted by `?`-suffixed types.
 |===
 |Tag|Type|Description
 
+|
+|Serializer?
+a|
+
 |===
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.XmlLayout.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.XmlLayout.adoc
index abb6860..1d96eb4 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.XmlLayout.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.XmlLayout.adoc
@@ -56,7 +56,8 @@ Supports Lookup expressions.
            locationInfo=""
            properties=""
            stacktraceAsString="">
-    <KeyValuePair/>
+    <a-Serializer-implementation/>
+    <KeyValuePair/><!-- multiple occurrences allowed -->
 </XmlLayout>
 ----
 
@@ -147,6 +148,10 @@ Optional components are denoted by `?`-suffixed types.
 |===
 |Tag|Type|Description
 
+|
+|Serializer?
+a|
+
 |KeyValuePair
 
|xref:../log4j-core/org.apache.logging.log4j.core.util.KeyValuePair.adoc[KeyValuePair]?
 a|Additional fields to set on each log event.
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.YamlLayout.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.YamlLayout.adoc
index 55e7f46..b9cb010 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.YamlLayout.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-core/org.apache.logging.log4j.core.layout.YamlLayout.adoc
@@ -47,7 +47,8 @@ Supports Lookup expressions.
             locationInfo=""
             properties=""
             stacktraceAsString="">
-    <KeyValuePair/>
+    <a-Serializer-implementation/>
+    <KeyValuePair/><!-- multiple occurrences allowed -->
 </YamlLayout>
 ----
 
@@ -138,6 +139,10 @@ Optional components are denoted by `?`-suffixed types.
 |===
 |Tag|Type|Description
 
+|
+|Serializer?
+a|
+
 |KeyValuePair
 
|xref:../log4j-core/org.apache.logging.log4j.core.util.KeyValuePair.adoc[KeyValuePair]?
 a|Additional fields to set on each log event.
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.adoc
index a187336..8095fee 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/org.apache.logging.log4j/log4j-layout-template-json/org.apache.logging.log4j.layout.template.json.JsonTemplateLayout.adoc
@@ -39,7 +39,7 @@ Provider:: 
`org.apache.logging.log4j:log4j-layout-template-json`
                     stackTraceElementTemplateUri=""
                     stackTraceEnabled=""
                     truncatedStringSuffix="">
-    <EventTemplateAdditionalField/>
+    <EventTemplateAdditionalField/><!-- multiple occurrences allowed -->
 </JsonTemplateLayout>
 ----
 
diff --git 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/scalars.adoc
 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/scalars.adoc
index d07785c..f9e2130 100644
--- 
a/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/scalars.adoc
+++ 
b/log4j-docgen/src/test/resources/plugins-with-dependency/freemarker-output/scalars.adoc
@@ -19,24 +19,6 @@ limitations under the License.
 
 Type converter plugins are used to convert simple `String` values into other 
types.
 
-[#boolean]
-== `boolean`
-
-
-A boolean value
-
-[#boolean-values]
-=== Possible values
-
-`false`:: false
-`true`:: true
-
-[#byte]
-== `byte`
-
-
-An 8-bit signed integer from `-128` to `127`
-
 [#com_conversantmedia_util_concurrent_SpinPolicy]
 == `com.conversantmedia.util.concurrent.SpinPolicy`
 
@@ -51,71 +33,6 @@ Provider:: `org.apache.logging.log4j:log4j-core`
 `BLOCKING`:: 
 `SPINNING`:: 
 
-[#double]
-== `double`
-
-
-A double precision floating number from `4.94065645841246544e-324` to 
`1.79769313486231570e+308`
-
-[#float]
-== `float`
-
-
-A single precision floating number from `1.40239846e-45` to `3.40282347e+38`
-
-[#int]
-== `int`
-
-
-A 32-bit signed integer from `-2147483648` to `2147483647`
-
-[#java_lang_Class]
-== `java.lang.Class`
-
-Provider:: `org.apache.logging.log4j:log4j-core`
-
-
-
-[#java_lang_String]
-== `java.lang.String`
-
-
-A string of characters
-
-[#java_net_InetAddress]
-== `java.net.InetAddress`
-
-Provider:: `org.apache.logging.log4j:log4j-core`
-
-
-
-[#java_net_URL]
-== `java.net.URL`
-
-Provider:: `org.apache.logging.log4j:log4j-core`
-
-
-
-[#java_nio_charset_Charset]
-== `java.nio.charset.Charset`
-
-Provider:: `org.apache.logging.log4j:log4j-core`
-
-
-
-[#java_util_regex_Pattern]
-== `java.util.regex.Pattern`
-
-Provider:: `org.apache.logging.log4j:log4j-core`
-
-
-
-[#long]
-== `long`
-
-
-A 64-bit signed integer from `-9223372036854775808` to `9223372036854775807`
-
 [#org_apache_commons_csv_QuoteMode]
 == `org.apache.commons.csv.QuoteMode`
 
@@ -413,9 +330,3 @@ Provider:: 
`org.apache.logging.log4j:log4j-layout-template-json`
 Provider:: `org.apache.logging.log4j:log4j-layout-template-json`
 
 
-
-[#short]
-== `short`
-
-
-A 16-bit signed integer from `-32768` to `32767`
diff --git a/log4j-docgen/src/test/resources/templates/plugin.adoc.ftl 
b/log4j-docgen/src/test/resources/templates/plugin.adoc.ftl
index 18d1249..d5cf4d5 100644
--- a/log4j-docgen/src/test/resources/templates/plugin.adoc.ftl
+++ b/log4j-docgen/src/test/resources/templates/plugin.adoc.ftl
@@ -27,7 +27,7 @@ Class:: `${type.className}`
 <#if sourcedType.groupId?has_content && sourcedType.artifactId?has_content>
 Provider:: `${sourcedType.groupId}:${sourcedType.artifactId}`
 
-</#if>${(type.description.text)!''}
+</#if>${(type.description.text)!}
 
 [#${type.className?replace('.', '_')}-XML-snippet]
 == XML snippet
@@ -48,16 +48,16 @@ 
${indent}${attr.name}="${attr.defaultValue!}"${attr?is_last?then(has_elements?th
         </#list>
         <#if has_elements>
             <#list type.elements as element>
+                <#assign multiplicitySuffix = (element.multiplicity == 
'*')?then('<!-- multiple occurrences allowed -->','')/>
+                <#assign elementName = 'a-' + 
element.type?keep_after_last('.') + '-implementation'/>
                 <#if lookup[element.type]??>
                     <#assign element_type = lookup[element.type].type/>
                     <#-- @ftlvariable name="element_type" 
type="org.apache.logging.log4j.docgen.model.AbstractType" -->
                     <#if element_type.name?? && 
!element_type.implementations?has_content>
-                    <#-- @ftlvariable name="element_type" 
type="org.apache.logging.log4j.docgen.model.PluginType" -->
-    <${element_type.name}/>
-                    <#else>
-    <a-${element.type?keep_after_last('.')}-implementation/><#if 
element.multiplicity == '*'><!-- multiple occurrences allowed --></#if>
+                        <#assign elementName = element_type.name/>
                     </#if>
                 </#if>
+    <${elementName}/>${multiplicitySuffix}
             </#list>
 </${type.name}>
         </#if>
@@ -79,7 +79,7 @@ Optional attributes are denoted by `?`-suffixed types.
 |${attr.name}
 |xref:../../scalars.adoc#${attr.type?replace('.', 
'_')}[${attr.type?contains('.')?then(attr.type?keep_after_last('.'), 
attr.type)}]${requirementSuffix}
 |${attr.defaultValue!}
-a|${(attr.description.text)!''}
+a|${(attr.description.text)!}
 
     </#list>
 |===
@@ -96,30 +96,34 @@ Optional components are denoted by `?`-suffixed types.
 |Tag|Type|Description
 
     <#list type.elements?sort_by('type') as element>
+        <#assign requirementSuffix = element.required?then('', '?')/>
+        <#assign descriptionCell = (element.description.text)!/>
+        <#assign elementName = 
element.type?contains('.')?then(element.type?keep_after_last('.'), 
element.type)/>
         <#if lookup[element.type]??>
             <#assign elementSourcedType = lookup[element.type]/>
             <#assign elementType = elementSourcedType.type/>
-            <#assign linkName = 
element.type?contains('.')?then(element.type?keep_after_last('.'), 
element.type)/>
-            <#assign requirementSuffix = element.required?then('', '?')/>
-            <#assign tagCell = elementType.name!''/>
-            <#assign descriptionCell = (element.description.text)!''/>
+            <#assign tagCell = elementType.name!/>
             <#switch elementType.class.simpleName>
                 <#case 'PluginType'>
                 <#case 'AbstractType'>
 |${tagCell}
-|xref:../${elementSourcedType.artifactId}/${element.type}.adoc[${linkName}]${requirementSuffix}
+|xref:../${elementSourcedType.artifactId}/${element.type}.adoc[${elementName}]${requirementSuffix}
 a|${descriptionCell}
                     <#break>
                 <#case 'ScalarType'>
 |${tagCell}
-|xref:../scalars.adoc#${element.type?replace('.', 
'_')}[${linkName}]${requirementSuffix}
+|xref:../scalars.adoc#${element.type?replace('.', 
'_')}[${elementName}]${requirementSuffix}
 a|${descriptionCell}
                     <#break>
                 <#default>
                     <#stop 'Unknown type `' + element.type + '` modelled in 
class `' + elementType.class.name + '`'/>
             </#switch>
-
+        <#else>
+|
+|${elementName}${requirementSuffix}
+a|${descriptionCell}
         </#if>
+
     </#list>
 |===
 </#if>
diff --git a/log4j-docgen/src/test/resources/templates/scalars.adoc.ftl 
b/log4j-docgen/src/test/resources/templates/scalars.adoc.ftl
index 150dbc6..9b5edb9 100644
--- a/log4j-docgen/src/test/resources/templates/scalars.adoc.ftl
+++ b/log4j-docgen/src/test/resources/templates/scalars.adoc.ftl
@@ -32,14 +32,14 @@ Type converter plugins are used to convert simple `String` 
values into other typ
 Provider:: `${sourcedType.groupId}:${sourcedType.artifactId}`
     </#if>
 
-${(scalar.description.text)!''}
+${(scalar.description.text)!}
     <#if scalar.values?size != 0>
 
 [#${scalar.className?replace('.', '_')}-values]
 === Possible values
 
         <#list scalar.values as value>
-`${value.name}`:: ${(value.description.text)!''}
+`${value.name}`:: ${(value.description.text)!}
         </#list>
     </#if>
 </#list>
diff --git 
a/log4j-tools-internal-test-util/src/main/java/org/apache/logging/log4j/tools/internal/test/util/FileTestUtils.java
 
b/log4j-tools-internal-test-util/src/main/java/org/apache/logging/log4j/tools/internal/test/util/FileTestUtils.java
index 5229526..49d9dd6 100644
--- 
a/log4j-tools-internal-test-util/src/main/java/org/apache/logging/log4j/tools/internal/test/util/FileTestUtils.java
+++ 
b/log4j-tools-internal-test-util/src/main/java/org/apache/logging/log4j/tools/internal/test/util/FileTestUtils.java
@@ -28,6 +28,7 @@ import java.util.TreeMap;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
+import org.assertj.core.api.SoftAssertions;
 
 public final class FileTestUtils {
 
@@ -42,13 +43,15 @@ public final class FileTestUtils {
         assertThat(actualContents).containsOnlyKeys(relativeFilePaths);
 
         // Compare file contents
+        final SoftAssertions assertions = new SoftAssertions();
         relativeFilePaths.forEach(relativeFilePath -> {
             final Path actualFilePath = actualContents.get(relativeFilePath);
             final Path expectedFilePath = 
expectedContents.get(relativeFilePath);
             if (!Files.isDirectory(actualFilePath) || 
!Files.isDirectory(expectedFilePath)) {
-                
assertThat(actualFilePath).hasSameTextualContentAs(expectedFilePath);
+                
assertions.assertThat(actualFilePath).hasSameTextualContentAs(expectedFilePath);
             }
         });
+        assertions.assertAll();
     }
 
     private static Map<String, Path> directoryContents(final Path root) {

Reply via email to