Author: gk
Date: Mon Nov  5 15:18:22 2018
New Revision: 1845811

URL: http://svn.apache.org/viewvc?rev=1845811&view=rev
Log:
- log4j.xml: applicationRoot in memory substitution, respect backslashes in 
windows systems
- proposal log4j2

Added:
    turbine/core/trunk/proposals/gk/
    turbine/core/trunk/proposals/gk/log4j2/
    turbine/core/trunk/proposals/gk/log4j2/conf/
    turbine/core/trunk/proposals/gk/log4j2/conf/log4j2.xml   (with props)
    turbine/core/trunk/proposals/gk/log4j2/conf/test/
    turbine/core/trunk/proposals/gk/log4j2/conf/test/log4j2-test.xml   (with 
props)
    turbine/core/trunk/proposals/gk/log4j2/conf/test/log4j2.xml   (with props)
    turbine/core/trunk/proposals/gk/log4j2/pom.xml   (with props)
    turbine/core/trunk/proposals/gk/log4j2/src/
    turbine/core/trunk/proposals/gk/log4j2/src/java/
    turbine/core/trunk/proposals/gk/log4j2/src/java/org/
    turbine/core/trunk/proposals/gk/log4j2/src/java/org/apache/
    turbine/core/trunk/proposals/gk/log4j2/src/java/org/apache/turbine/
    
turbine/core/trunk/proposals/gk/log4j2/src/java/org/apache/turbine/Turbine.java 
  (with props)
Modified:
    turbine/core/trunk/src/java/org/apache/turbine/Turbine.java

Added: turbine/core/trunk/proposals/gk/log4j2/conf/log4j2.xml
URL: 
http://svn.apache.org/viewvc/turbine/core/trunk/proposals/gk/log4j2/conf/log4j2.xml?rev=1845811&view=auto
==============================================================================
--- turbine/core/trunk/proposals/gk/log4j2/conf/log4j2.xml (added)
+++ turbine/core/trunk/proposals/gk/log4j2/conf/log4j2.xml Mon Nov  5 15:18:22 
2018
@@ -0,0 +1,56 @@
+<?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.
+-->
+<Configuration >
+    <Appenders>
+        <Console name="console" target="SYSTEM_OUT">
+             <PatternLayout pattern="%d [%t] %-5p %c - %m%n"/>
+           </Console>
+           <File name="avalon" fileName="${web:rootDir}/logs/avalon.log">
+             <PatternLayout pattern="%d [%t] %-5p %c - %m%n"/>
+           </File>
+            <File name="torque" fileName="${web:rootDir}/logs/torque.log">
+          <PatternLayout pattern="%d [%t] %-5p %c - %m%n"/>
+        </File>
+         <File name="turbine" fileName="${web:rootDir}/logs/turbine.log">
+          <PatternLayout pattern="%d [%t] %-5p %c - %m%n"/>
+        </File>
+          <File name="velocity" fileName="${web:rootDir}/logs/velocity.log">
+          <PatternLayout pattern="%d [%t] %-5p %c - %m%n"/>
+        </File>
+    </Appenders>
+    <Loggers>
+            <Logger name="avalon" level="info" additivity="false">
+             <AppenderRef ref="avalon"/>
+           </Logger>
+            <Logger name="org.apache.torque" level="info" additivity="false">
+          <AppenderRef ref="torque"/>
+        </Logger>
+         <Logger name="scheduler" level="info" additivity="false">
+          <AppenderRef ref="scheduler"/>
+        </Logger>
+         <Logger name="org.apache.turbine" level="info" additivity="false">
+          <AppenderRef ref="turbine"/>
+          <AppenderRef ref="console"/>
+        </Logger>
+           <Root level="info">
+             <AppenderRef ref="turbine"/>
+           </Root>
+    </Loggers>
+</Configuration>
\ No newline at end of file

Propchange: turbine/core/trunk/proposals/gk/log4j2/conf/log4j2.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: turbine/core/trunk/proposals/gk/log4j2/conf/test/log4j2-test.xml
URL: 
http://svn.apache.org/viewvc/turbine/core/trunk/proposals/gk/log4j2/conf/test/log4j2-test.xml?rev=1845811&view=auto
==============================================================================
--- turbine/core/trunk/proposals/gk/log4j2/conf/test/log4j2-test.xml (added)
+++ turbine/core/trunk/proposals/gk/log4j2/conf/test/log4j2-test.xml Mon Nov  5 
15:18:22 2018
@@ -0,0 +1,37 @@
+<?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.
+-->
+<Configuration >
+    <Appenders>
+        <Console name="console" target="SYSTEM_OUT">
+             <PatternLayout pattern="%d [%t] %-5p %c - %m%n"/>
+           </Console>
+           <File name="logfile" fileName="target/turbine.log">
+             <PatternLayout pattern="%d [%t] %-5p %c - %m%n"/>
+           </File>
+    </Appenders>
+    <Loggers>
+         <Logger name="org.apache.turbine" level="debug" additivity="false">
+          <AppenderRef ref="logfile"/>
+        </Logger>
+           <Root level="error">
+             <AppenderRef ref="logfile"/>
+           </Root>
+    </Loggers>
+</Configuration>
\ No newline at end of file

Propchange: turbine/core/trunk/proposals/gk/log4j2/conf/test/log4j2-test.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: turbine/core/trunk/proposals/gk/log4j2/conf/test/log4j2.xml
URL: 
http://svn.apache.org/viewvc/turbine/core/trunk/proposals/gk/log4j2/conf/test/log4j2.xml?rev=1845811&view=auto
==============================================================================
--- turbine/core/trunk/proposals/gk/log4j2/conf/test/log4j2.xml (added)
+++ turbine/core/trunk/proposals/gk/log4j2/conf/test/log4j2.xml Mon Nov  5 
15:18:22 2018
@@ -0,0 +1,37 @@
+<?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.
+-->
+<Configuration >
+    <Appenders>
+        <Console name="console" target="SYSTEM_OUT">
+             <PatternLayout pattern="%d [%t] %-5p %c - %m%n"/>
+           </Console>
+           <File name="logfile" 
fileName="${applicationRoot}target/turbine.log">
+             <PatternLayout pattern="%d [%t] %-5p %c - %m%n"/>
+           </File>
+    </Appenders>
+    <Loggers>
+         <Logger name="org.apache.turbine" level="debug" additivity="false">
+          <AppenderRef ref="logfile"/>
+        </Logger>
+           <Root level="error">
+             <AppenderRef ref="logfile"/>
+           </Root>
+    </Loggers>
+</Configuration>
\ No newline at end of file

