<?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.
  -->
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>30</version>
  </parent>
  <groupId>org.apache.logging</groupId>
  <artifactId>logging-parent</artifactId>
  <version>10.4.0</version>
  <packaging>pom</packaging>
  <name>Apache Logging Parent</name>
  <description>Parent project internally used in Maven-based projects of the Apache Logging Services</description>
  <url>https://logging.apache.org/logging-parent</url>
  <inceptionYear>1999</inceptionYear>
  <licenses>
    <license>
      <name>Apache-2.0</name>
      <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>
  <developers>
    <developer>
      <id>ggregory</id>
      <name>Gary Gregory</name>
      <email>ggregory@apache.org</email>
      <url>https://www.garygregory.com</url>
      <organization>The Apache Software Foundation</organization>
      <organizationUrl>https://www.apache.org/</organizationUrl>
      <roles>
        <role>PMC Member</role>
      </roles>
      <timezone>America/New_York</timezone>
    </developer>
    <developer>
      <id>grobmeier</id>
      <name>Christian Grobmeier</name>
      <email>grobmeier@apache.org</email>
      <roles>
        <role>PMC Member</role>
      </roles>
      <timezone>Europe/Berlin</timezone>
    </developer>
    <developer>
      <id>mattsicker</id>
      <name>Matt Sicker</name>
      <email>mattsicker@apache.org</email>
      <organization>Apple</organization>
      <roles>
        <role>PMC Member</role>
      </roles>
      <timezone>America/Chicago</timezone>
    </developer>
    <developer>
      <id>pkarwasz</id>
      <name>Piotr P. Karwasz</name>
      <email>pkarwasz@apache.org</email>
      <roles>
        <role>PMC Member</role>
      </roles>
      <timezone>Europe/Warsaw</timezone>
    </developer>
    <developer>
      <id>vy</id>
      <name>Volkan Yazıcı</name>
      <email>vy@apache.org</email>
      <roles>
        <role>PMC Chair</role>
      </roles>
      <timezone>Europe/Amsterdam</timezone>
    </developer>
  </developers>
  <mailingLists>
    <mailingList>
      <name>log4j-user</name>
      <subscribe>log4j-user-subscribe@logging.apache.org</subscribe>
      <unsubscribe>log4j-user-unsubscribe@logging.apache.org</unsubscribe>
      <post>log4j-user@logging.apache.org</post>
      <archive>https://lists.apache.org/list.html?log4j-user@logging.apache.org</archive>
    </mailingList>
    <mailingList>
      <name>dev</name>
      <subscribe>dev-subscribe@logging.apache.org</subscribe>
      <unsubscribe>dev-unsubscribe@logging.apache.org</unsubscribe>
      <post>dev@logging.apache.org</post>
      <archive>https://lists.apache.org/list.html?dev@logging.apache.org</archive>
    </mailingList>
  </mailingLists>
  <scm>
    <connection>scm:git:git@github.com:apache/logging-parent.git</connection>
    <developerConnection>scm:git:git@github.com:apache/logging-parent.git</developerConnection>
    <url>https://github.com/apache/logging-parent</url>
  </scm>
  <issueManagement>
    <system>GitHub Issues</system>
    <url>https://github.com/apache/logging-parent/issues</url>
  </issueManagement>
  <ciManagement>
    <system>GitHub Actions</system>
    <url>https://github.com/apache/logging-parent/actions</url>
  </ciManagement>
  <distributionManagement>
    <downloadUrl>https://logging.apache.org/logging-parent/latest/#distribution</downloadUrl>
  </distributionManagement>
  <properties>
    <maven.compiler.release>8</maven.compiler.release>
    <xml-maven-plugin.version>1.1.0</xml-maven-plugin.version>
    <spotbugs-annotations.version>4.8.1</spotbugs-annotations.version>
    <bnd-baseline-maven-plugin.version>${bnd-maven-plugin.version}</bnd-baseline-maven-plugin.version>
    <bnd-maven-plugin.version>6.4.0</bnd-maven-plugin.version>
    <bnd-extra-package-options></bnd-extra-package-options>
    <findsecbugs-plugin.version>1.12.0</findsecbugs-plugin.version>
    <bnd-jpms-module-info>$[bnd-module-name];access=0</bnd-jpms-module-info>
    <flatten-maven-plugin.version>1.5.0</flatten-maven-plugin.version>
    <osgi.annotation.version>8.1.0</osgi.annotation.version>
    <asciidoctor-maven-plugin.version>2.2.4</asciidoctor-maven-plugin.version>
    <osgi.annotation.bundle.version>2.0.0</osgi.annotation.bundle.version>
    <osgi.annotation.versioning.version>1.1.2</osgi.annotation.versioning.version>
    <log4j-changelog-maven-plugin.version>0.5.0</log4j-changelog-maven-plugin.version>
    <bnd.annotation.version>6.4.1</bnd.annotation.version>
    <error-prone.version>2.23.0</error-prone.version>
    <sbom.xslt>&lt;xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://cyclonedx.org/schema/bom/1.5"
    xmlns:xalan="http://xml.apache.org/xalan"
    xmlns:cdx14="http://cyclonedx.org/schema/bom/1.4"
    xmlns:cdx15="http://cyclonedx.org/schema/bom/1.5"
    exclude-result-prefixes="xalan cdx14 cdx15">

  &lt;xsl:param name="sbom.serialNumber"/>
  &lt;xsl:param name="vdr.url"/>
  &lt;xsl:output method="xml"
              version="1.0"
              encoding="UTF-8"
              indent="yes"
              xalan:indent-amount="2"
              xalan:line-separator="&amp;#10;"/>

  &lt;!-- Fixes the license formatting -->
  &lt;xsl:template match="/">
    &lt;xsl:text>&amp;#10;&lt;/xsl:text>
    &lt;xsl:apply-templates />
  &lt;/xsl:template>

  &lt;!-- Standard copy template -->
  &lt;xsl:template match="@*|node()">
    &lt;xsl:copy>
      &lt;xsl:apply-templates select="@*" />
      &lt;xsl:apply-templates />
    &lt;/xsl:copy>
  &lt;/xsl:template>

  &lt;!-- Bump the SBOM schema version from `1.4` to `1.5` -->
  &lt;xsl:template match="cdx14:*">
    &lt;xsl:element name="{local-name()}" namespace="http://cyclonedx.org/schema/bom/1.5">
      &lt;xsl:apply-templates select="@*" />
      &lt;xsl:apply-templates />
    &lt;/xsl:element>
  &lt;/xsl:template>

  &lt;!-- Add the SBOM `serialNumber` -->
  &lt;xsl:template match="cdx14:bom">
    &lt;bom>
      &lt;xsl:attribute name="version">
        &lt;xsl:value-of select="1"/>
      &lt;/xsl:attribute>
      &lt;xsl:attribute name="serialNumber">
        &lt;xsl:text>urn:uuid:&lt;/xsl:text>
        &lt;xsl:value-of select="$sbom.serialNumber"/>
      &lt;/xsl:attribute>
      &lt;xsl:apply-templates />
    &lt;/bom>
  &lt;/xsl:template>

  &lt;!-- Add the link to the VDR -->
  &lt;xsl:template match="cdx14:externalReferences[starts-with(preceding-sibling::cdx14:group, 'org.apache.logging')]">
    &lt;externalReferences>
      &lt;xsl:apply-templates/>
      &lt;reference>
        &lt;xsl:attribute name="type">vulnerability-assertion&lt;/xsl:attribute>
        &lt;url>
          &lt;xsl:value-of select="$vdr.url"/>
        &lt;/url>
      &lt;/reference>
    &lt;/externalReferences>
  &lt;/xsl:template>

