I read this blog post recently about build tools and found it interesting: <
http://www.lihaoyi.com/post/BuildToolsasPureFunctionalPrograms.html>.
Perhaps we can lift some ideas from here to find some build optimizations
we may have missed (e.g., caching settings).

On 22 January 2018 at 14:40, Gary Gregory <garydgreg...@gmail.com> wrote:

> On Mon, Jan 22, 2018 at 12:26 PM, Matt Sicker <boa...@gmail.com> wrote:
>
> > I still haven't seen a nice way to integrate multiple Maven-generated
> > websites as it is. If we broke into multiple repositories, we'd have to
> > basically rewrite the website infrastructure as well (which I've been
> > thinking about for a while anyways). As a result, either direction we
> take
> > (monorepo or multirepo) will require build optimizations (and not just
> > involving unit tests).
> >
> > Based on wall time, what Remko is proposing makes the most sense. If we
> can
> > reduce the wall time of running tests significantly, then we'll solve a
> > majority of the problem.
> >
> > If you wonder how much worse it could get, though, take a look at Camel.
> > They have literally dozens of modules with a full build taking hours. If
> > each component was released separately, they'd probably never get updated
> > considering how many components are about very specific libraries that
> not
> > many people would know how to verify or test. We have something similar
> > here as we add more esoteric appenders, logger adapters, and language
> > bindings.
> >
> > As a follow up, if there is a way to reduce the full build and release
> time
> > by switching to a different build tool (e.g., Gradle, Bazel, Ant/Ivy, or
> > even something else in the JVM ecosystem not specific to Java), that may
> > also be worth investigating. I don't think it'll be necessary, but it's
> > something worth considering later on.
> >
>
> Yeah, this business of running the tests three times is wacky (test,
> jacoco, and site?) Surely, once the tests pass once to build the site for
> example, the other mvn invocations could use -DskipTests?
>
> The code coverage is a different story. Maybe there is a way to run Jacoco
> and have the test results saved and reused by the site build for the code
> coverage report. Basically, this would skip the "test" goal/phase.
>
> Arg,
> Gary
>
>
> > On 21 January 2018 at 00:18, Remko Popma <remko.po...@gmail.com> wrote:
> >
> > > This looks promising:
> > > http://maven.apache.org/surefire/maven-surefire-
> > > plugin/examples/fork-options-and-parallel-execution.html
> > > (especially the @NotThreadSafe annotation, potentially in combination
> > with
> > > JUnit Suits)
> > >
> > >
> > > On Sun, Jan 21, 2018 at 13:12 Remko Popma <remko.po...@gmail.com>
> wrote:
> > >
> > > > Mikael, Ralph,
> > > >
> > > > Have you really thought through the implications of having a separate
> > > > repository for each module? The overhead is very large!
> > > >
> > > > It would mean:
> > > > * a separate website for each repo (our current Log4j2 website only
> > knows
> > > > about the modules in the logging-log4j project).
> > > > * a separate release and release vote would need to be performed *for
> > > each
> > > > repo*. This process is so heavy that we only do it once a month for
> > > Log4j2.
> > > > Imagine doing this 10 times when we have 10 modules each in separate
> > > repos.
> > > > * synchronizing with the main Log4j project becomes checking and
> > updating
> > > > 10 projects instead of one.
> > > >
> > > > All of these concerns already hold for a single log4j-plugins
> project,
> > > > they just multiply for each additional repo.
> > > >
> > > > All,
> > > >
> > > > Gary does have a point when he says we don’t have a clear plan for
> > > > managing the log4j-plugins repo. Who is going to check that the
> plugins
> > > > still compile after a Log4j2 release? Are we going to release a new
> > > plugins
> > > > version for each Log4j2 release? If not, when _will_ we release new
> > > > log4j-plugins versions?
> > > >
> > > > Given our terrible track record for the log4j-tools project since we
> > > > moved TcpServer etc. into that repo (nobody showing interest to do
> the
> > > > work to release it), I agree these are valid concerns.
> > > >
> > > > On the other hand, I also completely agree with Ralph that the build
> > > takes
> > > > much too long. Something needs to be done and Ralph is clearly
> > signalling
> > > > he won't have this problem ignored any longer.
> > > >
> > > > I'm not sure that moving things out of the main repo is the only
> > solution
> > > > to make the build faster. If it really is the *only* solution, then
> > fine.
> > > > But be mindful we are trading one problem for a set of new ones, and,
> > > just
> > > > like we can't ignore the slow build problem, we also cannot ignore
> the
> > > new
> > > > problems introduced by this solution (keeping the new repo(s) in
> sync,
> > > > building new web sites and linking them into the main site, release
> > > timing
> > > > etc).
> > > >
> > > > PROPOSAL:
> > > > I think all of us should take responsibility for speeding up the
> build
> > > and
> > > > make it our first priority.
> > > > If you want to add anything to the main project, *first reduce the
> > build
> > > > duration*. First find an existing test and speed it up. Only then add
> > new
> > > > stuff, keeping the total build time to the same or less than it was
> > > > before.  Building core and running its tests used to take 8 minutes.
> > Now
> > > it
> > > > takes 19:10 (`mvn clean package` on the whole project takes 24:22).
> > > >
> > > > The core tests clearly are a major bottleneck.
> > > >
> > > > Speeding up the core tests is something we can all work on. Can we
> > split
> > > > the tests into a set that can be run multi-threaded in parallel
> > > (fastest),
> > > > a different set that does not require forking (fast) and a third set
> > that
> > > > requires forking for every test (slowest)?
> > > >
> > > > On the other hand, if we want to move things out of the main repo we
> > need
> > > > a plan for the new repo(s). There is a one-time work of setting up
> web
> > > > sites and integrating them with the main site, but on an ongoing
> basis
> > we
> > > > need some way to verify that a change in log4j-core did not break any
> > > > plugins, and agree to do a plugins release if it did break something.
> > > >
> > > > Remko
> > > >
> > > >
> > > > On Sun, Jan 21, 2018 at 2:27 Ralph Goers <ralph.go...@dslextreme.com
> >
> > > > wrote:
> > > >
> > > >> I am fine with doing that but we would still want a way to get to
> all
> > > the
> > > >> plugin sites from the log4j web site. Maven does that and maintains
> a
> > > list
> > > >> at https://maven.apache.org/plugins/ <https://maven.apache.org/
> > plugins/
> > > >.
> > > >> I think the easiest way to manage a page like that would to have it
> > be a
> > > >> separate page in the CMS that the log4j site links to.
> > > >>
> > > >> Ralph
> > > >>
> > > >> > On Jan 20, 2018, at 8:29 AM, Mikael Ståldal <mi...@apache.org>
> > wrote:
> > > >> >
> > > >> > As I wrote recently, I don't think that having a kitchen-sink
> > plugins
> > > >> repository is a good way to solve this. Eventually that repository
> > will
> > > get
> > > >> too big.
> > > >> >
> > > >> > It's better to create a new repository for each new module (or
> > > possibly
> > > >> for a couple of related modules, but they should be more related
> than
> > > just
> > > >> being Log4j plugins).
> > > >> >
> > > >> >
> > > >> > On 2018-01-19 06:31, Ralph Goers wrote:
> > > >> >> Gary, I am complaining because I perform the releases. You never
> > > have.
> > > >> We keep adding more and more crap to the build and it keeps taking
> > > longer
> > > >> and longer. Af far as I am concerned that is a valid technical
> reason.
> > > >> >> My -1 stands.
> > > >> >> Ralph
> > > >> >>> On Jan 18, 2018, at 10:24 PM, Gary Gregory <
> > garydgreg...@gmail.com>
> > > >> wrote:
> > > >> >>>
> > > >> >>> On Thu, Jan 18, 2018 at 10:20 PM, Ralph Goers <
> > > >> ralph.go...@dslextreme.com>
> > > >> >>> wrote:
> > > >> >>>
> > > >> >>>> OK, but that doesn’t resolve the initial problem. The log4j 2
> > > >> project is
> > > >> >>>> too large.
> > > >> >>>>
> > > >> >>>
> > > >> >>> From what I've experienced, folks complain about the size of the
> > api
> > > >> and
> > > >> >>> core jars, not the Maven project.
> > > >> >>>
> > > >> >>> What is the target size/metric if it is currently "too large"?
> ;-)
> > > >> >>>
> > > >> >>> Gary
> > > >> >>>
> > > >> >>>
> > > >> >>>> Ralph
> > > >> >>>>
> > > >> >>>>> On Jan 18, 2018, at 10:15 PM, Gary Gregory <
> > > garydgreg...@gmail.com>
> > > >> >>>> wrote:
> > > >> >>>>>
> > > >> >>>>> On Thu, Jan 18, 2018 at 9:43 PM, Ralph Goers <
> > > >> ralph.go...@dslextreme.com
> > > >> >>>>>
> > > >> >>>>> wrote:
> > > >> >>>>>
> > > >> >>>>>> In addition, the build is now failing to compile on Jenkins.
> > > >> >>>>>>
> > > >> >>>>>
> > > >> >>>>> Oops, please accept my apologies. I got caught by the Eclipse
> > > >> compiler
> > > >> >>>>> being more forgiving (or more powerful) than the Oracle
> compiler
> > > in
> > > >> the
> > > >> >>>>> generics department. All of that despite the Maven partial
> > builds
> > > I
> > > >> ran.
> > > >> >>>> I
> > > >> >>>>> must have not run the clean goal or some-such.
> > > >> >>>>>
> > > >> >>>>> Gary
> > > >> >>>>>
> > > >> >>>>>
> > > >> >>>>>> Ralph
> > > >> >>>>>>
> > > >> >>>>>>> On Jan 18, 2018, at 9:28 PM, Ralph Goers <
> > > >> ralph.go...@dslextreme.com>
> > > >> >>>>>> wrote:
> > > >> >>>>>>>
> > > >> >>>>>>> -1
> > > >> >>>>>>>
> > > >> >>>>>>> Please revert and move this to the log4j plugins project.
> > > >> >>>>>>>
> > > >> >>>>>>> Ralph
> > > >> >>>>>>>
> > > >> >>>>>>>> On Jan 18, 2018, at 8:54 PM, ggreg...@apache.org wrote:
> > > >> >>>>>>>>
> > > >> >>>>>>>> Repository: logging-log4j2
> > > >> >>>>>>>> Updated Branches:
> > > >> >>>>>>>> refs/heads/master bb6fcd09e -> 639f093b8
> > > >> >>>>>>>>
> > > >> >>>>>>>>
> > > >> >>>>>>>> [LOG4J2-2186] Add a JDBC ConnectionSource that provides
> > pooling
> > > >> >>>> through
> > > >> >>>>>>>> Apache Commons DBCP 2.
> > > >> >>>>>>>>
> > > >> >>>>>>>> Project:
> > > >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
> > > >> >>>>>>>> Commit: http://git-wip-us.apache.org/
> > repos/asf/logging-log4j2/
> > > >> >>>>>> commit/639f093b
> > > >> >>>>>>>> Tree:
> > > >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/
> > > >> >>>>>> 639f093b
> > > >> >>>>>>>> Diff:
> > > >> http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/
> > > >> >>>>>> 639f093b
> > > >> >>>>>>>>
> > > >> >>>>>>>> Branch: refs/heads/master
> > > >> >>>>>>>> Commit: 639f093b8103df2c2eda8d62fd12d7619d98ac04
> > > >> >>>>>>>> Parents: bb6fcd0
> > > >> >>>>>>>> Author: Gary Gregory <garydgreg...@gmail.com>
> > > >> >>>>>>>> Authored: Thu Jan 18 20:54:47 2018 -0700
> > > >> >>>>>>>> Committer: Gary Gregory <garydgreg...@gmail.com>
> > > >> >>>>>>>> Committed: Thu Jan 18 20:54:47 2018 -0700
> > > >> >>>>>>>>
> > > >> >>>>>>>> ------------------------------
> ------------------------------
> > > >> >>>> ----------
> > > >> >>>>>>>> log4j-jdbc-dbcp2/pom.xml                        | 170
> > > >> >>>>>> +++++++++++++++++++
> > > >> >>>>>>>> .../db/jdbc/PoolingDriverConnectionSource.java  | 155
> > > >> >>>> +++++++++++++++++
> > > >> >>>>>>>> log4j-jdbc-dbcp2/src/site/manual/index.md       |  35 ++++
> > > >> >>>>>>>> log4j-jdbc-dbcp2/src/site/site.xml              |  52
> ++++++
> > > >> >>>>>>>> .../jdbc/PoolingDriverConnectionSourceTest.java |  96
> > > +++++++++++
> > > >> >>>>>>>> pom.xml                                         |   1 +
> > > >> >>>>>>>> src/changes/changes.xml                         |   3 +
> > > >> >>>>>>>> src/site/xdoc/manual/appenders.xml              |  28 ++-
> > > >> >>>>>>>> 8 files changed, 537 insertions(+), 3 deletions(-)
> > > >> >>>>>>>> ------------------------------
> ------------------------------
> > > >> >>>> ----------
> > > >> >>>>>>>>
> > > >> >>>>>>>>
> > > >> >>>>>>>> http://git-wip-us.apache.org/
> repos/asf/logging-log4j2/blob/
> > > >> >>>>>> 639f093b/log4j-jdbc-dbcp2/pom.xml
> > > >> >>>>>>>> ------------------------------
> ------------------------------
> > > >> >>>> ----------
> > > >> >>>>>>>> diff --git a/log4j-jdbc-dbcp2/pom.xml
> > > b/log4j-jdbc-dbcp2/pom.xml
> > > >> >>>>>>>> new file mode 100644
> > > >> >>>>>>>> index 0000000..18e0e86
> > > >> >>>>>>>> --- /dev/null
> > > >> >>>>>>>> +++ b/log4j-jdbc-dbcp2/pom.xml
> > > >> >>>>>>>> @@ -0,0 +1,170 @@
> > > >> >>>>>>>> +<?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 xmlns="http://maven.apache.org/POM/4.0.0";
> > > xmlns:xsi="
> > > >> >>>>>> http://www.w3.org/2001/XMLSchema-instance";
> > > >> >>>>>>>> +  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
> > > >> >>>>>> http://maven.apache.org/xsd/maven-4.0.0.xsd";>
> > > >> >>>>>>>> +  <parent>
> > > >> >>>>>>>> +    <groupId>org.apache.logging.log4j</groupId>
> > > >> >>>>>>>> +    <artifactId>log4j</artifactId>
> > > >> >>>>>>>> +    <version>2.10.1-SNAPSHOT</version>
> > > >> >>>>>>>> +  </parent>
> > > >> >>>>>>>> +  <modelVersion>4.0.0</modelVersion>
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +  <artifactId>log4j-jdbc-dbcp2</artifactId>
> > > >> >>>>>>>> +  <name>Apache Log4j JDBC DBCP 2</name>
> > > >> >>>>>>>> +  <description>
> > > >> >>>>>>>> +    Connection source for the JDBC Appender using on
> Apache
> > > >> Commons
> > > >> >>>>>> DBCP 2.
> > > >> >>>>>>>> +  </description>
> > > >> >>>>>>>> +  <properties>
> > > >> >>>>>>>> +    <log4jParentDir>${basedir}/..</log4jParentDir>
> > > >> >>>>>>>> +    <docLabel>Log4j JDBC DBCP 2 Documentation</docLabel>
> > > >> >>>>>>>> +    <projectDir>/log4j-jdbc-dbcp2</projectDir>
> > > >> >>>>>>>> +    <module.name>org.apache.logging.log4j.jdbc.dbcp2</
> > > >> module.name>
> > > >> >>>>>>>> +  </properties>
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +  <dependencies>
> > > >> >>>>>>>> +    <dependency>
> > > >> >>>>>>>> +      <groupId>org.apache.logging.log4j</groupId>
> > > >> >>>>>>>> +      <artifactId>log4j-core</artifactId>
> > > >> >>>>>>>> +    </dependency>
> > > >> >>>>>>>> +    <dependency>
> > > >> >>>>>>>> +      <groupId>org.apache.commons</groupId>
> > > >> >>>>>>>> +      <artifactId>commons-dbcp2</artifactId>
> > > >> >>>>>>>> +      <version>2.2.0</version>
> > > >> >>>>>>>> +    </dependency>
> > > >> >>>>>>>> +    <!-- Test Dependencies -->
> > > >> >>>>>>>> +    <dependency>
> > > >> >>>>>>>> +      <groupId>junit</groupId>
> > > >> >>>>>>>> +      <artifactId>junit</artifactId>
> > > >> >>>>>>>> +    </dependency>
> > > >> >>>>>>>> +    <dependency>
> > > >> >>>>>>>> +      <groupId>org.apache.logging.log4j</groupId>
> > > >> >>>>>>>> +      <artifactId>log4j-api</artifactId>
> > > >> >>>>>>>> +      <type>test-jar</type>
> > > >> >>>>>>>> +    </dependency>
> > > >> >>>>>>>> +    <dependency>
> > > >> >>>>>>>> +      <groupId>org.apache.logging.log4j</groupId>
> > > >> >>>>>>>> +      <artifactId>log4j-core</artifactId>
> > > >> >>>>>>>> +      <type>test-jar</type>
> > > >> >>>>>>>> +    </dependency>
> > > >> >>>>>>>> +    <dependency>
> > > >> >>>>>>>> +      <groupId>com.h2database</groupId>
> > > >> >>>>>>>> +      <artifactId>h2</artifactId>
> > > >> >>>>>>>> +      <scope>test</scope>
> > > >> >>>>>>>> +    </dependency>
> > > >> >>>>>>>> +  </dependencies>
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +  <build>
> > > >> >>>>>>>> +    <plugins>
> > > >> >>>>>>>> +      <plugin>
> > > >> >>>>>>>> +        <groupId>org.apache.felix</groupId>
> > > >> >>>>>>>> +        <artifactId>maven-bundle-plugin</artifactId>
> > > >> >>>>>>>> +        <configuration>
> > > >> >>>>>>>> +          <instructions>
> > > >> >>>>>>>> +
> > > >> <Fragment-Host>org.apache.logging.log4j.core.appender.
> > > >> >>>>>> db.jdbc</Fragment-Host>
> > > >> >>>>>>>> +            <Export-Package>*</Export-Package>
> > > >> >>>>>>>> +          </instructions>
> > > >> >>>>>>>> +        </configuration>
> > > >> >>>>>>>> +      </plugin>
> > > >> >>>>>>>> +    </plugins>
> > > >> >>>>>>>> +  </build>
> > > >> >>>>>>>> +  <reporting>
> > > >> >>>>>>>> +    <plugins>
> > > >> >>>>>>>> +      <plugin>
> > > >> >>>>>>>> +        <groupId>org.apache.maven.plugins</groupId>
> > > >> >>>>>>>> +        <artifactId>maven-changes-plugin</artifactId>
> > > >> >>>>>>>> +        <version>${changes.plugin.version}</version>
> > > >> >>>>>>>> +        <reportSets>
> > > >> >>>>>>>> +          <reportSet>
> > > >> >>>>>>>> +            <reports>
> > > >> >>>>>>>> +              <report>changes-report</report>
> > > >> >>>>>>>> +            </reports>
> > > >> >>>>>>>> +          </reportSet>
> > > >> >>>>>>>> +        </reportSets>
> > > >> >>>>>>>> +        <configuration>
> > > >> >>>>>>>> +          <issueLinkTemplate>%URL%/show_
> > bug.cgi?id=%ISSUE%</
> > > >> >>>>>> issueLinkTemplate>
> > > >> >>>>>>>> +          <useJql>true</useJql>
> > > >> >>>>>>>> +        </configuration>
> > > >> >>>>>>>> +      </plugin>
> > > >> >>>>>>>> +      <plugin>
> > > >> >>>>>>>> +        <groupId>org.apache.maven.plugins</groupId>
> > > >> >>>>>>>> +        <artifactId>maven-checkstyle-plugin</artifactId>
> > > >> >>>>>>>> +        <version>${checkstyle.plugin.version}</version>
> > > >> >>>>>>>> +        <configuration>
> > > >> >>>>>>>> +          <!--<propertiesLocation>${vfs.
> > > parent.dir}/checkstyle.
> > > >> >>>>>> properties</propertiesLocation> -->
> > > >> >>>>>>>> +          <configLocation>${log4jParentDir}/checkstyle.
> > > >> >>>>>> xml</configLocation>
> > > >> >>>>>>>> +          <suppressionsLocation>${
> > log4jParentDir}/checkstyle-
> > > >> >>>>>> suppressions.xml</suppressionsLocation>
> > > >> >>>>>>>> +          <enableRulesSummary>false</enableRulesSummary>
> > > >> >>>>>>>> +
> > > >> <propertyExpansion>basedir=${basedir}</propertyExpansion>
> > > >> >>>>>>>> +          <propertyExpansion>licensedir=
> > > >> >>>> ${log4jParentDir}/checkstyle-
> > > >> >>>>>> header.txt</propertyExpansion>
> > > >> >>>>>>>> +        </configuration>
> > > >> >>>>>>>> +      </plugin>
> > > >> >>>>>>>> +      <plugin>
> > > >> >>>>>>>> +        <groupId>org.apache.maven.plugins</groupId>
> > > >> >>>>>>>> +        <artifactId>maven-javadoc-plugin</artifactId>
> > > >> >>>>>>>> +        <version>${javadoc.plugin.version}</version>
> > > >> >>>>>>>> +        <configuration>
> > > >> >>>>>>>> +          <bottom><![CDATA[<p align="center">Copyright
> > &#169;
> > > >> >>>>>> {inceptionYear}-{currentYear} {organizationName}. All Rights
> > > >> >>>> Reserved.<br />
> > > >> >>>>>>>> +            Apache Logging, Apache Log4j, Log4j, Apache,
> the
> > > >> Apache
> > > >> >>>>>> feather logo, the Apache Logging project logo,
> > > >> >>>>>>>> +            and the Apache Log4j logo are trademarks of
> The
> > > >> Apache
> > > >> >>>>>> Software Foundation.</p>]]></bottom>
> > > >> >>>>>>>> +          <!-- module link generation is completely broken
> > in
> > > >> the
> > > >> >>>>>> javadoc plugin for a multi-module non-aggregating project -->
> > > >> >>>>>>>> +          <detectOfflineLinks>false</detectOfflineLinks>
> > > >> >>>>>>>> +          <linksource>true</linksource>
> > > >> >>>>>>>> +        </configuration>
> > > >> >>>>>>>> +        <reportSets>
> > > >> >>>>>>>> +          <reportSet>
> > > >> >>>>>>>> +            <id>non-aggregate</id>
> > > >> >>>>>>>> +            <reports>
> > > >> >>>>>>>> +              <report>javadoc</report>
> > > >> >>>>>>>> +            </reports>
> > > >> >>>>>>>> +          </reportSet>
> > > >> >>>>>>>> +        </reportSets>
> > > >> >>>>>>>> +      </plugin>
> > > >> >>>>>>>> +      <plugin>
> > > >> >>>>>>>> +        <groupId>org.codehaus.mojo</groupId>
> > > >> >>>>>>>> +        <artifactId>findbugs-maven-plugin</artifactId>
> > > >> >>>>>>>> +        <version>${findbugs.plugin.version}</version>
> > > >> >>>>>>>> +        <configuration>
> > > >> >>>>>>>> +          <fork>true</fork>
> > > >> >>>>>>>> +          <jvmArgs>-Duser.language=en</jvmArgs>
> > > >> >>>>>>>> +          <threshold>Normal</threshold>
> > > >> >>>>>>>> +          <effort>Default</effort>
> > > >> >>>>>>>> +          <excludeFilterFile>${log4jParentDir}/findbugs-
> > > >> >>>>>> exclude-filter.xml</excludeFilterFile>
> > > >> >>>>>>>> +        </configuration>
> > > >> >>>>>>>> +      </plugin>
> > > >> >>>>>>>> +      <plugin>
> > > >> >>>>>>>> +        <groupId>org.apache.maven.plugins</groupId>
> > > >> >>>>>>>> +        <artifactId>maven-jxr-plugin</artifactId>
> > > >> >>>>>>>> +        <version>${jxr.plugin.version}</version>
> > > >> >>>>>>>> +        <reportSets>
> > > >> >>>>>>>> +          <reportSet>
> > > >> >>>>>>>> +            <id>non-aggregate</id>
> > > >> >>>>>>>> +            <reports>
> > > >> >>>>>>>> +              <report>jxr</report>
> > > >> >>>>>>>> +            </reports>
> > > >> >>>>>>>> +          </reportSet>
> > > >> >>>>>>>> +          <reportSet>
> > > >> >>>>>>>> +            <id>aggregate</id>
> > > >> >>>>>>>> +            <reports>
> > > >> >>>>>>>> +              <report>aggregate</report>
> > > >> >>>>>>>> +            </reports>
> > > >> >>>>>>>> +          </reportSet>
> > > >> >>>>>>>> +        </reportSets>
> > > >> >>>>>>>> +      </plugin>
> > > >> >>>>>>>> +      <plugin>
> > > >> >>>>>>>> +        <groupId>org.apache.maven.plugins</groupId>
> > > >> >>>>>>>> +        <artifactId>maven-pmd-plugin</artifactId>
> > > >> >>>>>>>> +        <version>${pmd.plugin.version}</version>
> > > >> >>>>>>>> +        <configuration>
> > > >> >>>>>>>> +          <targetJdk>${maven.compiler.target}</targetJdk>
> > > >> >>>>>>>> +        </configuration>
> > > >> >>>>>>>> +      </plugin>
> > > >> >>>>>>>> +    </plugins>
> > > >> >>>>>>>> +  </reporting>
> > > >> >>>>>>>> +</project>
> > > >> >>>>>>>>
> > > >> >>>>>>>> http://git-wip-us.apache.org/
> repos/asf/logging-log4j2/blob/
> > > >> >>>>>> 639f093b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/
> > > >> >>>>>> log4j/core/appender/db/jdbc/PoolingDriverConnectionSource.
> java
> > > >> >>>>>>>> ------------------------------
> ------------------------------
> > > >> >>>> ----------
> > > >> >>>>>>>> diff --git
> > > >> a/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/
> > > >> >>>>>> core/appender/db/jdbc/PoolingDriverConnectionSource.java
> > > >> >>>>>> b/log4j-jdbc-dbcp2/src/main/java/org/apache/logging/log4j/
> > > >> >>>>>> core/appender/db/jdbc/PoolingDriverConnectionSource.java
> > > >> >>>>>>>> new file mode 100644
> > > >> >>>>>>>> index 0000000..80adbb3
> > > >> >>>>>>>> --- /dev/null
> > > >> >>>>>>>> +++ b/log4j-jdbc-dbcp2/src/main/
> > java/org/apache/logging/log4j/
> > > >> >>>>>> core/appender/db/jdbc/PoolingDriverConnectionSource.java
> > > >> >>>>>>>> @@ -0,0 +1,155 @@
> > > >> >>>>>>>> +/*
> > > >> >>>>>>>> + * 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.core.appender.db.jdbc;
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +import java.sql.DriverManager;
> > > >> >>>>>>>> +import java.sql.SQLException;
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +import org.apache.commons.dbcp2.ConnectionFactory;
> > > >> >>>>>>>> +import org.apache.commons.dbcp2.
> > > DriverManagerConnectionFactory;
> > > >> >>>>>>>> +import org.apache.commons.dbcp2.PoolableConnection;
> > > >> >>>>>>>> +import org.apache.commons.dbcp2.
> PoolableConnectionFactory;
> > > >> >>>>>>>> +import org.apache.commons.dbcp2.PoolingDriver;
> > > >> >>>>>>>> +import org.apache.commons.pool2.ObjectPool;
> > > >> >>>>>>>> +import org.apache.commons.pool2.impl.GenericObjectPool;
> > > >> >>>>>>>> +import org.apache.logging.log4j.core.Core;
> > > >> >>>>>>>> +import org.apache.logging.log4j.core.config.Property;
> > > >> >>>>>>>> +import org.apache.logging.log4j.core.
> config.plugins.Plugin;
> > > >> >>>>>>>> +import org.apache.logging.log4j.core.config.plugins.
> > > >> >>>>>> PluginBuilderFactory;
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +/**
> > > >> >>>>>>>> + * A {@link ConnectionSource} that uses a JDBC connection
> > > >> string, a
> > > >> >>>>>> user name, and a password to call
> > > >> >>>>>>>> + * {@link DriverManager#getConnection(String, String,
> > > String)}.
> > > >> The
> > > >> >>>>>> connections are served from an
> > > >> >>>>>>>> + * <a href="http://commons.apache.
> org/proper/commons-dbcp/
> > > >> ">Apache
> > > >> >>>>>> Commons DBCP</a> pooling driver.
> > > >> >>>>>>>> + */
> > > >> >>>>>>>> +@Plugin(name = "PoolingDriver", category =
> > Core.CATEGORY_NAME,
> > > >> >>>>>> elementType = "connectionSource", printObject = true)
> > > >> >>>>>>>> +public final class PoolingDriverConnectionSource extends
> > > >> >>>>>> DriverManagerConnectionSource {
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    /**
> > > >> >>>>>>>> +     * Builds PoolingDriverConnectionSource instances.
> > > >> >>>>>>>> +     *
> > > >> >>>>>>>> +     * @param <B>
> > > >> >>>>>>>> +     *            This builder type or a subclass.
> > > >> >>>>>>>> +     */
> > > >> >>>>>>>> +    public static class Builder<B extends Builder<B>>
> > > >> >>>>>>>> +            extends DriverManagerConnectionSource.
> > Builder<B,
> > > >> >>>>>> PoolingDriverConnectionSource> {
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +        public static final String DEFAULT_POOL_NAME =
> > > >> "example";
> > > >> >>>>>>>> +        private String poolName = DEFAULT_POOL_NAME;
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +        @Override
> > > >> >>>>>>>> +        public PoolingDriverConnectionSource build() {
> > > >> >>>>>>>> +            try {
> > > >> >>>>>>>> +                return new PoolingDriverConnectionSource(
> > > >> >>>> getDriverClassName(),
> > > >> >>>>>> getConnectionString(), getUserName(),
> > > >> >>>>>>>> +                        getPassword(), getProperties(),
> > > >> poolName);
> > > >> >>>>>>>> +            } catch (final SQLException e) {
> > > >> >>>>>>>> +                getLogger().error("Exception constructing
> {}
> > > >> for {}",
> > > >> >>>>>> PoolingDriverConnectionSource.class,
> > > >> >>>>>>>> +                        getConnectionString(), e);
> > > >> >>>>>>>> +                return null;
> > > >> >>>>>>>> +            }
> > > >> >>>>>>>> +        }
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +        public B setPoolName(final String poolName) {
> > > >> >>>>>>>> +            this.poolName = poolName;
> > > >> >>>>>>>> +            return asBuilder();
> > > >> >>>>>>>> +        }
> > > >> >>>>>>>> +    }
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    public static final String URL_PREFIX =
> > > >> >>>>>> "jdbc:apache:commons:dbcp:";
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    // This method is not named newBuilder() to make the
> > > >> compiler
> > > >> >>>>>> happy.
> > > >> >>>>>>>> +    @PluginBuilderFactory
> > > >> >>>>>>>> +    public static <B extends Builder<B>> B
> > > >> >>>>>> newPoolingDriverConnectionSourceBuilder() {
> > > >> >>>>>>>> +        return new Builder<B>().asBuilder();
> > > >> >>>>>>>> +    }
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    private final String poolingDriverClassName =
> > > >> >>>>>> "org.apache.commons.dbcp2.PoolingDriver";
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    private final String poolName;
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    public PoolingDriverConnectionSource(final String
> > > >> >>>>>> driverClassName, final String connectionString,
> > > >> >>>>>>>> +            final char[] userName, final char[] password,
> > > final
> > > >> >>>>>> Property[] properties, final String poolName)
> > > >> >>>>>>>> +            throws SQLException {
> > > >> >>>>>>>> +        super(driverClassName, connectionString,
> URL_PREFIX
> > +
> > > >> >>>>>> poolName, userName, password, properties);
> > > >> >>>>>>>> +        this.poolName = poolName;
> > > >> >>>>>>>> +        setupDriver(connectionString);
> > > >> >>>>>>>> +    }
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    @Override
> > > >> >>>>>>>> +    public String getActualConnectionString() {
> > > >> >>>>>>>> +        // TODO Auto-generated method stub
> > > >> >>>>>>>> +        return super.getActualConnectionString();
> > > >> >>>>>>>> +    }
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    private PoolingDriver getPoolingDriver() throws
> > > >> SQLException {
> > > >> >>>>>>>> +        final PoolingDriver driver = (PoolingDriver)
> > > >> >>>>>> DriverManager.getDriver(URL_PREFIX);
> > > >> >>>>>>>> +        if (driver == null) {
> > > >> >>>>>>>> +            getLogger().error("No JDBC driver for {}",
> > > >> URL_PREFIX);
> > > >> >>>>>>>> +        }
> > > >> >>>>>>>> +        return driver;
> > > >> >>>>>>>> +    }
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    private void setupDriver(final String
> connectionString)
> > > >> throws
> > > >> >>>>>> SQLException {
> > > >> >>>>>>>> +        //
> > > >> >>>>>>>> +        // First, we'll create a ConnectionFactory that
> the
> > > >> >>>>>>>> +        // pool will use to create Connections.
> > > >> >>>>>>>> +        // We'll use the DriverManagerConnectionFactory,
> > > >> >>>>>>>> +        // using the connect string passed in the command
> > line
> > > >> >>>>>>>> +        // arguments.
> > > >> >>>>>>>> +        //
> > > >> >>>>>>>> +        final ConnectionFactory connectionFactory = new
> > > >> >>>>>> DriverManagerConnectionFactory(connectionString, null);
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +        //
> > > >> >>>>>>>> +        // Next, we'll create the
> PoolableConnectionFactory,
> > > >> which
> > > >> >>>>>> wraps
> > > >> >>>>>>>> +        // the "real" Connections created by the
> > > >> ConnectionFactory
> > > >> >>>> with
> > > >> >>>>>>>> +        // the classes that implement the pooling
> > > functionality.
> > > >> >>>>>>>> +        //
> > > >> >>>>>>>> +        final PoolableConnectionFactory
> > > >> poolableConnectionFactory =
> > > >> >>>>>> new PoolableConnectionFactory(connectionFactory,
> > > >> >>>>>>>> +                null);
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +        //
> > > >> >>>>>>>> +        // Now we'll need a ObjectPool that serves as the
> > > >> >>>>>>>> +        // actual pool of connections.
> > > >> >>>>>>>> +        //
> > > >> >>>>>>>> +        // We'll use a GenericObjectPool instance,
> although
> > > >> >>>>>>>> +        // any ObjectPool implementation will suffice.
> > > >> >>>>>>>> +        //
> > > >> >>>>>>>> +        @SuppressWarnings("resource")
> > > >> >>>>>>>> +        // This GenericObjectPool will be closed on
> shutown
> > > >> >>>>>>>> +        final ObjectPool<PoolableConnection>
> connectionPool
> > =
> > > >> new
> > > >> >>>>>> GenericObjectPool<>(poolableConnectionFactory);
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +        // Set the factory's pool property to the owning
> > pool
> > > >> >>>>>>>> +        poolableConnectionFactory.
> setPool(connectionPool);
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +        loadDriver(poolingDriverClassName);
> > > >> >>>>>>>> +        final PoolingDriver driver = getPoolingDriver();
> > > >> >>>>>>>> +        if (driver != null) {
> > > >> >>>>>>>> +            driver.registerPool(poolName, connectionPool);
> > > >> >>>>>>>> +        }
> > > >> >>>>>>>> +        //
> > > >> >>>>>>>> +        // Now we can just use the connect string
> > > >> >>>>>> "jdbc:apache:commons:dbcp:example"
> > > >> >>>>>>>> +        // to access our pool of Connections.
> > > >> >>>>>>>> +        //
> > > >> >>>>>>>> +    }
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    public void shutdownDriver() throws SQLException {
> > > >> >>>>>>>> +        final PoolingDriver driver = getPoolingDriver();
> > > >> >>>>>>>> +        if (driver != null) {
> > > >> >>>>>>>> +            driver.closePool(poolName);
> > > >> >>>>>>>> +        }
> > > >> >>>>>>>> +    }
> > > >> >>>>>>>> +}
> > > >> >>>>>>>>
> > > >> >>>>>>>> http://git-wip-us.apache.org/
> repos/asf/logging-log4j2/blob/
> > > >> >>>>>> 639f093b/log4j-jdbc-dbcp2/src/site/manual/index.md
> > > >> >>>>>>>> ------------------------------
> ------------------------------
> > > >> >>>> ----------
> > > >> >>>>>>>> diff --git a/log4j-jdbc-dbcp2/src/site/manual/index.md
> > > >> >>>>>> b/log4j-jdbc-dbcp2/src/site/manual/index.md
> > > >> >>>>>>>> new file mode 100644
> > > >> >>>>>>>> index 0000000..b7fb5a5
> > > >> >>>>>>>> --- /dev/null
> > > >> >>>>>>>> +++ b/log4j-jdbc-dbcp2/src/site/manual/index.md
> > > >> >>>>>>>> @@ -0,0 +1,35 @@
> > > >> >>>>>>>> +<!-- vim: set syn=markdown : -->
> > > >> >>>>>>>> +<!--
> > > >> >>>>>>>> +    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.
> > > >> >>>>>>>> +-->
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +# Log4j 2 JDBC Connection Source with Apache Commons DBCP
> 2
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +This module adds a connection source for JDBC Appenders.
> The
> > > >> >>>>>> PoolingDriverConnectionSource
> > > >> >>>>>>>> +provides connection pooling through Apache Commons DBCP 2.
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +## Requirements
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +This module was introduced in Log4j 2.11.0 and requires
> > Apache
> > > >> >>>> Commons
> > > >> >>>>>> DBCP 2 to provide
> > > >> >>>>>>>> +connection pooling.
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +Some features may require optional
> > > >> >>>>>>>> +[dependencies](../runtime-dependencies.html). These
> > > >> dependencies are
> > > >> >>>>>> specified in the
> > > >> >>>>>>>> +documentation for those features.
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +Some Log4j features require external dependencies.
> > > >> >>>>>>>> +See the [Dependency Tree](dependencies.html#
> > Dependency_Tree)
> > > >> >>>>>>>> +for the exact list of JAR files needed for these features.
> > > >> >>>>>>>>
> > > >> >>>>>>>> http://git-wip-us.apache.org/
> repos/asf/logging-log4j2/blob/
> > > >> >>>>>> 639f093b/log4j-jdbc-dbcp2/src/site/site.xml
> > > >> >>>>>>>> ------------------------------
> ------------------------------
> > > >> >>>> ----------
> > > >> >>>>>>>> diff --git a/log4j-jdbc-dbcp2/src/site/site.xml
> > > >> >>>>>> b/log4j-jdbc-dbcp2/src/site/site.xml
> > > >> >>>>>>>> new file mode 100644
> > > >> >>>>>>>> index 0000000..6d4cddc
> > > >> >>>>>>>> --- /dev/null
> > > >> >>>>>>>> +++ b/log4j-jdbc-dbcp2/src/site/site.xml
> > > >> >>>>>>>> @@ -0,0 +1,52 @@
> > > >> >>>>>>>> +<!--
> > > >> >>>>>>>> + 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 name="Log4j Core"
> > > >> >>>>>>>> +         xmlns="http://maven.apache.org/DECORATION/1.4.0";
> > > >> >>>>>>>> +         xmlns:xsi="http://www.w3.org/
> > 2001/XMLSchema-instance
> > > "
> > > >> >>>>>>>> +         xsi:schemaLocation="
> > > >> http://maven.apache.org/DECORATION/1.
> > > >> >>>> 4.0
> > > >> >>>>>> http://maven.apache.org/xsd/decoration-1.4.0.xsd";>
> > > >> >>>>>>>> +  <body>
> > > >> >>>>>>>> +    <links>
> > > >> >>>>>>>> +      <item name="Apache" href="http://www.apache.org/";
> />
> > > >> >>>>>>>> +      <item name="Logging Services" href="
> > > >> http://logging.apache.org/
> > > >> >>>>>> "/>
> > > >> >>>>>>>> +      <item name="Log4j" href="../index.html"/>
> > > >> >>>>>>>> +    </links>
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    <!-- Component-specific reports -->
> > > >> >>>>>>>> +    <menu ref="reports"/>
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    <!-- Overall Project Info -->
> > > >> >>>>>>>> +    <menu name="Log4j Project Information"
> > > img="icon-info-sign">
> > > >> >>>>>>>> +      <item name="Dependencies"
> href="../dependencies.html"
> > />
> > > >> >>>>>>>> +      <item name="Dependency Convergence"
> > href="../dependency-
> > > >> >>>> convergence.html"
> > > >> >>>>>> />
> > > >> >>>>>>>> +      <item name="Dependency Management"
> > href="../dependency-
> > > >> >>>> management.html"
> > > >> >>>>>> />
> > > >> >>>>>>>> +      <item name="Project Team" href="../team-list.html"
> />
> > > >> >>>>>>>> +      <item name="Mailing Lists" href="../mail-lists.html"
> > />
> > > >> >>>>>>>> +      <item name="Issue Tracking"
> > > href="../issue-tracking.html"
> > > >> />
> > > >> >>>>>>>> +      <item name="Project License" href="../license.html"
> />
> > > >> >>>>>>>> +      <item name="Source Repository"
> > > href="../source-repository.
> > > >> >>>> html"
> > > >> >>>>>> />
> > > >> >>>>>>>> +      <item name="Project Summary"
> > > >> href="../project-summary.html" />
> > > >> >>>>>>>> +    </menu>
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    <menu name="Log4j Project Reports" img="icon-cog">
> > > >> >>>>>>>> +      <item name="Changes Report"
> > > href="../changes-report.html"
> > > >> />
> > > >> >>>>>>>> +      <item name="JIRA Report" href="../jira-report.html"
> />
> > > >> >>>>>>>> +      <item name="Surefire Report"
> > > >> href="../surefire-report.html" />
> > > >> >>>>>>>> +      <item name="RAT Report" href="../rat-report.html" />
> > > >> >>>>>>>> +    </menu>
> > > >> >>>>>>>> +  </body>
> > > >> >>>>>>>> +</project>
> > > >> >>>>>>>>
> > > >> >>>>>>>> http://git-wip-us.apache.org/
> repos/asf/logging-log4j2/blob/
> > > >> >>>>>> 639f093b/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/
> > > >> >>>>>> log4j/core/appender/db/jdbc/PoolingDriverConnectionSourceT
> > > est.java
> > > >> >>>>>>>> ------------------------------
> ------------------------------
> > > >> >>>> ----------
> > > >> >>>>>>>> diff --git
> > > >> a/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/
> > > >> >>>>>> core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java
> > > >> >>>>>> b/log4j-jdbc-dbcp2/src/test/java/org/apache/logging/log4j/
> > > >> >>>>>> core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java
> > > >> >>>>>>>> new file mode 100644
> > > >> >>>>>>>> index 0000000..2b7b886
> > > >> >>>>>>>> --- /dev/null
> > > >> >>>>>>>> +++ b/log4j-jdbc-dbcp2/src/test/
> > java/org/apache/logging/log4j/
> > > >> >>>>>> core/appender/db/jdbc/PoolingDriverConnectionSourceTest.java
> > > >> >>>>>>>> @@ -0,0 +1,96 @@
> > > >> >>>>>>>> +/*
> > > >> >>>>>>>> + * 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.core.appender.db.jdbc;
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +import java.sql.Connection;
> > > >> >>>>>>>> +import java.sql.SQLException;
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +import org.apache.logging.log4j.core.config.Property;
> > > >> >>>>>>>> +import org.junit.Assert;
> > > >> >>>>>>>> +import org.junit.Test;
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +public class PoolingDriverConnectionSourceTest {
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    @Test
> > > >> >>>>>>>> +    public void testH2Properties() throws SQLException {
> > > >> >>>>>>>> +        final Property[] properties = new Property[] {
> > > >> >>>>>>>> +                // @formatter:off
> > > >> >>>>>>>> +                Property.createProperty("username",
> > > >> >>>>>> JdbcH2TestHelper.USER_NAME),
> > > >> >>>>>>>> +                Property.createProperty("password",
> > > >> >>>>>> JdbcH2TestHelper.PASSWORD),
> > > >> >>>>>>>> +                // @formatter:on
> > > >> >>>>>>>> +        };
> > > >> >>>>>>>> +        // @formatter:off
> > > >> >>>>>>>> +        final PoolingDriverConnectionSource source =
> > > >> >>>>>>
> > > >> PoolingDriverConnectionSource.newPoolingDriverConnectionSour
> > ceBuilder()
> > > >> >>>>>>>> +
> > > >> .setConnectionString(JdbcH2TestHelper.CONNECTION_STRING)
> > > >> >>>>>>>> +            .setProperties(properties)
> > > >> >>>>>>>> +            .build();
> > > >> >>>>>>>> +        // @formatter:on
> > > >> >>>>>>>> +        try (Connection conn = source.getConnection()) {
> > > >> >>>>>>>> +            Assert.assertFalse(conn.isClosed());
> > > >> >>>>>>>> +        }
> > > >> >>>>>>>> +    }
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    @Test
> > > >> >>>>>>>> +    public void testH2PropertiesAndPoolName() throws
> > > >> SQLException {
> > > >> >>>>>>>> +        final Property[] properties = new Property[] {
> > > >> >>>>>>>> +                // @formatter:off
> > > >> >>>>>>>> +                Property.createProperty("username",
> > > >> >>>>>> JdbcH2TestHelper.USER_NAME),
> > > >> >>>>>>>> +                Property.createProperty("password",
> > > >> >>>>>> JdbcH2TestHelper.PASSWORD),
> > > >> >>>>>>>> +                // @formatter:on
> > > >> >>>>>>>> +        };
> > > >> >>>>>>>> +        // @formatter:off
> > > >> >>>>>>>> +        final PoolingDriverConnectionSource source =
> > > >> >>>>>>
> > > >> PoolingDriverConnectionSource.newPoolingDriverConnectionSour
> > ceBuilder()
> > > >> >>>>>>>> +
> > > >> .setConnectionString(JdbcH2TestHelper.CONNECTION_STRING)
> > > >> >>>>>>>> +            .setProperties(properties)
> > > >> >>>>>>>> +            .setPoolName("MyPoolName")
> > > >> >>>>>>>> +            .build();
> > > >> >>>>>>>> +        // @formatter:on
> > > >> >>>>>>>> +        try (Connection conn = source.getConnection()) {
> > > >> >>>>>>>> +            Assert.assertFalse(conn.isClosed());
> > > >> >>>>>>>> +        }
> > > >> >>>>>>>> +    }
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    @Test
> > > >> >>>>>>>> +    public void testH2UserAndPassword() throws
> SQLException
> > {
> > > >> >>>>>>>> +        // @formatter:off
> > > >> >>>>>>>> +        final PoolingDriverConnectionSource source =
> > > >> >>>>>>
> > > >> PoolingDriverConnectionSource.newPoolingDriverConnectionSour
> > ceBuilder()
> > > >> >>>>>>>> +
> > > >> .setConnectionString(JdbcH2TestHelper.CONNECTION_STRING)
> > > >> >>>>>>>> +
> > > >> .setUserName(JdbcH2TestHelper.USER_NAME.toCharArray())
> > > >> >>>>>>>> +
> > > >> .setPassword(JdbcH2TestHelper.PASSWORD.toCharArray())
> > > >> >>>>>>>> +            .build();
> > > >> >>>>>>>> +        // @formatter:on
> > > >> >>>>>>>> +        try (Connection conn = source.getConnection()) {
> > > >> >>>>>>>> +            Assert.assertFalse(conn.isClosed());
> > > >> >>>>>>>> +        }
> > > >> >>>>>>>> +    }
> > > >> >>>>>>>> +
> > > >> >>>>>>>> +    @Test
> > > >> >>>>>>>> +    public void testH2UserPasswordAndPoolName() throws
> > > >> SQLException
> > > >> >>>> {
> > > >> >>>>>>>> +        // @formatter:off
> > > >> >>>>>>>> +        final PoolingDriverConnectionSource source =
> > > >> >>>>>>
> > > >> PoolingDriverConnectionSource.newPoolingDriverConnectionSour
> > ceBuilder()
> > > >> >>>>>>>> +
> > > >> .setConnectionString(JdbcH2TestHelper.CONNECTION_STRING)
> > > >> >>>>>>>> +
> > > >> .setUserName(JdbcH2TestHelper.USER_NAME.toCharArray())
> > > >> >>>>>>>> +
> > > >> .setPassword(JdbcH2TestHelper.PASSWORD.toCharArray())
> > > >> >>>>>>>> +            .setPoolName("MyPoolName")
> > > >> >>>>>>>> +            .build();
> > > >> >>>>>>>> +        // @formatter:on
> > > >> >>>>>>>> +        try (Connection conn = source.getConnection()) {
> > > >> >>>>>>>> +            Assert.assertFalse(conn.isClosed());
> > > >> >>>>>>>> +        }
> > > >> >>>>>>>> +    }
> > > >> >>>>>>>> +}
> > > >> >>>>>>>>
> > > >> >>>>>>>> http://git-wip-us.apache.org/
> repos/asf/logging-log4j2/blob/
> > > >> >>>>>> 639f093b/pom.xml
> > > >> >>>>>>>> ------------------------------
> ------------------------------
> > > >> >>>> ----------
> > > >> >>>>>>>> diff --git a/pom.xml b/pom.xml
> > > >> >>>>>>>> index 31195f2..f1027f2 100644
> > > >> >>>>>>>> --- a/pom.xml
> > > >> >>>>>>>> +++ b/pom.xml
> > > >> >>>>>>>> @@ -1320,6 +1320,7 @@
> > > >> >>>>>>>>  <module>log4j-jmx-gui</module>
> > > >> >>>>>>>>  <module>log4j-samples</module>
> > > >> >>>>>>>>  <module>log4j-bom</module>
> > > >> >>>>>>>> +    <module>log4j-jdbc-dbcp2</module>
> > > >> >>>>>>>>  <module>log4j-couchdb</module>
> > > >> >>>>>>>>  <module>log4j-mongodb</module>
> > > >> >>>>>>>>  <module>log4j-cassandra</module>
> > > >> >>>>>>>>
> > > >> >>>>>>>> http://git-wip-us.apache.org/
> repos/asf/logging-log4j2/blob/
> > > >> >>>>>> 639f093b/src/changes/changes.xml
> > > >> >>>>>>>> ------------------------------
> ------------------------------
> > > >> >>>> ----------
> > > >> >>>>>>>> diff --git a/src/changes/changes.xml
> > b/src/changes/changes.xml
> > > >> >>>>>>>> index 3ca94e4..6398bb0 100644
> > > >> >>>>>>>> --- a/src/changes/changes.xml
> > > >> >>>>>>>> +++ b/src/changes/changes.xml
> > > >> >>>>>>>> @@ -104,6 +104,9 @@
> > > >> >>>>>>>>    <action issue="LOG4J2-2198" dev="ggregory"
> type="update">
> > > >> >>>>>>>>      Update MongoDB dependencies from classic to modern.
> > > >> >>>>>>>>    </action>
> > > >> >>>>>>>> +      <action issue="LOG4J2-2186" dev="ggregory"
> type="add">
> > > >> >>>>>>>> +        Add a JDBC ConnectionSource that provides pooling
> > > >> through
> > > >> >>>>>> Apache Commons DBCP 2.
> > > >> >>>>>>>> +      </action>
> > > >> >>>>>>>>  </release>
> > > >> >>>>>>>>  <release version="2.10.0" date="2017-11-18"
> description="GA
> > > >> Release
> > > >> >>>>>> 2.10.0">
> > > >> >>>>>>>>    <action issue="LOG4J2-2120" dev="mikes" type="add"
> > > >> due-to="Carter
> > > >> >>>>>> Douglas Kozak ">
> > > >> >>>>>>>>
> > > >> >>>>>>>> http://git-wip-us.apache.org/
> repos/asf/logging-log4j2/blob/
> > > >> >>>>>> 639f093b/src/site/xdoc/manual/appenders.xml
> > > >> >>>>>>>> ------------------------------
> ------------------------------
> > > >> >>>> ----------
> > > >> >>>>>>>> diff --git a/src/site/xdoc/manual/appenders.xml
> > > >> >>>> b/src/site/xdoc/manual/
> > > >> >>>>>> appenders.xml
> > > >> >>>>>>>> index c62a284..4f106df 100644
> > > >> >>>>>>>> --- a/src/site/xdoc/manual/appenders.xml
> > > >> >>>>>>>> +++ b/src/site/xdoc/manual/appenders.xml
> > > >> >>>>>>>> @@ -1070,9 +1070,10 @@ CREATE TABLE logs (
> > > >> >>>>>>>>        <p>When configuring the JDBCAppender, you must
> > specify a
> > > >> >>>>>> <code>ConnectionSource</code> implementation from
> > > >> >>>>>>>>          which the Appender gets JDBC connections. You must
> > use
> > > >> >>>>>> exactly one of the following nested elements:</p>
> > > >> >>>>>>>>        <ul>
> > > >> >>>>>>>> -            <li><a href="#JDBCDataSource"><code>&
> > > >> >>>>>> lt;DataSource&gt;</code></a></li>
> > > >> >>>>>>>> -            <li><a href="#JDBCConnectionFactory">
> > > >> >>>>>> <code>&lt;ConnectionFactory&gt;</code></a></li>
> > > >> >>>>>>>> -            <li><a href="#JDBCDriverManager"><
> > > >> >>>>>> code>&lt;DriverManager&gt;</code></a></li>
> > > >> >>>>>>>> +            <li><a href="#JDBCDataSource"><code>&
> > > >> >>>> lt;DataSource&gt;</code></a>:
> > > >> >>>>>> Uses JNDI.</li>
> > > >> >>>>>>>> +            <li><a href="#JDBCConnectionFactory">
> > > >> >>>>>> <code>&lt;ConnectionFactory&gt;</code></a>: Points to a
> > > >> class-method
> > > >> >>>> pair
> > > >> >>>>>> to provide JDBC connections.</li>
> > > >> >>>>>>>> +            <li><a href="#JDBCDriverManager"><
> > > >> >>>>>> code>&lt;DriverManager&gt;</code></a>: A quick and dirty way
> > to
> > > >> get off
> > > >> >>>>>> the ground, no connection pooling.</li>
> > > >> >>>>>>>> +            <li><a href="#JDBCPoolingDriver"><
> > > >> >>>>>> code>&lt;PoolingDriver&gt;</code></a>: Uses Apache Commons
> > DBCP
> > > to
> > > >> >>>>>> provide connection pooling.</li>
> > > >> >>>>>>>>        </ul>
> > > >> >>>>>>>>        <a name="JDBCDataSource"/>
> > > >> >>>>>>>>        <table>
> > > >> >>>>>>>> @@ -1149,6 +1150,27 @@ CREATE TABLE logs (
> > > >> >>>>>>>>            <td>A list of properties. You cannot specify
> both
> > > >> >>>>>> properties and a user name or password.</td>
> > > >> >>>>>>>>          </tr>
> > > >> >>>>>>>>        </table>
> > > >> >>>>>>>> +          <a name="JDBCPoolingDriver"/>
> > > >> >>>>>>>> +          <table>
> > > >> >>>>>>>> +            <caption align="top">PoolingDriver Parameters
> > > >> (Apache
> > > >> >>>>>> Commons DBCP)</caption>
> > > >> >>>>>>>> +            <tr>
> > > >> >>>>>>>> +              <th>Parameter Name</th>
> > > >> >>>>>>>> +              <th>Type</th>
> > > >> >>>>>>>> +              <th>Description</th>
> > > >> >>>>>>>> +            </tr>
> > > >> >>>>>>>> +            <tr>
> > > >> >>>>>>>> +              <td>DriverManager parameters</td>
> > > >> >>>>>>>> +              <td>DriverManager parameters</td>
> > > >> >>>>>>>> +              <td>This connection source inherits all
> > > parameter
> > > >> from
> > > >> >>>>>> the DriverManager connection source.</td>
> > > >> >>>>>>>> +            </tr>
> > > >> >>>>>>>> +            <tr>
> > > >> >>>>>>>> +              <td>poolName</td>
> > > >> >>>>>>>> +              <td>String</td>
> > > >> >>>>>>>> +              <td>The pool name used to pool JDBC
> > Connections.
> > > >> >>>>>> Defaults to <code>example</code>. You can use the JDBC
> > > >> >>>>>>>> +              connection string prefix
> > > >> <code>jdbc:apache:commons:
> > > >> >>>> dbcp:</code>
> > > >> >>>>>> followed by the pool name if you want
> > > >> >>>>>>>> +              to use a pooled connection elsewhere. For
> > > example:
> > > >> >>>>>> <code>jdbc:apache:commons:dbcp:example</code>.</td>
> > > >> >>>>>>>> +            </tr>
> > > >> >>>>>>>> +          </table>
> > > >> >>>>>>>>        <p>When configuring the JDBCAppender, use the nested
> > > >> >>>>>> <code>&lt;Column&gt;</code> elements to specify which
> > > >> >>>>>>>>          columns in the table should be written to and how
> to
> > > >> write
> > > >> >>>>>> to them. The JDBCAppender uses this information
> > > >> >>>>>>>>          to formulate a <code>PreparedStatement</code> to
> > > insert
> > > >> >>>>>> records without SQL injection vulnerability.</p>
> > > >> >>>>>>>>
> > > >> >>>>>>>>
> > > >> >>>>>>>
> > > >> >>>>>>>
> > > >> >>>>>>>
> > > >> >>>>>>
> > > >> >>>>>>
> > > >> >>>>>>
> > > >> >>>>
> > > >> >>>>
> > > >> >>>>
> > > >> >
> > > >> >
> > > >> >
> > > >>
> > > >>
> > >
> >
> >
> >
> > --
> > Matt Sicker <boa...@gmail.com>
> >
>



-- 
Matt Sicker <boa...@gmail.com>

Reply via email to