Propchange: turbine/core/trunk/proposals/gk/log4j2/conf/test/log4j2.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: turbine/core/trunk/proposals/gk/log4j2/pom.xml
URL: 
http://svn.apache.org/viewvc/turbine/core/trunk/proposals/gk/log4j2/pom.xml?rev=1845811&view=auto
==============================================================================
--- turbine/core/trunk/proposals/gk/log4j2/pom.xml (added)
+++ turbine/core/trunk/proposals/gk/log4j2/pom.xml Mon Nov  5 15:18:22 2018
@@ -0,0 +1,1186 @@
+<?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/maven-v4_0_0.xsd";>
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+     <groupId>org.apache.turbine</groupId>
+     <artifactId>turbine-parent</artifactId>
+     <version>5</version>
+  </parent>
+  <groupId>org.apache.turbine</groupId>
+  <artifactId>turbine</artifactId>
+  <name>Apache Turbine</name>
+  <version>5.0-SNAPSHOT</version>
+  <description>Turbine is a servlet based framework that allows experienced 
Java
+    developers to quickly build secure web applications. Parts of Turbine
+    can also be used independently of the web portion of Turbine as
+    well. In other words, we strive to make portions of Turbine easily
+    available for use in other applications.</description>
+
+  <url>http://turbine.apache.org/${turbine.site.path}</url>
+
+  <inceptionYear>2000</inceptionYear>
+
+  <developers>
+    <developer>
+      <id>brekke</id>
+      <name>Jeff Brekke</name>
+      <email>ekke...@yahoo.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </developer>
+    <developer>
+      <id>hoffmann</id>
+      <name>Jürgen Hoffmann</name>
+      <email>hoffm...@apache.org</email>
+      <url />
+      <organization />
+      <timezone />
+    </developer>
+    <developer>
+      <id>daveb</id>
+      <name>Dave Bryson</name>
+      <email>mbry...@mont.mindspring.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </developer>
+    <developer>
+      <id>burton</id>
+      <name>Kevin A. Burton</name>
+      <email>bur...@relativity.yi.org</email>
+      <url />
+      <organization />
+      <timezone />
+    </developer>
+    <developer>
+      <id>dobbs</id>
+      <name>Eric Dobbs</name>
+      <email>do...@apache.org</email>
+      <url />
+      <organization />
+      <timezone />
+    </developer>
+    <developer>
+      <id>seade</id>
+      <name>Scott Eade</name>
+      <email>se...@backstagetech.com.au</email>
+      <url />
+      <organization>Backstage Technologies Pty. Ltd.</organization>
+      <timezone />
+    </developer>
+    <developer>
+      <id>fedor</id>
+      <name>Fedor Karpelevitch</name>
+      <email>fe...@karpelevitch.net</email>
+      <url />
+      <organization />
+      <timezone />
+    </developer>
+    <developer>
+      <id>legassick</id>
+      <name>Sean Legassick</name>
+      <email>s...@informage.net</email>
+      <url />
+      <organization />
+      <timezone />
+    </developer>
+    <developer>
+      <id>jmcnally</id>
+      <name>John McNally</name>
+      <email>jmcna...@collab.net</email>
+      <url />
+      <organization>CollabNet, Inc.</organization>
+      <timezone />
+    </developer>
+    <developer>
+      <id>quintonm</id>
+      <name>Quinton McCombs</name>
+      <email>quint...@bellsouth.net</email>
+      <url />
+      <organization>NEqualsOne</organization>
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+      <timezone />
+    </developer>
+    <developer>
+      <id>painter</id>
+      <name>Jeffery Painter</name>
+      <email>j...@jivecast.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </developer>
+    <developer>
+      <id>mpoeschl</id>
+      <name>Martin Poeschl</name>
+      <email>mpoes...@marmot.at</email>
+      <url />
+      <organization>tucana.at</organization>
+      <timezone />
+    </developer>
+    <developer>
+      <id>epugh</id>
+      <name>Eric Pugh</name>
+      <email>ep...@upstate.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </developer>
+    <developer>
+      <id>dlr</id>
+      <name>Daniel Rall</name>
+      <email>d...@finemaltcoding.com</email>
+      <url />
+      <organization>CollabNet, Inc.</organization>
+      <timezone />
+    </developer>
+    <developer>
+      <id>henning</id>
+      <name>Henning P. Schmiedehausen</name>
+      <email>h...@intermeta.de</email>
+      <url />
+      <organization>INTERMETA - Gesellschaft fuer Mehrwertdienste 
mbH</organization>
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+      <timezone>1</timezone>
+    </developer>
+    <developer>
+      <id>kschrader</id>
+      <name>Kurt Schrader</name>
+      <email>kschra...@karmalab.org</email>
+      <url />
+      <organization>University of Michigan</organization>
+      <timezone />
+    </developer>
+    <developer>
+      <id>jon</id>
+      <name>Jon Scott Stevens</name>
+      <email>j...@latchkey.com</email>
+      <url />
+      <organization>CollabNet, Inc.</organization>
+      <timezone />
+    </developer>
+    <developer>
+      <name>Thomas Vandahl</name>
+      <id>tv</id>
+      <email>t...@apache.org</email>
+      <organization />
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+      <timezone>1</timezone>
+    </developer>
+    <developer>
+      <name>Ludwig Magnusson</name>
+      <id>ludwig</id>
+      <email>lud...@apache.org</email>
+      <organization />
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+      <timezone>1</timezone>
+    </developer>
+    <developer>
+      <name>Georg Kallidis</name>
+      <id>gk</id>
+      <email>g...@apache.org</email>
+      <organization />
+      <roles>
+        <role>Java Developer</role>
+      </roles>
+      <timezone>1</timezone>
+    </developer>
+  </developers>
+  <contributors>
+    <contributor>
+      <name>Gary Bartlett</name>
+      <email>gary_a_bartl...@yahoo.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Youngho Cho</name>
+      <email>youn...@nannet.co.kr</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Frank Conradie</name>
+      <email>fr...@opticode.co.za</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Gonzalo A. Diethelm</name>
+      <email>gonzalo.dieth...@iname.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>David Duddleston</name>
+      <email>da...@i2a.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Christopher Elkins</name>
+      <email>celk...@scardini.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>M. Sean Gilligan</name>
+      <email>sean_gilli...@catalla.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Jian He</name>
+      <email>hj...@163.net</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Humberto Hernandez</name>
+      <email>hhernan...@itweb.com.mx</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Nissim Karpenstein</name>
+      <email>nis...@nksystems.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Rafal Krzewski</name>
+      <email>krzew...@e-point.pl</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Chris Kimpton</name>
+      <email>kimptoc.m...@bigfoot.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Brian Lawler</name>
+      <email>br...@tribenetwork.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Josh Lucas</name>
+      <email>j...@stonecottage.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Carl Ludwig</name>
+      <email>c...@destinymusic.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Jonas Mauras</name>
+      <email>j...@mediaphil.de</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Brett McLaughlin</name>
+      <email>bmcla...@algx.net</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Leon Messerschmidt</name>
+      <email>l...@opticode.co.za</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Chris Meyer</name>
+      <email>cme...@gatan.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Steven Nagy</name>
+      <email>sn...@web-publicity.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Kasper Nielsen</name>
+      <email>k...@kav.dk</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Paul O'Leary</name>
+      <email>p...@evolventtech.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Giacomo Pati</name>
+      <email>giacomo.p...@pwr.ch</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Mark Porter</name>
+      <email>mark.por...@canlink.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Jeff Prickett</name>
+      <email>jeffprick...@mindspring.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Ilkka Priha</name>
+      <email>ilkka.pr...@simsoft.fi</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Cameron Riley</name>
+      <email>cri...@ekmail.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Greg Ritter</name>
+      <email>g...@shwoop.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Ingo Schuster</name>
+      <email>i...@raleigh.ibm.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Costas Stergiou</name>
+      <email>cst...@aias.gr</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>George Stewart</name>
+      <email>georgestew...@yahoo.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Ralf Stranzenbach</name>
+      <email>r...@reswi.ruhr.de</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Hakan Tandogan</name>
+      <email>haka...@gmx.de</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Scott C. Tavares</name>
+      <email>stava...@home.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>John Thorhauer</name>
+      <email>j...@zenplex.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Magnús Þór Torfason</name>
+      <email>mag...@handpoint.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Scott Weaver</name>
+      <email>swea...@rippe.com</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+    <contributor>
+      <name>Siegfried Goeschl</name>
+      <email>sgoes...@apache.org</email>
+      <url />
+      <organization />
+      <timezone />
+    </contributor>
+  </contributors>
+
+  <scm>
+    
<connection>scm:svn:http://svn.apache.org/repos/asf/turbine/core/trunk</connection>
+    
<developerConnection>scm:svn:https://svn.apache.org/repos/asf/turbine/core/trunk</developerConnection>
+    <url>http://svn.apache.org/viewcvs/turbine/core/trunk/</url>
+  </scm>
+
+  <build>
+    <sourceDirectory>src/java</sourceDirectory>
+    <testSourceDirectory>src/test</testSourceDirectory>
+
+    <resources>
+      <resource>
+        <directory>src/macros</directory>
+        <targetPath>macros</targetPath>
+        <includes>
+          <include>TurbineMacros.vm</include>
+        </includes>
+      </resource>
+      <resource>
+          <directory>${basedir}/src/main/resources</directory>
+          <filtering>true</filtering>
+          <includes>
+              <include>**/*.properties</include>
+              <include>**/*.xml</include>
+          </includes>
+      </resource>
+    </resources>
+
+    <testResources>
+      <testResource>
+        <targetPath />
+        <directory>conf/test</directory>
+        <includes>
+          <include>commons-logging.properties</include>
+          <include>log4j2-test.xml</include><!-- cft. loading path 
https://logging.apache.org/log4j/2.x/manual/configuration.html -->
+        </includes>
+      </testResource>
+    </testResources>
+
+    <plugins>
+      <!-- run optionally, use not as reporting plugin, as it exposes file 
paths to artifacts and
+        check each possible vulnerability carefully, find more info about how 
to read, false positives et al. here: 
+        
https://jeremylong.github.io/DependencyCheck/dependency-check-maven/plugin-info.html
 or