&lt;/xsl:stylesheet></sbom.xslt>
    <minimalJavaBuildVersion>[17,18)</minimalJavaBuildVersion>
    <bnd-bundle-symbolicname>$[project.groupId].$[subst;$[subst;$[project.artifactId];log4j-];[^A-Za-z0-9];.]</bnd-bundle-symbolicname>
    <palantir-java-format.version>2.38.0</palantir-java-format.version>
    <beanshell-maven-plugin.version>1.4</beanshell-maven-plugin.version>
    <vdr.url>https://logging.apache.org/cyclonedx/vdr.xml</vdr.url>
    <maven.compiler.source>8</maven.compiler.source>
    <bnd-extra-config></bnd-extra-config>
    <build-helper-maven-plugin.version>3.4.0</build-helper-maven-plugin.version>
    <maven-artifact-plugin.version>3.5.0</maven-artifact-plugin.version>
    <org.eclipse.jgit.version>6.7.0.202309050840-r</org.eclipse.jgit.version>
    <bnd-module-name>$[Bundle-SymbolicName]</bnd-module-name>
    <revision>10.4.0</revision>
    <spotbugs-maven-plugin.version>4.8.1.0</spotbugs-maven-plugin.version>
    <spotless-maven-plugin.version>2.40.0</spotless-maven-plugin.version>
    <maven.compiler.target>8</maven.compiler.target>
    <bnd-multi-release>false</bnd-multi-release>
    <project.build.outputTimestamp>2023-11-13T20:50:43Z</project.build.outputTimestamp>
    <bnd-extra-module-options></bnd-extra-module-options>
    <cyclonedx-maven-plugin.version>2.7.10</cyclonedx-maven-plugin.version>
    <sign-maven-plugin.version>1.0.1</sign-maven-plugin.version>
  </properties>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>biz.aQute.bnd</groupId>
        <artifactId>biz.aQute.bnd.annotation</artifactId>
        <version>${bnd.annotation.version}</version>
      </dependency>
      <dependency>
        <groupId>com.github.spotbugs</groupId>
        <artifactId>spotbugs-annotations</artifactId>
        <version>${spotbugs-annotations.version}</version>
      </dependency>
      <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>osgi.annotation</artifactId>
        <version>${osgi.annotation.version}</version>
      </dependency>
      <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>org.osgi.annotation.bundle</artifactId>
        <version>${osgi.annotation.bundle.version}</version>
      </dependency>
      <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>org.osgi.annotation.versioning</artifactId>
        <version>${osgi.annotation.versioning.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.asciidoctor</groupId>
          <artifactId>asciidoctor-maven-plugin</artifactId>
          <version>${asciidoctor-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <artifactId>maven-artifact-plugin</artifactId>
          <version>${maven-artifact-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>flatten-maven-plugin</artifactId>
          <version>${flatten-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.simplify4u.plugins</groupId>
          <artifactId>sign-maven-plugin</artifactId>
          <version>${sign-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>com.github.spotbugs</groupId>
          <artifactId>spotbugs-maven-plugin</artifactId>
          <version>${spotbugs-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>xml-maven-plugin</artifactId>
          <version>${xml-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>com.diffplug.spotless</groupId>
          <artifactId>spotless-maven-plugin</artifactId>
          <version>${spotless-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>com.github.genthaler</groupId>
          <artifactId>beanshell-maven-plugin</artifactId>
          <version>${beanshell-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-changelog-maven-plugin</artifactId>
          <version>${log4j-changelog-maven-plugin.version}</version>
          <dependencies>
            <dependency>
              <groupId>org.freemarker</groupId>
              <artifactId>freemarker</artifactId>
              <version>2.3.32</version>
            </dependency>
          </dependencies>
        </plugin>
        <plugin>
          <groupId>biz.aQute.bnd</groupId>
          <artifactId>bnd-baseline-maven-plugin</artifactId>
          <version>${bnd-baseline-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>biz.aQute.bnd</groupId>
          <artifactId>bnd-maven-plugin</artifactId>
          <version>${bnd-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.codehaus.mojo</groupId>
          <artifactId>build-helper-maven-plugin</artifactId>
          <version>${build-helper-maven-plugin.version}</version>
        </plugin>
        <plugin>
          <groupId>org.cyclonedx</groupId>
          <artifactId>cyclonedx-maven-plugin</artifactId>
          <version>${cyclonedx-maven-plugin.version}</version>
        </plugin>
      </plugins>
    </pluginManagement>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>flatten-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>flatten-revision</id>
            <phase>process-resources</phase>
            <goals>
              <goal>flatten</goal>
            </goals>
            <configuration>
              <updatePomFile>true</updatePomFile>
              <flattenMode>resolveCiFriendliesOnly</flattenMode>
            </configuration>
          </execution>
          <execution>
            <id>clean-flattened-pom</id>
            <phase>clean</phase>
            <goals>
              <goal>clean</goal>
            </goals>
          </execution>
          <execution>
            <id>flatten-bom</id>
            <phase>none</phase>
            <goals>
              <goal>flatten</goal>
            </goals>
            <configuration>
              <flattenMode>bom</flattenMode>
              <pomElements>
                <build>remove</build>
                <properties>remove</properties>
                <repositories>remove</repositories>
                <distributionManagement>remove</distributionManagement>
                <dependencyManagement>interpolate</dependencyManagement>
                <parent>keep</parent>
              </pomElements>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>${maven.compiler.source}</source>
          <release>${maven.compiler.release}</release>
          <target>${maven.compiler.target}</target>
          <encoding>${project.build.sourceEncoding}</encoding>
          <parameters>true</parameters>
          <compilerArgs>
            <arg>-Xlint:all</arg>
            <arg>-XDcompilePolicy=simple</arg>
            <arg>-Xplugin:ErrorProne</arg>
          </compilerArgs>
          <annotationProcessorPaths>
            <path>
              <groupId>com.google.errorprone</groupId>
              <artifactId>error_prone_core</artifactId>
              <version>${error-prone.version}</version>
            </path>
          </annotationProcessorPaths>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.cyclonedx</groupId>
        <artifactId>cyclonedx-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>generate-sbom</id>
            <phase>package</phase>
            <goals>
              <goal>makeAggregateBom</goal>
            </goals>
            <configuration>
              <outputFormat>xml</outputFormat>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>com.github.genthaler</groupId>
        <artifactId>beanshell-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>process-sbom</id>
            <phase>package</phase>
            <goals>
              <goal>run</goal>
            </goals>
            <configuration>
              <script>import java.io.*;
import java.nio.file.*;
import java.util.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import org.apache.commons.codec.digest.*;

    // Compute parameters
    final String xslt = project.getProperties().getProperty("sbom.xslt");
    final File pomFile = project.getModel().getPomFile();
    final byte[] digest = new DigestUtils(MessageDigestAlgorithms.SHA_256).digest(pomFile);
    final UUID bomSerialNumber = UUID.nameUUIDFromBytes(digest);
    final String vdrUrl = Objects.requireNonNull(project.getProperties().getProperty("vdr.url"), "vdr.url");

    // Move original SBOM file
    final Path basedir = project.getBasedir().toPath();
    final Path destPath = basedir.resolve("target/bom.xml");
    final Path sourcePath = basedir.resolve("target/bom.orig.xml");
    if (!Files.isReadable(destPath)) {
      System.out.println("No CycloneDX SBOM file found, skipping transformation.");
      return;
    }
    Files.move(destPath, sourcePath, new CopyOption[] {StandardCopyOption.REPLACE_EXISTING});

    // Apply XSLT transformation
    final StreamSource xsltSource = new StreamSource(new StringReader(xslt));
    final TransformerFactory factory = TransformerFactory.newInstance();
    final Transformer transformer = factory.newTransformer(xsltSource);
    transformer.setParameter("sbom.serialNumber", bomSerialNumber.toString());
    transformer.setParameter("vdr.url", vdrUrl);
    final StreamSource source = new StreamSource(sourcePath.toUri().toASCIIString());
    final StreamResult result = new StreamResult(destPath.toUri().toASCIIString());
    transformer.transform(source, result);</script>
            </configuration>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.16.0</version>
          </dependency>
          <dependency>
            <groupId>xalan</groupId>
            <artifactId>serializer</artifactId>
            <version>2.7.3</version>
          </dependency>
          <dependency>
            <groupId>xalan</groupId>
            <artifactId>xalan</artifactId>
            <version>2.7.3</version>
          </dependency>
        </dependencies>
      </plugin>
      <plugin>
        <artifactId>maven-enforcer-plugin</artifactId>
        <executions>
          <execution>
            <id>enforce-upper-bound-deps</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireUpperBoundDeps />
              </rules>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>com.github.spotbugs</groupId>
        <artifactId>spotbugs-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>default-spotbugs</id>
            <phase>verify</phase>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <plugins>
            <plugin>
              <groupId>com.h3xstream.findsecbugs</groupId>
              <artifactId>findsecbugs-plugin</artifactId>
              <version>${findsecbugs-plugin.version}</version>
            </plugin>
          </plugins>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.rat</groupId>
        <artifactId>apache-rat-plugin</artifactId>
        <executions>
          <execution>
            <phase>verify</phase>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <consoleOutput>true</consoleOutput>
          <excludes>
            <exclude>.java-version</exclude>
            <exclude>.mvn/jvm.config</exclude>
            <exclude>**/*.txt</exclude>
            <exclude>src/changelog/**/*.xml</exclude>
            <exclude>.github/ISSUE_TEMPLATE/*.md</exclude>
            <exclude>.github/pull_request_template.md</exclude>
          </excludes>
        </configuration>
      </plugin>
      <plugin>
        <groupId>com.diffplug.spotless</groupId>
        <artifactId>spotless-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>default-spotless</id>
            <phase>verify</phase>
            <goals>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <java>
            <licenseHeader>
              <content>/*
 * 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.
 */</content>
            </licenseHeader>
            <palantirJavaFormat>
              <version>${palantir-java-format.version}</version>
            </palantirJavaFormat>
          </java>
          <pom>
            <licenseHeader>
              <content>&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!--
  ~ 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.
  --></content>
              <delimiter>&lt;project</delimiter>
            </licenseHeader>
            <sortPom>
              <expandEmptyElements>false</expandEmptyElements>
              <spaceBeforeCloseEmptyElement>true</spaceBeforeCloseEmptyElement>
            </sortPom>
          </pom>
          <formats>
            <format>
              <includes>
                <include>src/**/*.xml</include>
              </includes>
              <excludes>
                <exclude>src/changelog/**/*.xml</exclude>
              </excludes>
              <licenseHeader>
                <content>&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!--
  ~ 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.
  --></content>
                <delimiter>&lt;(!DOCTYPE|\w)</delimiter>
              </licenseHeader>
              <endWithNewline />
              <trimTrailingWhitespace />
            </format>
            <format>
              <includes>
                <include>src/**/*.properties</include>
              </includes>
              <licenseHeader>
                <content>#
# 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.
#</content>
                <delimiter>(##|[^#])</delimiter>
              </licenseHeader>
              <endWithNewline />
            </format>
          </formats>
          <yaml>
            <includes>
              <include>.asf.yaml</include>
              <include>.github/**/*.yaml</include>
              <include>.github/**/*.yml</include>
              <include>src/**/*.yaml</include>
              <include>src/**/*.yml</include>
            </includes>
            <licenseHeader>
              <content>#
# 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.
#</content>
              <delimiter>(##|[^#])</delimiter>
            </licenseHeader>
            <endWithNewline />
            <trimTrailingWhitespace />
          </yaml>
          <lineEndings>UNIX</lineEndings>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>parse-version</id>
            <phase>validate</phase>
            <goals>
              <goal>parse-version</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>biz.aQute.bnd</groupId>
        <artifactId>bnd-maven-plugin</artifactId>
        <extensions>true</extensions>
        <executions>
          <execution>
            <id>default-jar</id>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <bnd># `Bundle-DocURL` uses `project.url`.
            # This is set to `${project.parent.url}${project.artifactId}` through Maven's inheritance assembly[1].
            # This eventually produces incorrect values.
            # Hence, we remove them from the produced descriptor.
            #
            # `Bundle-SCM` uses `project.scm.url` and suffers from the same inheritance problem `Bundle-DocURL` has.
            #
            # [1] https://maven.apache.org/ref/3.9.4/maven-model-builder/#inheritance-assembly
            #     Inheritance assembly can be disabled for certain properties, e.g., `project.url`.
            #     Though this would necessitate changes in the root `pom.xml`s of parented projects.
            #
            # `Bundle-Developers` is removed, since it is nothing but noise and occupies quite some real estate.
            -removeheaders: Bundle-DocURL,Bundle-SCM,Bundle-Developers

            # Create OSGi and JPMS module names based on the `groupId` and `artifactId`.
            # This almost agrees with `maven-bundle-plugin`, but replaces non-alphanumeric characters
            # with full stops `.`.
            Bundle-SymbolicName: $[bnd-bundle-symbolicname]
            -jpms-module-info: $[bnd-jpms-module-info]

            # Prevents an execution error in multi-release jars:
            -fixupmessages.classes_in_wrong_dir: "Classes found in the wrong directory";restrict:=error;is:=warning

            # Convert API leakage warnings to errors
            -fixupmessages.priv_refs: "private references";restrict:=warning;is:=error

            # 1. OSGI modules do not make sense in JPMS
            # 2. BND has a problem detecting the name of multi-release JPMS modules
            -jpms-module-info-options: \
              $[bnd-extra-module-options],\
              org.osgi.core;static=true;transitive=false,\
              org.osgi.framework;static=true;transitive=false,\
              org.apache.logging.log4j;substitute="log4j-api",\
              org.apache.logging.log4j.core;substitute="log4j-core"

            # Import all packages by default:
            Import-Package: \
              $[bnd-extra-package-options],\
              *

            # Allow each project to override the `Multi-Release` header:
            Multi-Release: $[bnd-multi-release]

            # Add manifests and modules for each multi-release version:
            -jpms-multi-release: $[bnd-multi-release]

            # Adds certain `Implementation-*` and `Specification-*` entries to the generated `MANIFEST.MF`.
            # Using these properties is known to be a bad practice: https://github.com/apache/logging-log4j2/issues/1923#issuecomment-1786818254
            # Users should use `META-INF/maven/&lt;groupId>/&lt;artifactId>/pom.properties` instead.
            # Yet we support it due to backward compatibility reasons.
            # The issue was reported to `bnd-maven-plugin` too: https://github.com/bndtools/bnd/issues/5855
            # We set these values to their Maven Archiver defaults: https://maven.apache.org/shared/maven-archiver/#class_manifest
            Implementation-Title: ${project.name}
            Implementation-Vendor: ${project.organization.name}
            Implementation-Version: ${project.version}
            Specification-Title: ${project.name}
            Specification-Vendor: ${project.organization.name}
            Specification-Version: ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}

            # Extra configuration provided by the consumer:
            ${bnd-extra-config}</bnd>
        </configuration>
      </plugin>
      <plugin>
        <groupId>biz.aQute.bnd</groupId>
        <artifactId>bnd-baseline-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>check-api-compat</id>
            <goals>
              <goal>baseline</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <includeDistributionManagement>false</includeDistributionManagement>
          <releaseversions>true</releaseversions>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <profiles>
    <profile>
      <id>changelog-validate</id>
      <activation>
        <file>
          <exists>src/changelog</exists>
        </file>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>xml-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>validate-changelog</id>
                <phase>validate</phase>
                <goals>
                  <goal>validate</goal>
                </goals>
                <configuration>
                  <validationSets>
                    <validationSet>
                      <dir>src/changelog</dir>
                      <includes>
                        <include>**/*.xml</include>
                      </includes>
                      <publicId>http://logging.apache.org/log4j/changelog</publicId>
                      <systemId>https://logging.apache.org/log4j/changelog-0.1.2.xsd</systemId>
                      <validating>true</validating>
                    </validationSet>
                  </validationSets>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>changelog-export</id>
      <activation>
        <file>
          <exists>src/changelog</exists>
        </file>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-changelog-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>export-changelog</id>
                <phase>generate-sources</phase>
                <goals>
                  <goal>export</goal>
                </goals>
                <configuration>
                  <outputDirectory>src/site</outputDirectory>
                  <indexTemplates>
                    <template>
                      <source>.index.adoc.ftl</source>
                      <target>_release-notes.adoc</target>
                    </template>
                  </indexTemplates>
                  <changelogTemplates>
                    <template>
                      <source>.release-notes.adoc.ftl</source>
                      <target>_release-notes/_%v.adoc</target>
                    </template>
                  </changelogTemplates>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>changelog-release</id>
      <build>
        <defaultGoal>log4j-changelog:release@release-changelog generate-sources</defaultGoal>
        <plugins>
          <plugin>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-changelog-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>release-changelog</id>
                <configuration>
                  <releaseVersion>${project.version}</releaseVersion>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>distribution</id>
      <build>
        <defaultGoal>enforcer:enforce@enforce-distribution-arguments bsh:run@create-distribution</defaultGoal>
        <plugins>
          <plugin>
            <artifactId>maven-enforcer-plugin</artifactId>
            <executions>
              <execution>
                <id>enforce-distribution-arguments</id>
                <goals>
                  <goal>enforce</goal>
                </goals>
                <configuration>
                  <rules>
                    <requireProperty>
                      <property>attachmentFilepathPattern</property>
                      <message>You must set an `attachmentFilepathPattern` property for the regex pattern matched against the full filepath for determining attachments to be included in the distribution!</message>
                    </requireProperty>
                    <requireProperty>
                      <property>attachmentCount</property>
                      <message>You must set an `attachmentCount` property for the number of attachments expected to be found!</message>
                    </requireProperty>
                  </rules>
                  <fail>true</fail>
                </configuration>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>com.github.genthaler</groupId>
            <artifactId>beanshell-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>create-distribution</id>
                <goals>
                  <goal>run</goal>
                </goals>
                <configuration>
                  <script>import java.io.*;
                    import java.nio.file.*;
                    import java.util.*;
                    import java.util.function.*;
                    import java.util.stream.*;
                    import java.util.zip.*;

                    import org.eclipse.jgit.dircache.*;
                    import org.eclipse.jgit.lib.Repository;
                    import org.eclipse.jgit.storage.file.FileRepositoryBuilder;

                    String outputTimestamp = project.getProperties().getProperty("project.build.outputTimestamp");
                    long timestampMillis = java.time.Instant.parse(outputTimestamp).toEpochMilli();
                    zip(String zipFileName, Map pathByFile) {
                        OutputStream outputStream = new FileOutputStream(zipFileName);
                        ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream);
                        try {
                            for (String file : pathByFile.keySet()) {
                                Path path = pathByFile.get(file);
                                // Skip directories, which is tracked by Git only when it is a symlink
                                if (Files.isDirectory(path, /* required for BSH method resolution: */ new LinkOption[0])) {
                                    continue;
                                }
                                try {
                                    ZipEntry zipEntry = new ZipEntry(file);
                                    zipEntry.setTime(timestampMillis);
                                    zipOutputStream.putNextEntry(zipEntry);
                                    zipOutputStream.write(Files.readAllBytes(path));
                                    zipOutputStream.closeEntry();
                                } catch (Exception error) {
                                    String message = String.format(
                                        "failed processing file `%s` at path `%s`",
                                        new Object[]{file, path});
                                    throw new RuntimeException(message, error);
                                }
                            }
                        } catch (Exception error) {
                            String message = String.format("failed creating ZIP archive `%s`", new Object[]{zipFileName});
                            Exception extendedError = new RuntimeException(message, error);
                            // Supplement diagnostics
                            extendedError.printStackTrace(System.err);
                            throw extendedError;
                        } finally {
                            zipOutputStream.close();
                        }
                    }

                    // Find Git-tracked files
                    SortedMap pathByFile = new TreeMap();
                    Repository repo = new FileRepositoryBuilder().readEnvironment().findGitDir().build();
                    DirCache repoCache = repo.readDirCache();
                    String repoDirectoryParent = repo.getDirectory().getParent();
                    for (int repoCacheEntryIndex = 0; repoCacheEntryIndex &lt; repoCache.getEntryCount(); repoCacheEntryIndex++) {
                        DirCacheEntry repoCacheEntry = repoCache.getEntry(repoCacheEntryIndex);
                        String repoCacheEntryPath = repoCacheEntry.getPathString();
                        pathByFile.put(repoCacheEntryPath, new File(repoDirectoryParent, repoCacheEntryPath).toPath());
                    }

                    // Create the source distribution using Git-tracked files
                    zip("target/src.zip", pathByFile);
                    System.out.format("Generated the source distribution (`src.zip`) containing %d files.%n", new Object[]{pathByFile.size()});

                    // Short-circuit if there is no binary distribution expected
                    if (${attachmentCount} == 0) {
                        return;
                    }

                    // Find auxiliary files that will go into the binary distribution
                    SortedMap pathByFile = new TreeMap();
                    pathByFile.put("RELEASE-NOTES.adoc", new File("src/site/_release-notes/_${project.version}.adoc").toPath());
                    pathByFile.put("README.adoc", new File("README.adoc").toPath());
                    pathByFile.put("NOTICE.txt", new File("NOTICE.txt").toPath());
                    pathByFile.put("LICENSE.txt", new File("LICENSE.txt").toPath());

                    // Find attachments that will go into the binary distribution
                    Path projectDir = Paths.get("${maven.multiModuleProjectDirectory}", new String[0]);
                    String attachmentFilepathPattern = "${attachmentFilepathPattern}";
                    System.out.format("Locating attachments matching the provided pattern: `%s`%n", new Object[] {attachmentFilepathPattern});
                    SortedMap attachmentPathByFile = new TreeMap();
                    Stream paths = Files.walk(new File(repoDirectoryParent).toPath(), 32, /* required for BSH method resolution: */ new FileVisitOption[0]);
                    try {
                        paths.forEach(new Consumer() {
                            public void accept(Path path) {
                                if (Files.isRegularFile(path, /* required for BSH method resolution: */ new LinkOption[0])) {
                                    String relativePath = projectDir.relativize(path).toString();
                                    if (relativePath.matches(attachmentFilepathPattern)) {
                                        attachmentPathByFile.put(path.getFileName().toString(), path);
                                    }
                                }
                            }
                        });
                    } catch (Exception error) {
                        // Supplement diagnostics
                        error.printStackTrace(System.err);
                        throw error;
                    } finally {
                        paths.close();
                    }

                    // Check if no attachments were found
                    if (${attachmentCount} != attachmentPathByFile.size()) {
                        System.err.println("Attachments:");
                        int[] i = {0};
                        attachmentPathByFile.values().forEach(new Consumer() {
                            public void accept(Path path) {
                                System.err.format("  [%2d] %s%n", new Object[]{++i[0], path});
                            }
                        });
                        System.err.format(
                                "Error: Was expecting %d attachments, found %d!%n",
                                new Object[]{${attachmentCount}, attachmentPathByFile.size()});
                        System.err.println("Tip: Have you already executed the Maven `package` goal?");
                        System.exit(1);
                    }

                    // Create the binary distribution
                    pathByFile.putAll(attachmentPathByFile);
                    zip("target/bin.zip", pathByFile);
                    System.out.format("Generated the binary distribution (`bin.zip`) containing following %d files:%n", new Object[] {pathByFile.size()});
                    for (String file : pathByFile.keySet()) {
                        System.out.println("-> " + file);
                    }</script>
                </configuration>
              </execution>
            </executions>
            <dependencies>
              <dependency>
                <groupId>org.eclipse.jgit</groupId>
                <artifactId>org.eclipse.jgit</artifactId>
                <version>${org.eclipse.jgit.version}</version>
              </dependency>
            </dependencies>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>deploy</id>
      <build>
        <defaultGoal>deploy</defaultGoal>
        <plugins>
          <plugin>
            <groupId>org.simplify4u.plugins</groupId>
            <artifactId>sign-maven-plugin</artifactId>
            <executions>
              <execution>
                <goals>
                  <goal>sign</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
      <properties>
        <spotbugs.skip>true</spotbugs.skip>
        <installAtEnd>true</installAtEnd>
        <deployAtEnd>true</deployAtEnd>
        <skipTests>true</skipTests>
        <spotless.check.skip>true</spotless.check.skip>
      </properties>
    </profile>
    <profile>
      <id>release</id>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <goals>
                  <goal>jar-no-fork</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <artifactId>maven-enforcer-plugin</artifactId>
            <executions>
              <execution>
                <id>enforce-no-snapshots</id>
                <goals>
                  <goal>enforce</goal>
                </goals>
                <configuration>
                  <rules>
                    <requireReleaseDeps>
                      <message>SNAPSHOT dependencies are not allowed for releases</message>
                      <onlyWhenRelease>true</onlyWhenRelease>
                    </requireReleaseDeps>
                    <requireReleaseVersion>
                      <message>A release cannot be a SNAPSHOT version</message>
                    </requireReleaseVersion>
                  </rules>
                  <fail>true</fail>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>constants-tmpl-adoc</id>
      <activation>
        <file>
          <exists>src/site/_constants.tmpl.adoc</exists>
        </file>
      </activation>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-antrun-plugin</artifactId>
            <executions>
              <execution>
                <id>copy-constants-adoc</id>
                <phase>generate-sources</phase>
                <goals>
                  <goal>run</goal>
                </goals>
                <configuration>
                  <target>
                    <copy tofile="${project.build.directory}/constants-adoc/_constants.adoc" overwrite="true" verbose="true">
                      <fileset file="src/site/_constants.tmpl.adoc" />
                    </copy>
                  </target>
                </configuration>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <executions>
              <execution>
                <id>filter-constants-adoc</id>
                <phase>process-sources</phase>
                <goals>
                  <goal>copy-resources</goal>
                </goals>
                <configuration>
                  <outputDirectory>src/site</outputDirectory>
                  <resources>
                    <resource>
                      <directory>${project.build.directory}/constants-adoc</directory>
                      <filtering>true</filtering>
                    </resource>
                  </resources>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>asciidoc</id>
      <activation>
        <file>
          <exists>src/site</exists>
        </file>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.asciidoctor</groupId>
            <artifactId>asciidoctor-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>export-asciidoc-to-html</id>
                <phase>site</phase>
                <goals>
                  <goal>process-asciidoc</goal>
                </goals>
                <configuration>
                  <sourceDirectory>src/site</sourceDirectory>
                  <outputDirectory>${project.build.directory}/site</outputDirectory>
                  <preserveDirectories>true</preserveDirectories>
                  <attributes>
                    <source-highlighter>coderay</source-highlighter>
                    <toc>left</toc>
                    <icons>font</icons>
                  </attributes>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
      <properties>
        <maven.site.skip>true</maven.site.skip>
        <maven.site.deploy.skip>true</maven.site.deploy.skip>
      </properties>
    </profile>
    <profile>
      <id>spotbugs-exclude</id>
      <activation>
        <file>
          <exists>${maven.multiModuleProjectDirectory}/spotbugs-exclude.xml</exists>
        </file>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>com.github.spotbugs</groupId>
            <artifactId>spotbugs-maven-plugin</artifactId>
            <configuration>
              <excludeFilterFile>${maven.multiModuleProjectDirectory}/spotbugs-exclude.xml</excludeFilterFile>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>
</project>