+        https://github.com/jeremylong/DependencyCheck
+        CLI mvn phase
+        $>mvn verify -Ddependency.check.skip=false
+        or to invoke goal only:
+        $>mvn org.owasp:dependency-check-maven:check 
-Ddependency.check.skip=false
+      -->
+      <plugin>
+        <groupId>org.owasp</groupId>
+        <artifactId>dependency-check-maven</artifactId>
+        <version>3.1.2</version><!-- requires mvn version > 3.3! For older 
version try to check v 3.2.1 or 3.1.2 -->
+        <executions>
+           <execution>
+                <goals>
+                    <goal>check</goal>
+                </goals>
+            </execution>
+        </executions>
+        <configuration>
+           <skip>${dependency.check.skip}</skip>
+           <!-- suppress false positive -->
+           <suppressionFiles>
+            
<suppressionFile>${project.basedir}/suppression-owasp-fp.xml</suppressionFile>
+            </suppressionFiles>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <!--default setting is forkCount=1/reuseForks=true -->
+          <reuseForks>false</reuseForks>
+          <forkCount>1</forkCount>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.torque</groupId>
+        <artifactId>torque-maven-plugin</artifactId>
+        <version>4.0</version>
+        <configuration>
+          <targetDatabase>mysql</targetDatabase>
+          <schemaDir>src/torque/schema</schemaDir>
+        </configuration>
+        <executions>
+          <execution>
+            <id>generate-om-scheduler-sources</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <packaging>classpath</packaging>
+              <configPackage>org.apache.torque.templates.om</configPackage>
+              <sourceDir>src/torque/schema</sourceDir>
+              <sourceIncludes>
+                <include>scheduler-schema.xml</include>
+              </sourceIncludes>
+              <loglevel>error</loglevel>
+              <options>
+                <torque.database>mysql</torque.database>
+                
<torque.om.addGetByNameMethods>false</torque.om.addGetByNameMethods>
+                
<torque.om.save.saveException>TorqueException</torque.om.save.saveException>
+                
<torque.om.package>org.apache.turbine.services.schedule</torque.om.package>
+                
<torque.om.useIsForBooleanGetters>true</torque.om.useIsForBooleanGetters>
+                
<torque.runOnlyOnSourceChange>true</torque.runOnlyOnSourceChange>
+              </options>
+              <outputDirMap>
+                
<modifiable>${project.build.directory}/generated-sources</modifiable>
+              </outputDirMap>
+            </configuration>
+          </execution>
+          <execution>
+            <id>torque-sql-mysql</id>
+            <phase>package</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <packaging>classpath</packaging>
+              <configPackage>org.apache.torque.templates.sql</configPackage>
+              <sourceDir>src/torque/schema</sourceDir>
+              
<defaultOutputDir>${project.build.directory}/generated-sql/torque/mysql</defaultOutputDir>
+              <defaultOutputDirUsage>none</defaultOutputDirUsage>
+              <loglevel>error</loglevel>
+              <options>
+                <torque.database>mysql</torque.database>
+              </options>
+            </configuration>
+          </execution>
+          <execution>
+            <id>torque-sql-hsqldb</id>
+            <phase>package</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <packaging>classpath</packaging>
+              <configPackage>org.apache.torque.templates.sql</configPackage>
+              <sourceDir>src/torque/schema</sourceDir>
+              
<defaultOutputDir>${project.build.directory}/generated-sql/torque/hsqldb</defaultOutputDir>
+              <defaultOutputDirUsage>none</defaultOutputDirUsage>
+              <loglevel>error</loglevel>
+              <options>
+                <torque.database>hsqldb</torque.database>
+              </options>
+            </configuration>
+          </execution>
+          <execution>
+            <id>torque-sql-derby</id>
+            <phase>package</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <packaging>classpath</packaging>
+              <configPackage>org.apache.torque.templates.sql</configPackage>
+              <sourceDir>src/torque/schema</sourceDir>
+              
<defaultOutputDir>${project.build.directory}/generated-sql/torque/derby</defaultOutputDir>
+              <defaultOutputDirUsage>none</defaultOutputDirUsage>
+              <loglevel>error</loglevel>
+              <options>
+                <torque.database>derby</torque.database>
+              </options>
+            </configuration>
+          </execution>
+          <execution>
+            <id>torque-sql-oracle</id>
+            <phase>package</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <packaging>classpath</packaging>
+              <configPackage>org.apache.torque.templates.sql</configPackage>
+              <sourceDir>src/torque/schema</sourceDir>
+              
<defaultOutputDir>${project.build.directory}/generated-sql/torque/oracle</defaultOutputDir>
+              <defaultOutputDirUsage>none</defaultOutputDirUsage>
+              <loglevel>error</loglevel>
+              <options>
+                <torque.database>oracle</torque.database>
+              </options>
+            </configuration>
+          </execution>
+          <execution>
+            <id>torque-sql-postgresql</id>
+            <phase>package</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <packaging>classpath</packaging>
+              <configPackage>org.apache.torque.templates.sql</configPackage>
+              <sourceDir>src/torque/schema</sourceDir>
+              
<defaultOutputDir>${project.build.directory}/generated-sql/torque/postgresql</defaultOutputDir>
+              <defaultOutputDirUsage>none</defaultOutputDirUsage>
+              <loglevel>error</loglevel>
+              <options>
+                <torque.database>postgresql</torque.database>
+              </options>
+            </configuration>
+          </execution>
+          <execution>
+            <id>torque-sql-mssql</id>
+            <phase>package</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <packaging>classpath</packaging>
+              <configPackage>org.apache.torque.templates.sql</configPackage>
+              <sourceDir>src/torque/schema</sourceDir>
+              
<defaultOutputDir>${project.build.directory}/generated-sql/torque/mssql</defaultOutputDir>
+              <defaultOutputDirUsage>none</defaultOutputDirUsage>
+              <loglevel>error</loglevel>
+              <options>
+                <torque.database>mssql</torque.database>
+              </options>
+            </configuration>
+          </execution>
+
+          <execution>
+            <id>torque-idtable-mysql</id>
+            <phase>package</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <packaging>classpath</packaging>
+              
<configPackage>org.apache.torque.templates.idtable</configPackage>
+              <sourceDir>src/torque/schema</sourceDir>
+              
<defaultOutputDir>${project.build.directory}/generated-sql/torque/mysql</defaultOutputDir>
+              <defaultOutputDirUsage>none</defaultOutputDirUsage>
+              <loglevel>error</loglevel>
+              <options>
+                <torque.database>mysql</torque.database>
+              </options>
+            </configuration>
+          </execution>
+          <execution>
+            <id>torque-idtable-hsqldb</id>
+            <phase>package</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <packaging>classpath</packaging>
+              
<configPackage>org.apache.torque.templates.idtable</configPackage>
+              <sourceDir>src/torque/schema</sourceDir>
+              
<defaultOutputDir>${project.build.directory}/generated-sql/torque/hsqldb</defaultOutputDir>
+              <defaultOutputDirUsage>none</defaultOutputDirUsage>
+              <loglevel>error</loglevel>
+              <options>
+                <torque.database>hsqldb</torque.database>
+              </options>
+            </configuration>
+          </execution>
+          <execution>
+            <id>torque-idtable-derby</id>
+            <phase>package</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <packaging>classpath</packaging>
+              
<configPackage>org.apache.torque.templates.idtable</configPackage>
+              <sourceDir>src/torque/schema</sourceDir>
+              
<defaultOutputDir>${project.build.directory}/generated-sql/torque/derby</defaultOutputDir>
+              <defaultOutputDirUsage>none</defaultOutputDirUsage>
+              <loglevel>error</loglevel>
+              <options>
+                <torque.database>derby</torque.database>
+              </options>
+            </configuration>
+          </execution>
+          <execution>
+            <id>torque-idtable-oracle</id>
+            <phase>package</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <packaging>classpath</packaging>
+              
<configPackage>org.apache.torque.templates.idtable</configPackage>
+              <sourceDir>src/torque/schema</sourceDir>
+              
<defaultOutputDir>${project.build.directory}/generated-sql/torque/oracle</defaultOutputDir>
+              <defaultOutputDirUsage>none</defaultOutputDirUsage>
+              <loglevel>error</loglevel>
+              <options>
+                <torque.database>oracle</torque.database>
+              </options>
+            </configuration>
+          </execution>
+          <execution>
+            <id>torque-idtable-postgresql</id>
+            <phase>package</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <packaging>classpath</packaging>
+              
<configPackage>org.apache.torque.templates.idtable</configPackage>
+              <sourceDir>src/torque/schema</sourceDir>
+              
<defaultOutputDir>${project.build.directory}/generated-sql/torque/postgresql</defaultOutputDir>
+              <defaultOutputDirUsage>none</defaultOutputDirUsage>
+              <loglevel>error</loglevel>
+              <options>
+                <torque.database>postgresql</torque.database>
+              </options>
+            </configuration>
+          </execution>
+          <execution>
+            <id>torque-idtable-mssql</id>
+            <phase>package</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <packaging>classpath</packaging>
+              
<configPackage>org.apache.torque.templates.idtable</configPackage>
+              <sourceDir>src/torque/schema</sourceDir>
+              
<defaultOutputDir>${project.build.directory}/generated-sql/torque/mssql</defaultOutputDir>
+              <defaultOutputDirUsage>none</defaultOutputDirUsage>
+              <loglevel>error</loglevel>
+              <options>
+                <torque.database>mssql</torque.database>
+              </options>
+            </configuration>
+          </execution>
+        </executions>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.torque</groupId>
+                <artifactId>torque-templates</artifactId>
+                <version>4.0</version>
+            </dependency>
+        </dependencies>
+      </plugin>
+    </plugins>
+  </build>
+
+  <reporting>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jxr-plugin</artifactId>
+        <configuration>
+          <aggregate>false</aggregate>
+        </configuration>
+      </plugin>
+      <plugin><!-- since 2.7 running the old report requires to register it 
explicitely, otherwise the build may fail -->
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>cobertura-maven-plugin</artifactId>
+        <reportSets>
+          <reportSet>
+            <reports>
+              <report>cobertura</report>
+            </reports>
+          </reportSet>
+        </reportSets>
+      </plugin>
+    </plugins>
+  </reporting>
+
+  <dependencies>
+       <dependency>
+           <groupId>javax.servlet</groupId>
+           <artifactId>javax.servlet-api</artifactId>
+           <version>3.1.0</version>
+           <scope>provided</scope>
+       </dependency>
+    <dependency>
+      <groupId>org.apache.avalon.framework</groupId>
+      <artifactId>avalon-framework-api</artifactId>
+      <version>4.3.1</version>
+    </dependency>
+    <dependency>
+       <groupId>commons-codec</groupId>
+       <artifactId>commons-codec</artifactId>
+      <version>1.11</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-configuration2</artifactId>
+      <version>2.3</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-email</artifactId>
+      <version>1.5</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>3.8.1</version>
+    </dependency>
+    <dependency>
+       <groupId>org.apache.commons</groupId>
+       <artifactId>commons-text</artifactId>
+       <version>1.6</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-logging</groupId>
+      <artifactId>commons-logging</artifactId>
+      <version>1.2</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-beanutils</groupId>
+      <artifactId>commons-beanutils</artifactId>
+      <version>1.9.3</version>
+    </dependency>
+    <dependency>
+      <groupId>ecs</groupId>
+      <artifactId>ecs</artifactId>
+      <version>1.4.2</version>
+    </dependency>
+    <dependency>
+      <groupId>net.sf.uadetector</groupId>
+      <artifactId>uadetector-resources</artifactId>
+      <version>2014.10</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-cache</artifactId>
+      <version>1.1.0</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-factory</artifactId>
+      <version>1.1.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-pool</artifactId>
+      <version>1.0.5-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-localization</artifactId>
+      <version>1.0.7-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-parser</artifactId>
+      <version>2.0.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-intake</artifactId>
+      <version>${fulcrum.intake}</version>
+    </dependency>
+    <!-- yaafi 1.0.7 is in group turbine, 1.0.8 will be in group fulcrum again 
(package ) -->
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-yaafi</artifactId>
+      <version>1.0.8-SNAPSHOT</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-crypto</artifactId>
+      <version>1.0.8-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-xslt</artifactId>
+      <version>1.1.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-mimetype</artifactId>
+      <version>1.0.6-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.torque</groupId>
+      <artifactId>torque-runtime</artifactId>
+      <version>4.0</version>
+      <exclusions>
+        <exclusion>
+            <groupId>avalon-framework</groupId>
+            <artifactId>avalon-framework-api</artifactId>
+        </exclusion>
+        <exclusion>
+            <groupId>avalon-logkit</groupId>
+            <artifactId>avalon-logkit</artifactId>
+        </exclusion>
+        <exclusion>  <!-- exclude this to exclude beanutils v1.8.0 -> 
CVE-2014-0114  -->
+          <groupId>commons-configuration</groupId>
+          <artifactId>commons-configuration</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency> <!-- include more modern version just for torque-runtime v4.0 
-->
+         <groupId>commons-configuration</groupId>
+         <artifactId>commons-configuration</artifactId>
+         <version>1.10</version>
+    </dependency>
+    <!-- using snapshot, until released -->
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-security-api</artifactId>
+      <version>${fulcrum.security}</version>
+    </dependency>
+     <!-- using snapshot, until released -->
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-security-memory</artifactId>
+      <version>${fulcrum.security}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-security-api</artifactId>
+      <version>${fulcrum.security}</version>
+      <classifier>tests</classifier>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-quartz</artifactId>
+      <version>1.1.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <!-- TODO update to stable 2.7.1, because of CVE-2016-5699 -->
+      <groupId>org.python</groupId>
+      <artifactId>jython</artifactId>
+      <version>2.7.0</version>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>org.jabsorb</groupId>
+      <artifactId>jabsorb</artifactId>
+      <version>1.3.2</version>
+      <optional>true</optional>
+      <!-- reqires maven version >= 3,  exclude old versions: 
org.slf4j:slf4j-jdk14,slf4j-api,(renamed)cl104-over-slf4j,org.mortbay.jetty:jsp-2.1,
 commons-httpclient:commons-httpclient,
+         mvn eclipse:eclipse still no wildcard exclude (mvn version 3.3.9)
+      -->
+      <exclusions>
+       <exclusion>
+          <artifactId>jsp-2.1</artifactId>
+          <groupId>org.mortbay.jetty</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jcl104-over-slf4j</artifactId>
+          <groupId>org.slf4j</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>slf4j-jdk14</artifactId>
+          <groupId>org.slf4j</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>*</artifactId>
+          <groupId>*</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>${slf4j.version}</version>
+    </dependency>
+     <!-- delegate slf4j to log4j -->
+    <!--dependency>    
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <version>${slf4j.version}</version>
+    </dependency-->
+     <dependency>     <!-- redirect JCL to slf4j -->
+      <groupId>org.slf4j</groupId>
+      <artifactId>jcl-over-slf4j</artifactId>
+      <version>${slf4j.version}</version>
+    </dependency>
+    <dependency><!-- delegate slf4j to log4j2 -->
+       <groupId>org.apache.logging.log4j</groupId>
+       <artifactId>log4j-slf4j-impl</artifactId>
+       <version>2.11.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+      <version>2.11.1</version>
+    </dependency>
+    <dependency>
+       <groupId>org.apache.logging.log4j</groupId>
+       <artifactId>log4j-core</artifactId>
+       <version>2.11.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-web</artifactId>
+      <version>2.11.1</version>
+    </dependency>
+    <!-- log3j1 bridge instead of log4j -->
+    <dependency>
+        <groupId>org.apache.logging.log4j</groupId>
+        <artifactId>log4j-1.2-api</artifactId>
+        <version>2.11.1</version>
+    </dependency>
+    <!--dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+      <version>1.2.17</version>
+    </dependency-->
+    <dependency>
+      <groupId>org.apache.velocity</groupId>
+      <artifactId>velocity-engine-core</artifactId>
+      <version>2.0</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.12</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.hsqldb</groupId>
+      <artifactId>hsqldb</artifactId>
+      <version>2.2.9</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.fulcrum</groupId>
+      <artifactId>fulcrum-testcontainer</artifactId>
+      <version>1.0.8-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <profiles>
+    <profile>
+      <id>apache-release</id>
+      <build>
+        <plugins>
+           <plugin>
+            <groupId>org.owasp</groupId>
+            <artifactId>dependency-check-maven</artifactId>
+            <configuration>
+               <skip>false</skip>
+            </configuration>
+          </plugin>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-site-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>turbine-release-site</id>
+                <phase>prepare-package</phase>
+                <goals>
+                  <goal>site</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <!-- build the source and binary distribution packages -->
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-assembly-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>turbine-default-assembly</id>
+                <configuration>
+                  <skipAssembly>true</skipAssembly>
+                </configuration>
+              </execution>
+              <execution>
+                <id>turbine-core-assembly</id>
+                <phase>package</phase>
+                <goals>
+                  <goal>single</goal>
+                </goals>
+                <configuration>
+                  <runOnlyAtExecutionRoot>true</runOnlyAtExecutionRoot>
+                  <descriptors>
+                    <descriptor>./src/assembly/binaries.xml</descriptor>
+                    <descriptor>./src/assembly/source.xml</descriptor>
+                  </descriptors>
+                  <tarLongFileFormat>gnu</tarLongFileFormat>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+      <properties> 
+        <dependency.check.skip>false</dependency.check.skip>
+        <doclint>none</doclint><!-- since javadoc v.3 this is the reuqired 
instead of -Xdoclint:none, remove if turbine parent is correct again using 
profile java8  -->
+      </properties>
+    </profile>
+  </profiles>
+
+  <properties>
+    <!-- maven.compiler setting in turbine parent -->
+    <!-- TODO: Change for release -->
+    <turbine.site.path>turbine/turbine-5.0</turbine.site.path>
+    <fulcrum.intake>2.0.0-SNAPSHOT</fulcrum.intake>
+    <fulcrum.security>1.1.3-SNAPSHOT</fulcrum.security>
+    <slf4j.version>1.7.25</slf4j.version>
+    <dependency.check.skip>true</dependency.check.skip>
+  </properties>
+
+</project>

Propchange: turbine/core/trunk/proposals/gk/log4j2/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
turbine/core/trunk/proposals/gk/log4j2/src/java/org/apache/turbine/Turbine.java
URL: 
http://svn.apache.org/viewvc/turbine/core/trunk/proposals/gk/log4j2/src/java/org/apache/turbine/Turbine.java?rev=1845811&view=auto
==============================================================================
--- 
turbine/core/trunk/proposals/gk/log4j2/src/java/org/apache/turbine/Turbine.java 
(added)
+++ 
turbine/core/trunk/proposals/gk/log4j2/src/java/org/apache/turbine/Turbine.java 
Mon Nov  5 15:18:22 2018
@@ -0,0 +1,1111 @@
+package org.apache.turbine;
+
+/*
+ * 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.
+ */
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.io.Reader;
+import java.io.StringReader;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.MultipartConfig;
+import javax.servlet.annotation.WebInitParam;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.parsers.FactoryConfigurationError;
+
+import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.PropertiesConfiguration;
+import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
+import 
org.apache.commons.configuration2.builder.combined.CombinedConfigurationBuilder;
+import org.apache.commons.configuration2.builder.fluent.Parameters;
+import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
+import org.apache.commons.configuration2.ex.ConfigurationException;
+import org.apache.commons.configuration2.io.HomeDirectoryLocationStrategy;
+import org.apache.commons.lang3.NotImplementedException;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.text.StringSubstitutor;
+import org.apache.log4j.PropertyConfigurator;
+import org.apache.log4j.xml.DOMConfigurator;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.config.Configurator;
+import org.apache.turbine.modules.PageLoader;
+import org.apache.turbine.pipeline.Pipeline;
+import org.apache.turbine.pipeline.PipelineData;
+import org.apache.turbine.pipeline.TurbinePipeline;
+import org.apache.turbine.services.Initable;
+import org.apache.turbine.services.InitializationException;
+import org.apache.turbine.services.ServiceManager;
+import org.apache.turbine.services.TurbineServices;
+import org.apache.turbine.services.rundata.RunDataService;
+import org.apache.turbine.services.template.TemplateService;
+import org.apache.turbine.util.LocaleUtils;
+import org.apache.turbine.util.RunData;
+import org.apache.turbine.util.ServerData;
+import org.apache.turbine.util.TurbineConfig;
+import org.apache.turbine.util.TurbineException;
+import org.apache.turbine.util.uri.URIConstants;
+//import org.apache.log4j.LogManager;
+//import org.apache.log4j.PropertyConfigurator;
+//import org.apache.log4j.xml.DOMConfigurator;
+
+/**
+ * Turbine is the main servlet for the entire system. If you
+ * need to perform initialization of a service, then you should implement the
+ * Services API and let your code be initialized by it.
+ * <p>
+ * Turbine servlet recognizes the following initialization parameters.
+ * <ul>
+ * <li><code>properties</code> the path to TurbineResources.properties file
+ * used to configure Turbine, relative to the application root.</li>
+ * <li><code>configuration</code> the path to TurbineConfiguration.xml file
+ * used to configure Turbine from various sources, relative
+ * to the application root.</li>
+ * <li><code>applicationRoot</code> this parameter defaults to the web context
+ * of the servlet container. You can use this parameter to specify the 
directory
+ * within the server's filesystem, that is the base of your web 
application.</li>
+ * </ul>
+ *
+ * @author <a href="mailto:j...@latchkey.com";>Jon S. Stevens</a>
+ * @author <a href="mailto:bmcla...@algx.net";>Brett McLaughlin</a>
+ * @author <a href="mailto:g...@shwoop.com";>Greg Ritter</a>
+ * @author <a href="mailto:john.mcna...@clearink.com";>John D. McNally</a>
+ * @author <a href="mailto:frank....@clearink.com";>Frank Y. Kim</a>
+ * @author <a href="mailto:krzew...@e-point.pl";>Rafal Krzewski</a>
+ * @author <a href="mailto:jvan...@apache.org";>Jason van Zyl</a>
+ * @author <a href="mailto:s...@informage.net";>Sean Legassick</a>
+ * @author <a href="mailto:mpoes...@marmot.at";>Martin Poeschl</a>
+ * @author <a href="mailto:h...@intermeta.de";>Henning P. Schmiedehausen</a>
+ * @author <a href="mailto:quint...@bellsouth.net";>Quinton McCombs</a>
+ * @author <a href="mailto:ep...@upstate.com";>Eric Pugh</a>
+ * @author <a href="mailto:pe...@courcoux.biz";>Peter Courcoux</a>
+ * @author <a href="mailto:t...@apache.org";>Thomas Vandahl</a>
+ * @version $Id: Turbine.java 1845484 2018-11-01 15:15:03Z gk $
+ */
+@WebServlet(
+    name = "Turbine",
+    urlPatterns = {"/app"},
+    loadOnStartup = 1,
+    initParams={ @WebInitParam(name = TurbineConstants.APPLICATION_ROOT_KEY,
+                    value = TurbineConstants.APPLICATION_ROOT_DEFAULT),
+                 @WebInitParam(name = TurbineConfig.PROPERTIES_PATH_KEY,
+                    value = TurbineConfig.PROPERTIES_PATH_DEFAULT) } )
+@MultipartConfig
+public class TurbineLog4J2 extends HttpServlet
+{
+    /** Serial version */
+    private static final long serialVersionUID = -6317118078613623990L;
+
+    /**
+     * Name of path info parameter used to indicate the redirected stage of
+     * a given user's initial Turbine request
+     * @deprecated
+     */
+    @Deprecated // not used
+    public static final String REDIRECTED_PATHINFO_NAME = "redirected";
+
+    /** The base directory key @deprecated 
+     * */
+    @Deprecated // not used
+    public static final String BASEDIR_KEY = "basedir";
+
+    /**
+     * In certain situations the init() method is called more than once,
+     * sometimes even concurrently. This causes bad things to happen,
+     * so we use this flag to prevent it.
+     */
+    private static boolean firstInit = true;
+
+    /**
+     * The pipeline to use when processing requests.
+     */
+    private static Pipeline pipeline = null;
+
+    /** Whether init succeeded or not. */
+    private static Throwable initFailure = null;
+
+    /**
+     * Should initialization activities be performed during doGet() execution?
+     */
+    private static boolean firstDoGet = true;
+
+    /**
+     * Keep all the properties of the web server in a convenient data
+     * structure
+     */
+    private static volatile ServerData serverData = null;
+
+    /** The base from which the Turbine application will operate. */
+    private static String applicationRoot;
+
+    /** Servlet config for this Turbine webapp. */
+    private static ServletConfig servletConfig;
+
+    /** Servlet context for this Turbine webapp. */
+    private static ServletContext servletContext;
+
+    /**
+     * The webapp root where the Turbine application
+     * is running in the servlet container.
+     * This might differ from the application root.
+     */
+    private static String webappRoot;
+
+    /** Our internal configuration object */
+    private static Configuration configuration = null;
+
+    /** Which configuration method is being used */
+    private enum ConfigurationStyle
+    {
+        XML,
+        PROPERTIES,
+        JSON,
+        YAML,
+        UNSET
+    }
+
+    /** Logging class from commons.logging */
+    private static Log log = LogFactory.getLog(TurbineLog4J2.class);
+    
+    /**
+     * 
+     */
+    public static Logger log4j2Logger = LogManager.getLogger();
+
+    /**
+     * This init method will load the default resources from a
+     * properties file.
+     *
+     * This method is called by init(ServletConfig config)
+     *
+     * @throws ServletException a servlet exception.
+     */
+    @Override
+    public void init() throws ServletException
+    {
+        synchronized (TurbineLog4J2.class)
+        {
+            super.init();
+
+            if (!firstInit)
+            {
+                log.info("Double initialization of Turbine was attempted!");
+                return;
+            }
+            // executing init will trigger some static initializers, so we have
+            // only one chance.
+            firstInit = false;
+            ServletConfig config = getServletConfig();
+
+            try
+            {
+                ServletContext context = config.getServletContext();
+
+                configure(config, context);
+
+                TemplateService templateService =
+                    
(TemplateService)getServiceManager().getService(TemplateService.SERVICE_NAME);
+                if (templateService == null)
+                {
+                    throw new TurbineException("No Template Service 
configured!");
+                }
+
+                if (getRunDataService() == null)
+                {
+                    throw new TurbineException("No RunData Service 
configured!");
+                }
+            }
+            catch (Throwable e)
+            {
+                // save the exception to complain loudly later :-)
+                initFailure = e;
+                log.fatal("Turbine: init() failed: ", e);
+                throw new ServletException("Turbine: init() failed", e);
+            }
+
+            log.info("Turbine: init() Ready to Rumble!");
+        }
+    }
+
+    /**
+     * Read the master configuration file in, configure logging
+     * and start up any early services.
+     *
+     * @param config The Servlet Configuration supplied by the container
+     * @param context The Servlet Context supplied by the container
+     *
+     * @throws Exception A problem occurred while reading the configuration or 
performing early startup
+     */
+
+    protected void configure(ServletConfig config, ServletContext context)
+            throws Exception
+    {
+
+        // Set the application root. This defaults to the webapp
+        // context if not otherwise set.
+        applicationRoot = findInitParameter(context, config,
+                TurbineConstants.APPLICATION_ROOT_KEY,
+                TurbineConstants.APPLICATION_ROOT_DEFAULT);
+
+        webappRoot = context.getRealPath("/");
+        // log.info("Web Application root is " + webappRoot);
+        // log.info("Application root is "     + applicationRoot);
+
+        if (applicationRoot == null || 
applicationRoot.equals(TurbineConstants.WEB_CONTEXT))
+        {
+            applicationRoot = webappRoot;
+            // log.info("got empty or 'webContext' Application root. 
Application root now: " + applicationRoot);
+        }
+
+        // Set the applicationRoot for this webapp.
+        setApplicationRoot(applicationRoot);
+
+        //
+        // Now we run the Turbine configuration code. There are two ways
+        // to configure Turbine:
+        //
+        // a) By supplying an web.xml init parameter called "configuration"
+        //
+        // <init-param>
+        //   <param-name>configuration</param-name>
+        //   <param-value>/WEB-INF/conf/turbine.xml</param-value>
+        // </init-param>
+        //
+        // This loads an XML based configuration file.
+        //
+        // b) By supplying an web.xml init parameter called "properties"
+        //
+        // <init-param>
+        //   <param-name>properties</param-name>
+        //   
<param-value>/WEB-INF/conf/TurbineResources.properties</param-value>
+        // </init-param>
+        //
+        // This loads a Properties based configuration file. Actually, these 
are
+        // extended properties as provided by commons-configuration
+        //
+        // If neither a) nor b) is supplied, Turbine will fall back to the
+        // known behaviour of loading a properties file called
+        // /WEB-INF/conf/TurbineResources.properties relative to the
+        // web application root.
+
+        Path targetPath = configureFromConfiguration( config, context );
+        
+        //
+        // Set up logging as soon as possible
+        //
+        configureLogging(targetPath);
+
+        // Now report our successful configuration to the world
+        log.info("Loaded configuration: " + configuration.toString());
+
+        setTurbineServletConfig(config);
+        setTurbineServletContext(context);
+
+        getServiceManager().setApplicationRoot(applicationRoot);
+
+        // We want to set a few values in the configuration so
+        // that ${variable} interpolation will work for
+        //
+        // ${applicationRoot}
+        // ${webappRoot}
+        configuration.setProperty(TurbineConstants.APPLICATION_ROOT_KEY, 
applicationRoot);
+        configuration.setProperty(TurbineConstants.WEBAPP_ROOT_KEY, 
webappRoot);
+
+        getServiceManager().setConfiguration(configuration);
+
+        // Initialize the service manager. Services
+        // that have its 'earlyInit' property set to
+        // a value of 'true' will be started when
+        // the service manager is initialized.
+        getServiceManager().init();
+
+        // Retrieve the pipeline class and then initialize it.  The pipeline
+        // handles the processing of a webrequest/response cycle.
+           String descriptorPath =
+                       configuration.getString(
+                         "pipeline.default.descriptor",
+                                         TurbinePipeline.CLASSIC_PIPELINE);
+
+        if (log.isDebugEnabled())
+        {
+            log.debug("Using descriptor path: " + descriptorPath);
+        }
+
+        // context resource path has to begin with slash, cft. 
context.getResource
+        if (!descriptorPath.startsWith( "/" ))
+        {
+               descriptorPath  = "/" + descriptorPath;
+        }
+
+        try (InputStream reader = context.getResourceAsStream(descriptorPath))
+        {
+            JAXBContext jaxb = JAXBContext.newInstance(TurbinePipeline.class);
+            Unmarshaller unmarshaller = jaxb.createUnmarshaller();
+            pipeline = (Pipeline) unmarshaller.unmarshal(reader);
+        }
+
+               log.debug("Initializing pipeline");
+
+               pipeline.initialize();
+    }
+
+    private Path configureFromConfiguration( ServletConfig config, 
ServletContext context )
+        throws IOException, ConfigurationException
+    {
+        ConfigurationStyle confStyle = ConfigurationStyle.UNSET;
+        // first test
+        String confFile= findInitParameter(context, config,
+                TurbineConfig.CONFIGURATION_PATH_KEY,
+                null);
+        if (StringUtils.isNotEmpty(confFile))
+        {
+            confStyle = ConfigurationStyle.XML;
+        }
+        else // second test
+        {
+            confFile = findInitParameter(context, config,
+                    TurbineConfig.PROPERTIES_PATH_KEY,
+                                         null);
+            if (StringUtils.isNotEmpty((confFile)) )
+            {
+                confStyle = ConfigurationStyle.PROPERTIES;
+            }
+        }
+        // more tests ..
+        // last test
+        if (confStyle == ConfigurationStyle.UNSET)
+        {  // last resort
+             confFile = findInitParameter(context, config,
+                    TurbineConfig.PROPERTIES_PATH_KEY,
+                    TurbineConfig.PROPERTIES_PATH_DEFAULT);
+             confStyle = ConfigurationStyle.PROPERTIES;
+        }
+
+        // now begin loading
+        Parameters params = new Parameters();
+        File confPath = getApplicationRootAsFile(); //.getCanonicalPath();
+
+        if (confFile.startsWith( "/" ))
+        {
+            confFile = confFile.substring( 1 ); // cft. RFC2396 should not 
start with a slash, if not absolute path
+        }
+
+        Path confFileRelativePath =  Paths.get( confFile );// relative to 
later join
+        Path targetPath = Paths.get( confPath.toURI() );
+        targetPath = targetPath.resolve( confFileRelativePath );
+
+        // Get the target path directory
+        Path targetPathDirectory = targetPath.getParent();
+        if ( targetPathDirectory != null )
+        {
+               // set the configuration path
+               confPath = targetPathDirectory.normalize().toFile();
+
+            Path targetFilePath = targetPath.getFileName();
+            if ( targetFilePath != null )
+            {
+               // set the configuration file name
+               confFile = targetFilePath.toString();
+            }
+               
+        }
+
+        switch (confStyle)
+        {
+            case XML:
+                // relative base path used for this and child configuration 
files
+                CombinedConfigurationBuilder combinedBuilder = new 
CombinedConfigurationBuilder()
+                    .configure(params.fileBased()
+                        .setFileName(confFile)
+                        .setListDelimiterHandler(new 
DefaultListDelimiterHandler(','))
+                        .setLocationStrategy(new 
HomeDirectoryLocationStrategy(confPath.getCanonicalPath(), false)));
+                configuration = combinedBuilder.getConfiguration();
+                break;
+
+            case PROPERTIES:
+                FileBasedConfigurationBuilder<PropertiesConfiguration> 
propertiesBuilder =
+                                new FileBasedConfigurationBuilder<>(
+                                                PropertiesConfiguration.class)
+                    .configure(params.properties()
+                        .setFileName(confFile)
+                        .setListDelimiterHandler(new 
DefaultListDelimiterHandler(','))
+                        .setLocationStrategy(new 
HomeDirectoryLocationStrategy(confPath.getCanonicalPath(), false)));
+                configuration = propertiesBuilder.getConfiguration();
+                break;
+            case JSON: case YAML:
+                throw new NotImplementedException("JSON or XAML configuration 
style not yet implemented!");
+
+            default:
+                break;
+        }
+        if (log4j2Logger != null) {
+            // Now report our successful configuration to the world
+            log4j2Logger.info("Loaded configuration (" + confStyle + ") from " 
+ confFile + " style: " + configuration.toString());
+        }
+        return targetPath;
+    }
+
+    /**
+     * Configure the logging facilities of Turbine
+     * @param targetPath
+     *
+     * @throws IOException if the configuration file handling fails.
+     */
+    protected void configureLogging(Path targetPath) throws IOException
+    {
+
+        Boolean useLog4j2 = configuration.getBoolean( "use.log4j2", false);
+        
+        if (useLog4j2) {
+            // Log4j" has a default configuration, as a result log4j2Logger 
will always be set
+            log4j2Logger.info("Configured log4j2");
+        } else {
+            configureLog4j1x( targetPath );
+        } 
+    }
+
+    private void configureLog4j1x( Path targetPath )
+        throws IOException
+    {
+        boolean success = false;
+        
+        
+        String log4jFile = 
configuration.getString(TurbineConstants.LOG4J_CONFIG_FILE,
+                                                   
TurbineConstants.LOG4J_CONFIG_FILE_DEFAULT);
+                        
+        if (log4jFile.startsWith( "/" ))
+        {
+            log4jFile = log4jFile.substring( 1 );
+        }
+        // log4j must either share path with configuration path or resolved 
relatively
+        Path log4jTarget = null;
+        Path logConfPath = targetPath.getParent();
+        if ( logConfPath != null )
+        {
+               Path logFilePath = logConfPath.resolve( log4jFile );
+               if ( logFilePath != null )
+               {
+                       log4jTarget = logFilePath.normalize();
+            }
+        }
+
+        if (StringUtils.isNotEmpty(log4jFile) &&
+                !log4jFile.equalsIgnoreCase("none") && log4jTarget != null && 
log4jTarget.toFile().exists() )
+        {
+            log4jFile = log4jTarget.toFile().getAbsolutePath();
+            Configurator.initialize("log4j1x_config", null, 
log4jTarget.toFile().toURI());
+            
+            LoggerContext context = (LoggerContext) 
LogManager.getContext(false);
+            org.apache.logging.log4j.core.config.Configuration log4jconf = 
context.getConfiguration();
+            String appRoot = 
log4jconf.getStrSubstitutor().getVariableResolver().lookup("applicationRoot");
+            log4jconf.getStrSubstitutor().replace( appRoot );
+            
+            
+            if (log4jFile.endsWith(".xml"))
+            {
+                // load XML type configuration
+                // NOTE: Only system property expansion available
+                try
+                {
+                    // NOTE: expand application root explicitely
+                    Map<String,String> valMap = new HashMap<>();
+                    valMap.put(TurbineConstants.APPLICATION_ROOT_KEY, 
getApplicationRoot().replace( '\\', '/' ));
+                    StringSubstitutor sub = new StringSubstitutor(valMap);
+                    String log4jTemplate = new 
String(Files.readAllBytes(Paths.get(log4jFile)));
+                    String resolvedString = sub.replace(log4jTemplate);
+                    
+                    // just always use slashes
+                    String winFS = "\\";
+                    if (FileSystems.getDefault().getSeparator().equals( winFS )
+                                    && resolvedString.contains( winFS )) {
+                        System.out.println( 
FileSystems.getDefault().getClass().getName() + " with fsep ('"+ 
FileSystems.getDefault().getSeparator() + "') found in "  + log4jFile + ", 
changing to forward slash ('/')." );
+                        resolvedString = resolvedString.replace( '\\', '/' ); 
+                    }
+                    Reader memoryConfiguration = new 
StringReader(resolvedString);
+                    DOMConfigurator log4jDOMConf = new DOMConfigurator();
+                    log4jDOMConf.doConfigure(memoryConfiguration, 
org.apache.log4j.LogManager.getLoggerRepository());
+
+                    success = true;
+                }
+                catch (FactoryConfigurationError e)
+                {
+                    System.err.println("Could not configure Log4J from 
configuration file "
+                            + log4jFile + ": ");
+                    e.printStackTrace();
+                }
+            }
+            else
+            {
+                //
+                // Load the config file above into a Properties object and
+                // fix up the Application root
+                //
+                Properties p = new Properties();
+
+                try (FileInputStream fis = new FileInputStream(log4jFile))
+                {
+                    p.load(fis);
+                    p.setProperty(TurbineConstants.APPLICATION_ROOT_KEY, 
getApplicationRoot());
+                    PropertyConfigurator.configure(p);
+                    success = true;
+                }
+                catch (FileNotFoundException fnf)
+                {
+                    System.err.println("Could not open Log4J configuration 
file "
+                            + log4jFile + ": ");
+                    fnf.printStackTrace();
+                }
+            }
+        }
+        if (success)
+        {
+            // Rebuild our log object with a configured commons-logging
+            log = LogFactory.getLog(this.getClass());
+            log.info("Configured log4j from " + log4jFile);
+        }
+    }
+
+    /**
+     * Finds the specified servlet configuration/initialization
+     * parameter, looking first for a servlet-specific parameter, then
+     * for a global parameter, and using the provided default if not
+     * found.
+     */
+    protected String findInitParameter(ServletContext context,
+            ServletConfig config, String name, String defaultValue)
+    {
+        String path = null;
+
+        // Try the name as provided first.
+        boolean usingNamespace = 
name.startsWith(TurbineConstants.CONFIG_NAMESPACE);
+        while (true)
+        {
+            path = config.getInitParameter(name);
+            if (StringUtils.isEmpty(path))
+            {
+                path = context.getInitParameter(name);
+                if (StringUtils.isEmpty(path))
+                {
+                    // The named parameter didn't yield a value.
+                    if (usingNamespace)
+                    {
+                        path = defaultValue;
+                    }
+                    else
+                    {
+                        // Try again using Turbine's namespace.
+                        name = TurbineConstants.CONFIG_NAMESPACE + '.' + name;
+                        usingNamespace = true;
+                        continue;
+                    }
+                }
+            }
+            break;
+        }
+
+        return path;
+    }
+
+    /**
+     * Initializes the services which need <code>PipelineData</code> to
+     * initialize themselves (post startup).
+     *
+     * @param data The first <code>GET</code> request.
+     */
+    public void init(PipelineData data)
+    {
+        synchronized (TurbineLog4J2.class)
+        {
+            if (firstDoGet)
+            {
+                // All we want to do here is save some servlet
+                // information so that services and processes
+                // that don't have direct access to a RunData
+                // object can still know something about
+                // the servlet environment.
+                saveServletInfo(data);
+
+                // Initialize services with the PipelineData instance
+                TurbineServices services = 
(TurbineServices)getServiceManager();
+
+                for (Iterator<String> i = services.getServiceNames(); 
i.hasNext();)
+                {
+                       String serviceName = i.next();
+                       Object service = services.getService(serviceName);
+
+                       if (service instanceof Initable)
+                       {
+                               try
+                               {
+                                                       
((Initable)service).init(data);
+                                               }
+                               catch (InitializationException e)
+                               {
+                                       log.warn("Could not initialize Initable 
" + serviceName + " with PipelineData", e);
+                                               }
+                       }
+                }
+
+                // Mark that we're done.
+                firstDoGet = false;
+                log.info("Turbine: first Request successful");
+            }
+        }
+    }
+
+    /**
+     * Return the current configuration with all keys included
+     *
+     * @return a Configuration Object
+     */
+    public static Configuration getConfiguration()
+    {
+        return configuration;
+    }
+
+    /**
+     * Return the server name.
+     *
+     * @return String server name
+     */
+    public static String getServerName()
+    {
+        return getDefaultServerData().getServerName();
+    }
+
+    /**
+     * Return the server scheme.
+     *
+     * @return String server scheme
+     */
+    public static String getServerScheme()
+    {
+        return getDefaultServerData().getServerScheme();
+    }
+
+    /**
+     * Return the server port.
+     *
+     * @return String server port
+     */
+    public static String getServerPort()
+    {
+        return Integer.toString(getDefaultServerData().getServerPort());
+    }
+
+    /**
+     * Get the script name. This is the initial script name.
+     * Actually this is probably not needed any more. I'll
+     * check. jvz.
+     *
+     * @return String initial script name.
+     */
+    public static String getScriptName()
+    {
+        return getDefaultServerData().getScriptName();
+    }
+
+    /**
+     * Return the context path.
+     *
+     * @return String context path
+     */
+    public static String getContextPath()
+    {
+        return getDefaultServerData().getContextPath();
+    }
+
+    /**
+     * Return all the Turbine Servlet information (Server Name, Port,
+     * Scheme in a ServerData structure. This is generated from the
+     * values set when initializing the Turbine and may not be correct
+     * if you're running in a clustered structure. You can provide default
+     * values in your configuration for cases where access is requied before
+     * your application is first accessed by a user.  This might be used
+     * if you need a DataURI and have no RunData object handy.
+     *
+     * @return An initialized ServerData object
+     */
+    public static ServerData getDefaultServerData()
+    {
+        if (serverData == null)
+        {
+            String serverName
+                    = 
configuration.getString(TurbineConstants.DEFAULT_SERVER_NAME_KEY);
+            if (serverName == null)
+            {
+                log.error("ServerData Information requested from Turbine 
before first request!");
+            }
+            else
+            {
+                log.info("ServerData Information retrieved from 
configuration.");
+            }
+            // Will be overwritten once the first request is run;
+            serverData = new ServerData(serverName,
+                    
configuration.getInt(TurbineConstants.DEFAULT_SERVER_PORT_KEY,
+                            URIConstants.HTTP_PORT),
+                    
configuration.getString(TurbineConstants.DEFAULT_SERVER_SCHEME_KEY,
+                            URIConstants.HTTP),
+                    
configuration.getString(TurbineConstants.DEFAULT_SCRIPT_NAME_KEY),
+                    
configuration.getString(TurbineConstants.DEFAULT_CONTEXT_PATH_KEY));
+        }
+        return serverData;
+    }
+
+    /**
+     * Set the servlet config for this turbine webapp.
+     *
+     * @param config New servlet config
+     */
+    public static void setTurbineServletConfig(ServletConfig config)
+    {
+        servletConfig = config;
+    }
+
+    /**
+     * Get the servlet config for this turbine webapp.
+     *
+     * @return ServletConfig
+     */
+    public static ServletConfig getTurbineServletConfig()
+    {
+        return servletConfig;
+    }
+
+    /**
+     * Set the servlet context for this turbine webapp.
+     *
+     * @param context New servlet context.
+     */
+    public static void setTurbineServletContext(ServletContext context)
+    {
+        servletContext = context;
+    }
+
+    /**
+     * Get the servlet context for this turbine webapp.
+     *
+     * @return ServletContext
+     */
+    public static ServletContext getTurbineServletContext()
+    {
+        return servletContext;
+    }
+
+    /**
+     * The <code>Servlet</code> destroy method.  Invokes
+     * <code>ServiceBroker</code> tear down method.
+     */
+    @Override
+    public void destroy()
+    {
+        // Shut down all Turbine Services.
+        getServiceManager().shutdownServices();
+
+        firstInit = true;
+        firstDoGet = true;
+        log.info("Turbine: Done shutting down!");
+    }
+
+    /**
+     * The primary method invoked when the Turbine servlet is executed.
+     *
+     * @param req Servlet request.
+     * @param res Servlet response.
+     * @throws IOException a servlet exception.
+     * @throws ServletException a servlet exception.
+     */
+    @Override
+    public void doGet(HttpServletRequest req, HttpServletResponse res)
+            throws IOException, ServletException
+    {
+        // Check to make sure that we started up properly.
+        if (initFailure != null)
+        {
+            handleHorribleException(res, initFailure);
+            return;
+        }
+
+        // Get general PipelineData here...
+        try (PipelineData pipelineData = getRunDataService().getRunData(req, 
res, getServletConfig()))
+        {
+            try
+            {
+                // Perform turbine specific initialization below.
+                Map<Class<?>, Object> runDataMap = new HashMap<Class<?>, 
Object>();
+                runDataMap.put(RunData.class, pipelineData);
+                // put the data into the pipeline
+                pipelineData.put(RunData.class, runDataMap);
+
+                // If this is the first invocation, perform some
+                // initialization.  Certain services need RunData to initialize
+                // themselves.
+                if (firstDoGet)
+                {
+                    init(pipelineData);
+                }
+
+                // Stages of Pipeline implementation execution
+                // configurable via attached Valve implementations in a
+                // XML properties file.
+                pipeline.invoke(pipelineData);
+            }
+            catch (Throwable t)
+            {
+                handleException(pipelineData, res, t);
+            }
+        }
+        catch (Throwable t)
+        {
+            handleHorribleException(res, t);
+        }
+    }
+
+    /**
+     * In this application doGet and doPost are the same thing.
+     *
+     * @param req Servlet request.
+     * @param res Servlet response.
+     * @throws IOException a servlet exception.
+     * @throws ServletException a servlet exception.
+     */
+    @Override
+    public void doPost(HttpServletRequest req, HttpServletResponse res)
+            throws IOException, ServletException
+    {
+        doGet(req, res);
+    }
+
+    /**
+     * Return the servlet info.
+     *
+     * @return a string with the servlet information.
+     */
+    @Override
+    public String getServletInfo()
+    {
+        return "Turbine Servlet";
+    }
+
+    /**
+     * This method is about making sure that we catch and display
+     * errors to the screen in one fashion or another. What happens is
+     * that it will attempt to show the error using your user defined
+     * Error Screen. If that fails, then it will resort to just
+     * displaying the error and logging it all over the place
+     * including the servlet engine log file, the Turbine log file and
+     * on the screen.
+     *
+     * @param pipelineData A Turbine PipelineData object.
+     * @param res Servlet response.
+     * @param t The exception to report.
+     */
+    protected void handleException(PipelineData pipelineData, 
HttpServletResponse res,
+                                       Throwable t)
+    {
+        RunData data = (RunData) pipelineData;
+        // make sure that the stack trace makes it the log
+        log.error("Turbine.handleException: ", t);
+
+        try
+        {
+            // This is where we capture all exceptions and show the
+            // Error Screen.
+            data.setStackTrace(ExceptionUtils.getStackTrace(t), t);
+
+            // setup the screen
+            data.setScreen(configuration.getString(
+                    TurbineConstants.SCREEN_ERROR_KEY,
+                    TurbineConstants.SCREEN_ERROR_DEFAULT));
+
+            // do more screen setup for template execution if needed
+            if (data.getTemplateInfo() != null)
+            {
+                data.getTemplateInfo()
+                    .setScreenTemplate(configuration.getString(
+                            TurbineConstants.TEMPLATE_ERROR_KEY,
+                            TurbineConstants.TEMPLATE_ERROR_VM));
+            }
+
+            // Make sure to not execute an action.
+            data.setAction("");
+
+            PageLoader.getInstance().exec(pipelineData,
+                    configuration.getString(TurbineConstants.PAGE_DEFAULT_KEY,
+                            TurbineConstants.PAGE_DEFAULT_DEFAULT));
+
+            data.getResponse().setContentType(data.getContentType());
+            data.getResponse().setStatus(data.getStatusCode());
+        }
+        // Attempt to do *something* at this point...
+        catch (Throwable reallyScrewedNow)
+        {
+            handleHorribleException(res, reallyScrewedNow);
+        }
+    }
+
+    /**
+     * This method handles exception cases where no PipelineData object exists
+     *
+     * @param res Servlet response.
+     * @param t The exception to report.
+     */
+    protected void handleHorribleException(HttpServletResponse res, Throwable 
t)
+    {
+        try
+        {
+            res.setContentType( TurbineConstants.DEFAULT_TEXT_CONTENT_TYPE );
+            res.setStatus(200);
+            PrintWriter writer = res.getWriter();
+            writer.println("Horrible Exception: ");
+            t.printStackTrace(writer);
+        }
+        catch (Exception ignored)
+        {
+            // ignore
+        }
+
+        log.error(t.getMessage(), t);
+    }
+
+    /**
+     * Save some information about this servlet so that
+     * it can be utilized by object instances that do not
+     * have direct access to PipelineData.
+     *
+     * @param data Turbine request data
+     */
+    public static synchronized void saveServletInfo(PipelineData data)
+    {
+        // Store the context path for tools like ContentURI and
+        // the UIManager that use webapp context path information
+        // for constructing URLs.
+
+        //
+        // Bundle all the information above up into a convenient structure
+        //
+        ServerData requestServerData = data.get(TurbineLog4J2.class, 
ServerData.class);
+        serverData = (ServerData) requestServerData.clone();
+    }
+
+    /**
+     * Set the application root for the webapp.
+     *
+     * @param val New app root.
+     */
+    public static void setApplicationRoot(String val)
+    {
+        applicationRoot = val;
+    }
+
+    /**
+     * Get the application root for this Turbine webapp.
+     *
+     * @return String applicationRoot
+     */
+    public static String getApplicationRoot()
+    {
+        return applicationRoot;
+    }
+
+    /**
+     * Get the application root for this Turbine webapp as a
+     * file object.
+     *
+     * @return File applicationRootFile
+     */
+    public static File getApplicationRootAsFile()
+    {
+        return new File(applicationRoot);
+    }
+
+    /**
+     * Used to get the real path of configuration and resource
+     * information. This can be used by an app being
+     * developed in a standard CVS layout.
+     *
+     * @param path path translated to the application root
+     * @return the real path
+     */
+    public static String getRealPath(String path)
+    {
+        if (path.startsWith("/"))
+        {
+            return new File(getApplicationRootAsFile(), 
path.substring(1)).getAbsolutePath();
+        }
+
+        return new File(getApplicationRootAsFile(), path).getAbsolutePath();
+    }
+
+    /**
+     * Return an instance of the currently configured Service Manager
+     *
+     * @return A service Manager instance
+     */
+    private ServiceManager getServiceManager()
+    {
+        return TurbineServices.getInstance();
+    }
+
+    /**
+     * Returns the default input encoding for the servlet.
+     *
+     * @return the default input encoding.
+     *
+     * @deprecated Use {@link 
org.apache.turbine.pipeline.DefaultSetEncodingValve} to set default encoding
+     */
+    @Deprecated
+    public static String getDefaultInputEncoding()
+    {
+        return LocaleUtils.getDefaultInputEncoding();
+    }
+
+    /**
+     * Static Helper method for looking up the RunDataService
+     * @return A RunDataService
+     */
+    private RunDataService getRunDataService()
+    {
+        return (RunDataService) 
getServiceManager().getService(RunDataService.SERVICE_NAME);
+    }
+}

Propchange: 
turbine/core/trunk/proposals/gk/log4j2/src/java/org/apache/turbine/Turbine.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to