Modified: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/site/apt/adjust-embedded-tomcat-version.apt.vm URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/site/apt/adjust-embedded-tomcat-version.apt.vm?rev=1617630&r1=1617629&r2=1617630&view=diff ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/site/apt/adjust-embedded-tomcat-version.apt.vm (original) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/site/apt/adjust-embedded-tomcat-version.apt.vm Wed Aug 13 00:17:06 2014 @@ -44,7 +44,7 @@ Adjust Tomcat Version <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> - <artifactId>tomcat7-maven-plugin</artifactId> + <artifactId>tomcat8-maven-plugin</artifactId> <version>${project.version}</version> <dependencies> <dependency>
Modified: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/site/apt/index.apt URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/site/apt/index.apt?rev=1617630&r1=1617629&r2=1617630&view=diff ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/site/apt/index.apt (original) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/site/apt/index.apt Wed Aug 13 00:17:06 2014 @@ -28,7 +28,7 @@ Tomcat Maven Plugin - The Tomcat7 Maven Plugin provides goals to manipulate WAR projects within the {{{http://tomcat.apache.org/}Tomcat}} servlet container version 7.x + The Tomcat8 Maven Plugin provides goals to manipulate WAR projects within the {{{http://tomcat.apache.org/}Tomcat}} servlet container version 7.x * Goals Overview Modified: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/site/apt/usage.apt.vm URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/site/apt/usage.apt.vm?rev=1617630&r1=1617629&r2=1617630&view=diff ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/site/apt/usage.apt.vm (original) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/site/apt/usage.apt.vm Wed Aug 13 00:17:06 2014 @@ -28,7 +28,7 @@ Usage - If no explicit configuration is provided then the Tomcat7 Maven Plugin defaults to + If no explicit configuration is provided then the Tomcat8 Maven Plugin defaults to the following: * Tomcat manager URL of <<<http://localhost:8080/manager>>> @@ -55,7 +55,7 @@ Usage ... <plugin> <groupId>org.apache.tomcat.maven</groupId> - <artifactId>tomcat7-maven-plugin</artifactId> + <artifactId>tomcat8-maven-plugin</artifactId> <version>${project.version}</version> <configuration> <url>http://www.mydomain.com:1234/mymanager</url> @@ -87,7 +87,7 @@ Usage ... <plugin> <groupId>org.apache.tomcat.maven</groupId> - <artifactId>tomcat7-maven-plugin</artifactId> + <artifactId>tomcat8-maven-plugin</artifactId> <version>${project.version}</version> <configuration> <server>myserver</server> @@ -138,7 +138,7 @@ Usage ... <plugin> <groupId>org.apache.tomcat.maven</groupId> - <artifactId>tomcat7-maven-plugin</artifactId> + <artifactId>tomcat8-maven-plugin</artifactId> <version>${project.version}</version> <configuration> <path>/mycontext</path> @@ -167,7 +167,7 @@ Usage ... <plugin> <groupId>org.apache.tomcat.maven</groupId> - <artifactId>tomcat7-maven-plugin</artifactId> + <artifactId>tomcat8-maven-plugin</artifactId> <version>${project.version}</version> <configuration> <path>/\${project.build.finalName}</path> Copied: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8DeployWarOnlyProjectIT.java (from r1612479, tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat7DeployWarOnlyProjectIT.java) URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8DeployWarOnlyProjectIT.java?p2=tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8DeployWarOnlyProjectIT.java&p1=tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat7DeployWarOnlyProjectIT.java&r1=1612479&r2=1617630&rev=1617630&view=diff ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat7DeployWarOnlyProjectIT.java (original) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8DeployWarOnlyProjectIT.java Wed Aug 13 00:17:06 2014 @@ -23,7 +23,7 @@ import org.apache.tomcat.maven.it.Abstra /** * @author Olivier Lamy */ -public class Tomcat7DeployWarOnlyProjectIT +public class Tomcat8DeployWarOnlyProjectIT extends AbstractDeployWarOnlyProjectIT { // no op Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8DeployWarOnlyProjectIT.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8DeployWarOnlyProjectIT.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Copied: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8DeployWarProjectIT.java (from r1612479, tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat7DeployWarProjectIT.java) URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8DeployWarProjectIT.java?p2=tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8DeployWarProjectIT.java&p1=tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat7DeployWarProjectIT.java&r1=1612479&r2=1617630&rev=1617630&view=diff ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat7DeployWarProjectIT.java (original) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8DeployWarProjectIT.java Wed Aug 13 00:17:06 2014 @@ -23,7 +23,7 @@ import org.apache.tomcat.maven.it.Abstra /** * @author Olivier Lamy */ -public class Tomcat7DeployWarProjectIT +public class Tomcat8DeployWarProjectIT extends AbstractDeployWarProjectIT { // no op Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8DeployWarProjectIT.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8DeployWarProjectIT.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Copied: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8RunMultiConfigIT.java (from r1612479, tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat7RunMultiConfigIT.java) URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8RunMultiConfigIT.java?p2=tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8RunMultiConfigIT.java&p1=tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat7RunMultiConfigIT.java&r1=1612479&r2=1617630&rev=1617630&view=diff ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat7RunMultiConfigIT.java (original) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8RunMultiConfigIT.java Wed Aug 13 00:17:06 2014 @@ -24,7 +24,7 @@ import org.apache.tomcat.maven.it.Abstra /** * @author Olivier Lamy */ -public class Tomcat7RunMultiConfigIT +public class Tomcat8RunMultiConfigIT extends AbstractTomcatRunMultiConfigIT { @Override Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8RunMultiConfigIT.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8RunMultiConfigIT.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Copied: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8SimpleWarProjectIT.java (from r1612479, tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat7SimpleWarProjectIT.java) URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8SimpleWarProjectIT.java?p2=tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8SimpleWarProjectIT.java&p1=tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat7SimpleWarProjectIT.java&r1=1612479&r2=1617630&rev=1617630&view=diff ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat7SimpleWarProjectIT.java (original) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8SimpleWarProjectIT.java Wed Aug 13 00:17:06 2014 @@ -24,7 +24,7 @@ import org.apache.tomcat.maven.it.Abstra /** * @author Olivier Lamy */ -public class Tomcat7SimpleWarProjectIT +public class Tomcat8SimpleWarProjectIT extends AbstractSimpleWarProjectIT { protected int getTimeout() Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8SimpleWarProjectIT.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/java/org/apache/tomcat/maven/it/Tomcat8SimpleWarProjectIT.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Modified: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/deploy-only-war-project/pom.xml URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/deploy-only-war-project/pom.xml?rev=1617630&r1=1617629&r2=1617630&view=diff ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/deploy-only-war-project/pom.xml (original) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/deploy-only-war-project/pom.xml Wed Aug 13 00:17:06 2014 @@ -44,7 +44,7 @@ </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> - <artifactId>tomcat7-maven-plugin</artifactId> + <artifactId>tomcat8-maven-plugin</artifactId> <version>${project.version}</version> </plugin> </plugins> @@ -59,7 +59,7 @@ </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> - <artifactId>tomcat7-maven-plugin</artifactId> + <artifactId>tomcat8-maven-plugin</artifactId> <executions> <execution> <id>tomcat-run</id> Modified: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/deploy-war-project/pom.xml URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/deploy-war-project/pom.xml?rev=1617630&r1=1617629&r2=1617630&view=diff ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/deploy-war-project/pom.xml (original) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/deploy-war-project/pom.xml Wed Aug 13 00:17:06 2014 @@ -44,7 +44,7 @@ </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> - <artifactId>tomcat7-maven-plugin</artifactId> + <artifactId>tomcat8-maven-plugin</artifactId> <version>${project.version}</version> </plugin> </plugins> @@ -59,7 +59,7 @@ </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> - <artifactId>tomcat7-maven-plugin</artifactId> + <artifactId>tomcat8-maven-plugin</artifactId> <executions> <execution> <id>tomcat-run</id> Modified: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/simple-war-project/pom.xml URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/simple-war-project/pom.xml?rev=1617630&r1=1617629&r2=1617630&view=diff ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/simple-war-project/pom.xml (original) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/simple-war-project/pom.xml Wed Aug 13 00:17:06 2014 @@ -44,7 +44,7 @@ </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> - <artifactId>tomcat7-maven-plugin</artifactId> + <artifactId>tomcat8-maven-plugin</artifactId> <version>${project.version}</version> </plugin> </plugins> @@ -59,7 +59,7 @@ </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> - <artifactId>tomcat7-maven-plugin</artifactId> + <artifactId>tomcat8-maven-plugin</artifactId> <executions> <execution> <id>tomcat-run</id> Modified: tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/tomcat-run-multi-config/pom.xml URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/tomcat-run-multi-config/pom.xml?rev=1617630&r1=1617629&r2=1617630&view=diff ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/tomcat-run-multi-config/pom.xml (original) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-maven-plugin/src/test/resources/tomcat-run-multi-config/pom.xml Wed Aug 13 00:17:06 2014 @@ -40,7 +40,7 @@ <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> - <artifactId>tomcat7-maven-plugin</artifactId> + <artifactId>tomcat8-maven-plugin</artifactId> <version>${project.version}</version> </plugin> </plugins> @@ -55,7 +55,7 @@ </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> - <artifactId>tomcat7-maven-plugin</artifactId> + <artifactId>tomcat8-maven-plugin</artifactId> <executions> <execution> <id>tomcat-run</id> Added: tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/NOTES.TXT URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/NOTES.TXT?rev=1617630&view=auto ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/NOTES.TXT (added) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/NOTES.TXT Wed Aug 13 00:17:06 2014 @@ -0,0 +1,39 @@ + ~ 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. + +The generated standalone jar will contains: +* wars in the root: foo.war +* tomcat classes in jar +* file tomcat.standalone.properties with possible values : + * useServerXml=true/false to use directly the one provided + in the maven plugin configuration + * wars=foo.war|contextpath;bar.war ( |contextpath is optionnal if empty use the war name) + * enableNaming=true/false + * accessLogValveFormat= + * connectorhttpProtocol: HTTP/1.1 or org.apache.coyote.http11.Http11NioProtocol + +* optionnal: conf/ with usual tomcat configuration files + +On start: +1. create a .extract directory with all the tomcat configuration +2. check if -serverXml is set: if yes use it + 2.1. check in tomcat.standalone.properties if useServerXml=true + if use extract it to .extract/conf and use it with + other files located in /conf (except if .extract already here ) + 2.2. if not use data from cli: -httpPort, -httpsPort, -ajpPort +3. now extract wars to .extract/webapps/ (except if .extract already here ) +4. start Tomcat embded with necessary configuration and add webapps. Added: tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/pom.xml URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/pom.xml?rev=1617630&view=auto ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/pom.xml (added) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/pom.xml Wed Aug 13 00:17:06 2014 @@ -0,0 +1,134 @@ +<?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"> + <modelVersion>4.0.0</modelVersion> + <parent> + <artifactId>tomcat-maven-plugin</artifactId> + <groupId>org.apache.tomcat.maven</groupId> + <version>2.3-SNAPSHOT</version> + </parent> + <artifactId>tomcat8-war-runner</artifactId> + <version>2.3-SNAPSHOT</version> + <name>Apache Tomcat Maven Plugin :: Tomcat 8.x War Runner</name> + + <dependencies> + <dependency> + <groupId>commons-cli</groupId> + <artifactId>commons-cli</artifactId> + </dependency> + + <!-- tomcat dependencies --> + <dependency> + <groupId>org.eclipse.jdt.core.compiler</groupId> + <artifactId>ecj</artifactId> + <version>3.7</version> + </dependency> + + <dependency> + <groupId>org.apache.tomcat.embed</groupId> + <artifactId>tomcat-embed-core</artifactId> + <version>${tomcat8Version}</version> + </dependency> + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-util</artifactId> + <version>${tomcat8Version}</version> + </dependency> + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-coyote</artifactId> + <version>${tomcat8Version}</version> + </dependency> + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-api</artifactId> + <version>${tomcat8Version}</version> + </dependency> + + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-jdbc</artifactId> + <version>${tomcat8Version}</version> + </dependency> + + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-dbcp</artifactId> + <version>${tomcat8Version}</version> + </dependency> + + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-servlet-api</artifactId> + <version>${tomcat8Version}</version> + </dependency> + + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-jsp-api</artifactId> + <version>${tomcat8Version}</version> + </dependency> + + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-jasper</artifactId> + <version>${tomcat8Version}</version> + </dependency> + + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-jasper-el</artifactId> + <version>${tomcat8Version}</version> + </dependency> + + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-el-api</artifactId> + <version>${tomcat8Version}</version> + </dependency> + + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-catalina</artifactId> + <version>${tomcat8Version}</version> + </dependency> + + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-tribes</artifactId> + <version>${tomcat8Version}</version> + </dependency> + + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-catalina-ha</artifactId> + <version>${tomcat8Version}</version> + </dependency> + + <dependency> + <groupId>org.apache.tomcat</groupId> + <artifactId>tomcat-annotations-api</artifactId> + <version>${tomcat8Version}</version> + </dependency> + + </dependencies> + +</project> Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/pom.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/pom.xml ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/PasswordUtil.java URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/PasswordUtil.java?rev=1617630&view=auto ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/PasswordUtil.java (added) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/PasswordUtil.java Wed Aug 13 00:17:06 2014 @@ -0,0 +1,131 @@ +package org.apache.tomcat.maven.runner; + +/* + * 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.util.Properties; + + +/** + * Password obfuscate utility class. Lifted from Jetty org.mortbay.jetty.security.Password + * <p/> + * <p/> + * Passwords that begin with OBF: are de obfuscated. + * <p/> + * Passwords can be obfuscated by running Obfuscate as a main class. Obfuscated password are required if a system needs + * to recover the full password (eg. so that it may be passed to another system). + * <p/> + * They are not secure, but prevent casual observation. + * + * @see <a + * href="http://grepcode.com/file_/repo1.maven.org/maven2/org.mortbay.jetty/jetty/6.1.11/org/mortbay/jetty/security/Password.java/?v=source" + * >Jetty Source org.mortbay.jetty.security.Password</a> + * @since 2.0 + */ +public class PasswordUtil +{ + public static final String __OBFUSCATE = "OBF:"; + + /* ------------------------------------------------------------ */ + public static String obfuscate( String s ) + { + StringBuilder buf = new StringBuilder(); + byte[] b = s.getBytes(); + + buf.append( __OBFUSCATE ); + for ( int i = 0; i < b.length; i++ ) + { + byte b1 = b[i]; + byte b2 = b[s.length() - ( i + 1 )]; + int i1 = 127 + b1 + b2; + int i2 = 127 + b1 - b2; + int i0 = i1 * 256 + i2; + String x = Integer.toString( i0, 36 ); + + switch ( x.length() ) + { + case 1: + buf.append( '0' ); + case 2: + buf.append( '0' ); + case 3: + buf.append( '0' ); + default: + buf.append( x ); + } + } + return buf.toString(); + + } + + /* ------------------------------------------------------------ */ + public static String deobfuscate( String s ) + { + if ( s.startsWith( __OBFUSCATE ) ) + { + s = s.substring( __OBFUSCATE.length() ); + + byte[] b = new byte[s.length() / 2]; + int l = 0; + for ( int i = 0; i < s.length(); i += 4 ) + { + String x = s.substring( i, i + 4 ); + int i0 = Integer.parseInt( x, 36 ); + int i1 = ( i0 / 256 ); + int i2 = ( i0 % 256 ); + b[l++] = (byte) ( ( i1 + i2 - 254 ) / 2 ); + } + return new String( b, 0, l ); + } + else + { + return s; + } + + } + + public static void deobfuscateSystemProps() + { + Properties props = System.getProperties(); + for ( Object obj : props.keySet() ) + { + if ( obj instanceof String ) + { + String key = (String) obj; + String value = (String) props.getProperty( key ); + if ( value != null && value.startsWith( __OBFUSCATE ) ) + { + System.setProperty( key, deobfuscate( value ) ); + } + } + } + } + + public static void main( String[] args ) + { + if ( args[0].startsWith( __OBFUSCATE ) ) + { + System.out.println( PasswordUtil.deobfuscate( args[1] ) ); + } + else + { + System.out.println( PasswordUtil.obfuscate( args[1] ) ); + } + } +} Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/PasswordUtil.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/PasswordUtil.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat8Runner.java URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat8Runner.java?rev=1617630&view=auto ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat8Runner.java (added) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat8Runner.java Wed Aug 13 00:17:06 2014 @@ -0,0 +1,826 @@ +package org.apache.tomcat.maven.runner; +/* + * 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 org.apache.catalina.Context; +import org.apache.catalina.Host; +import org.apache.catalina.connector.Connector; +import org.apache.catalina.core.StandardContext; +import org.apache.catalina.startup.Catalina; +import org.apache.catalina.startup.ContextConfig; +import org.apache.catalina.startup.Tomcat; +import org.apache.catalina.valves.AccessLogValve; +import org.apache.juli.ClassLoaderLogManager; +import org.apache.tomcat.util.ExceptionUtils; +import org.apache.tomcat.util.http.fileupload.FileUtils; + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URISyntaxException; +import java.net.URL; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.StringTokenizer; +import java.util.logging.LogManager; + +/** + * FIXME add junit for that but when https://issues.apache.org/bugzilla/show_bug.cgi?id=52028 fixed + * Main class used to run the standalone wars in a Apache Tomcat instance. + * + * @author Olivier Lamy + * @since 2.0 + */ +public class Tomcat8Runner +{ + // true/false to use the server.xml located in the jar /conf/server.xml + public static final String USE_SERVER_XML_KEY = "useServerXml"; + + // contains war name wars=foo.war,bar.war + public static final String WARS_KEY = "wars"; + + public static final String ARCHIVE_GENERATION_TIMESTAMP_KEY = "generationTimestamp"; + + public static final String ENABLE_NAMING_KEY = "enableNaming"; + + public static final String ACCESS_LOG_VALVE_FORMAT_KEY = "accessLogValveFormat"; + + public static final String CODE_SOURCE_CONTEXT_PATH = "codeSourceContextPath"; + + /** + * key of the property which contains http protocol : HTTP/1.1 or org.apache.coyote.http11.Http11NioProtocol + */ + public static final String HTTP_PROTOCOL_KEY = "connectorhttpProtocol"; + + /** + * key for default http port defined in the plugin + */ + public static final String HTTP_PORT_KEY = "httpPort"; + + + public int httpPort; + + public int httpsPort; + + public int maxPostSize = 2097152; + + public int ajpPort; + + public String serverXmlPath; + + public Properties runtimeProperties; + + public boolean resetExtract; + + public boolean debug = false; + + public String clientAuth = "false"; + + public String keyAlias = null; + + public String httpProtocol; + + public String extractDirectory = ".extract"; + + public File extractDirectoryFile; + + public String codeSourceContextPath = null; + + public File codeSourceWar = null; + + public String loggerName; + + Catalina container; + + Tomcat tomcat; + + String uriEncoding = "ISO-8859-1"; + + /** + * key = context of the webapp, value = war path on file system + */ + Map<String, String> webappWarPerContext = new HashMap<String, String>(); + + public Tomcat8Runner() + { + // no op + } + + public void run() + throws Exception + { + + PasswordUtil.deobfuscateSystemProps(); + + if ( loggerName != null && loggerName.length() > 0 ) + { + installLogger( loggerName ); + } + + this.extractDirectoryFile = new File( this.extractDirectory ); + + debugMessage( "use extractDirectory:" + extractDirectoryFile.getPath() ); + + boolean archiveTimestampChanged = false; + + // compare timestamp stored during previous run if exists + File timestampFile = new File( extractDirectoryFile, ".tomcat_executable_archive.timestamp" ); + + Properties timestampProps = loadProperties( timestampFile ); + + if ( timestampFile.exists() ) + { + String timestampValue = timestampProps.getProperty( Tomcat8Runner.ARCHIVE_GENERATION_TIMESTAMP_KEY ); + if ( timestampValue != null ) + { + long timestamp = Long.parseLong( timestampValue ); + archiveTimestampChanged = + Long.parseLong( runtimeProperties.getProperty( Tomcat8Runner.ARCHIVE_GENERATION_TIMESTAMP_KEY ) ) + > timestamp; + + debugMessage( "read timestamp from file " + timestampValue + ", archiveTimestampChanged: " + + archiveTimestampChanged ); + } + + } + + codeSourceContextPath = runtimeProperties.getProperty( CODE_SOURCE_CONTEXT_PATH ); + if ( codeSourceContextPath != null && !codeSourceContextPath.isEmpty() ) + { + codeSourceWar = AccessController.doPrivileged( new PrivilegedAction<File>() + { + public File run() + { + try + { + File src = + new File( Tomcat8Runner.class.getProtectionDomain().getCodeSource().getLocation().toURI() ); + if ( src.getName().endsWith( ".war" ) ) + { + return src; + } + else + { + debugMessage( "ERROR: Code source is not a war file, ignoring." ); + } + } + catch ( URISyntaxException e ) + { + debugMessage( "ERROR: Could not find code source. " + e.getMessage() ); + + } + return null; + } + } ); + } + + // do we have to extract content + { + if ( !extractDirectoryFile.exists() || resetExtract || archiveTimestampChanged ) + { + extract(); + //if archiveTimestampChanged or timestamp file not exists store the last timestamp from the archive + if ( archiveTimestampChanged || !timestampFile.exists() ) + { + timestampProps.put( Tomcat8Runner.ARCHIVE_GENERATION_TIMESTAMP_KEY, runtimeProperties.getProperty( + Tomcat8Runner.ARCHIVE_GENERATION_TIMESTAMP_KEY ) ); + saveProperties( timestampProps, timestampFile ); + } + } + else + { + String wars = runtimeProperties.getProperty( WARS_KEY ); + populateWebAppWarPerContext( wars ); + } + } + + // create tomcat various paths + new File( extractDirectory, "conf" ).mkdirs(); + new File( extractDirectory, "logs" ).mkdirs(); + new File( extractDirectory, "webapps" ).mkdirs(); + new File( extractDirectory, "work" ).mkdirs(); + File tmpDir = new File( extractDirectory, "temp" ); + tmpDir.mkdirs(); + + System.setProperty( "java.io.tmpdir", tmpDir.getAbsolutePath() ); + + System.setProperty( "catalina.base", extractDirectoryFile.getAbsolutePath() ); + System.setProperty( "catalina.home", extractDirectoryFile.getAbsolutePath() ); + + // start with a server.xml + if ( serverXmlPath != null || useServerXml() ) + { + container = new Catalina(); + container.setUseNaming( this.enableNaming() ); + if ( serverXmlPath != null && new File( serverXmlPath ).exists() ) + { + container.setConfigFile( serverXmlPath ); + } + else + { + container.setConfigFile( new File( extractDirectory, "conf/server.xml" ).getAbsolutePath() ); + } + container.start(); + } + else + { + tomcat = new Tomcat() + { + public Context addWebapp( Host host, String url, String name, String path ) + { + + Context ctx = new StandardContext(); + ctx.setName( name ); + ctx.setPath( url ); + ctx.setDocBase( path ); + + ContextConfig ctxCfg = new ContextConfig(); + ctx.addLifecycleListener( ctxCfg ); + + ctxCfg.setDefaultWebXml( new File( extractDirectory, "conf/web.xml" ).getAbsolutePath() ); + + if ( host == null ) + { + getHost().addChild( ctx ); + } + else + { + host.addChild( ctx ); + } + + return ctx; + } + }; + + if ( this.enableNaming() ) + { + System.setProperty( "catalina.useNaming", "true" ); + tomcat.enableNaming(); + } + + tomcat.getHost().setAppBase( new File( extractDirectory, "webapps" ).getAbsolutePath() ); + + String connectorHttpProtocol = runtimeProperties.getProperty( HTTP_PROTOCOL_KEY ); + + if ( httpProtocol != null && httpProtocol.trim().length() > 0 ) + { + connectorHttpProtocol = httpProtocol; + } + + debugMessage( "use connectorHttpProtocol:" + connectorHttpProtocol ); + + if ( httpPort > 0 ) + { + Connector connector = new Connector( connectorHttpProtocol ); + connector.setPort( httpPort ); + connector.setMaxPostSize( maxPostSize ); + + if ( httpsPort > 0 ) + { + connector.setRedirectPort( httpsPort ); + } + connector.setURIEncoding( uriEncoding ); + + tomcat.getService().addConnector( connector ); + + tomcat.setConnector( connector ); + } + + // add a default acces log valve + AccessLogValve alv = new AccessLogValve(); + alv.setDirectory( new File( extractDirectory, "logs" ).getAbsolutePath() ); + alv.setPattern( runtimeProperties.getProperty( Tomcat8Runner.ACCESS_LOG_VALVE_FORMAT_KEY ) ); + tomcat.getHost().getPipeline().addValve( alv ); + + // create https connector + if ( httpsPort > 0 ) + { + Connector httpsConnector = new Connector( connectorHttpProtocol ); + httpsConnector.setPort( httpsPort ); + httpsConnector.setMaxPostSize( maxPostSize ); + httpsConnector.setSecure( true ); + httpsConnector.setProperty( "SSLEnabled", "true" ); + httpsConnector.setProperty( "sslProtocol", "TLS" ); + httpsConnector.setURIEncoding( uriEncoding ); + + String keystoreFile = System.getProperty( "javax.net.ssl.keyStore" ); + String keystorePass = System.getProperty( "javax.net.ssl.keyStorePassword" ); + String keystoreType = System.getProperty( "javax.net.ssl.keyStoreType", "jks" ); + + if ( keystoreFile != null ) + { + httpsConnector.setAttribute( "keystoreFile", keystoreFile ); + } + if ( keystorePass != null ) + { + httpsConnector.setAttribute( "keystorePass", keystorePass ); + } + httpsConnector.setAttribute( "keystoreType", keystoreType ); + + String truststoreFile = System.getProperty( "javax.net.ssl.trustStore" ); + String truststorePass = System.getProperty( "javax.net.ssl.trustStorePassword" ); + String truststoreType = System.getProperty( "javax.net.ssl.trustStoreType", "jks" ); + if ( truststoreFile != null ) + { + httpsConnector.setAttribute( "truststoreFile", truststoreFile ); + } + if ( truststorePass != null ) + { + httpsConnector.setAttribute( "truststorePass", truststorePass ); + } + httpsConnector.setAttribute( "truststoreType", truststoreType ); + + httpsConnector.setAttribute( "clientAuth", clientAuth ); + httpsConnector.setAttribute( "keyAlias", keyAlias ); + + tomcat.getService().addConnector( httpsConnector ); + + if ( httpPort <= 0 ) + { + tomcat.setConnector( httpsConnector ); + } + } + + // create ajp connector + if ( ajpPort > 0 ) + { + Connector ajpConnector = new Connector( "org.apache.coyote.ajp.AjpProtocol" ); + ajpConnector.setPort( ajpPort ); + ajpConnector.setURIEncoding( uriEncoding ); + tomcat.getService().addConnector( ajpConnector ); + } + + // add webapps + for ( Map.Entry<String, String> entry : this.webappWarPerContext.entrySet() ) + { + String baseDir = null; + Context context = null; + if ( entry.getKey().equals( "/" ) ) + { + baseDir = new File( extractDirectory, "webapps/ROOT.war" ).getAbsolutePath(); + context = tomcat.addWebapp( "", baseDir ); + } + else + { + baseDir = new File( extractDirectory, "webapps/" + entry.getValue() ).getAbsolutePath(); + context = tomcat.addWebapp( entry.getKey(), baseDir ); + } + + URL contextFileUrl = getContextXml( baseDir ); + if ( contextFileUrl != null ) + { + context.setConfigFile( contextFileUrl ); + } + } + + if ( codeSourceWar != null ) + { + String baseDir = new File( extractDirectory, "webapps/" + codeSourceWar.getName() ).getAbsolutePath(); + Context context = tomcat.addWebapp( codeSourceContextPath, baseDir ); + URL contextFileUrl = getContextXml( baseDir ); + if ( contextFileUrl != null ) + { + context.setConfigFile( contextFileUrl ); + } + } + + tomcat.start(); + + Runtime.getRuntime().addShutdownHook( new TomcatShutdownHook() ); + + } + + waitIndefinitely(); + + } + + protected class TomcatShutdownHook + extends Thread + { + + protected TomcatShutdownHook() + { + // no op + } + + @Override + public void run() + { + try + { + Tomcat8Runner.this.stop(); + } + catch ( Throwable ex ) + { + ExceptionUtils.handleThrowable( ex ); + System.out.println( "fail to properly shutdown Tomcat:" + ex.getMessage() ); + } + finally + { + // If JULI is used, shut JULI down *after* the server shuts down + // so log messages aren't lost + LogManager logManager = LogManager.getLogManager(); + if ( logManager instanceof ClassLoaderLogManager ) + { + ( (ClassLoaderLogManager) logManager ).shutdown(); + } + } + } + } + + private URL getContextXml( String warPath ) + throws IOException + { + InputStream inputStream = null; + try + { + String urlStr = "jar:file:" + warPath + "!/META-INF/context.xml"; + debugMessage( "search context.xml in url:'" + urlStr + "'" ); + URL url = new URL( urlStr ); + inputStream = url.openConnection().getInputStream(); + if ( inputStream != null ) + { + return url; + } + } + catch ( FileNotFoundException e ) + { + return null; + } + finally + { + closeQuietly( inputStream ); + } + return null; + } + + private static void closeQuietly( InputStream inputStream ) + { + if ( inputStream == null ) + { + return; + } + try + { + inputStream.close(); + } + catch ( IOException e ) + { + // ignore exception here + } + } + + private void waitIndefinitely() + { + Object lock = new Object(); + + synchronized ( lock ) + { + try + { + lock.wait(); + } + catch ( InterruptedException exception ) + { + throw new Error( "InterruptedException on wait Indefinitely lock:" + exception.getMessage(), + exception ); + } + } + } + + public void stop() + throws Exception + { + if ( container != null ) + { + container.stop(); + } + if ( tomcat != null ) + { + tomcat.stop(); + } + } + + protected void extract() + throws Exception + { + + if ( extractDirectoryFile.exists() ) + { + debugMessage( "delete extractDirectory:" + extractDirectoryFile.getAbsolutePath() ); + FileUtils.deleteDirectory( extractDirectoryFile ); + } + + if ( !this.extractDirectoryFile.exists() ) + { + boolean created = this.extractDirectoryFile.mkdirs(); + if ( !created ) + { + throw new Exception( "FATAL: impossible to create directory:" + this.extractDirectoryFile.getPath() ); + } + } + + // ensure webapp dir is here + boolean created = new File( extractDirectory, "webapps" ).mkdirs(); + if ( !created ) + { + throw new Exception( + "FATAL: impossible to create directory:" + this.extractDirectoryFile.getPath() + "/webapps" ); + + } + + String wars = runtimeProperties.getProperty( WARS_KEY ); + populateWebAppWarPerContext( wars ); + + for ( Map.Entry<String, String> entry : webappWarPerContext.entrySet() ) + { + debugMessage( "webappWarPerContext entry key/value: " + entry.getKey() + "/" + entry.getValue() ); + InputStream inputStream = null; + try + { + File expandFile = null; + inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream( entry.getValue() ); + if ( !useServerXml() ) + { + if ( entry.getKey().equals( "/" ) ) + { + expandFile = new File( extractDirectory, "webapps/ROOT.war" ); + } + else + { + expandFile = new File( extractDirectory, "webapps/" + entry.getValue() ); + } + } + else + { + expandFile = new File( extractDirectory, "webapps/" + entry.getValue() ); + } + + debugMessage( "expand to file:" + expandFile.getPath() ); + + // MTOMCAT-211 ensure parent directories created + File parentFile = expandFile.getParentFile(); + if ( !parentFile.mkdirs() && !parentFile.isDirectory() ) + { + throw new Exception( "FATAL: impossible to create directories:" + parentFile ); + } + + expand( inputStream, expandFile ); + + } + finally + { + if ( inputStream != null ) + { + inputStream.close(); + } + } + } + + //Copy code source to webapps folder + if ( codeSourceWar != null ) + { + FileInputStream inputStream = null; + try + { + File expandFile = new File( extractDirectory, "webapps/" + codeSourceContextPath + ".war" ); + inputStream = new FileInputStream( codeSourceWar ); + debugMessage( "move code source to file:" + expandFile.getPath() ); + expand( inputStream, expandFile ); + } + finally + { + if ( inputStream != null ) + { + inputStream.close(); + } + } + } + + // expand tomcat configuration files if there + expandConfigurationFile( "catalina.properties", extractDirectoryFile ); + expandConfigurationFile( "logging.properties", extractDirectoryFile ); + expandConfigurationFile( "tomcat-users.xml", extractDirectoryFile ); + expandConfigurationFile( "catalina.policy", extractDirectoryFile ); + expandConfigurationFile( "context.xml", extractDirectoryFile ); + expandConfigurationFile( "server.xml", extractDirectoryFile ); + expandConfigurationFile( "web.xml", extractDirectoryFile ); + + } + + private static void expandConfigurationFile( String fileName, File extractDirectory ) + throws Exception + { + InputStream inputStream = null; + try + { + inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream( "conf/" + fileName ); + if ( inputStream != null ) + { + File confDirectory = new File( extractDirectory, "conf" ); + if ( !confDirectory.exists() ) + { + confDirectory.mkdirs(); + } + expand( inputStream, new File( confDirectory, fileName ) ); + } + } + finally + { + if ( inputStream != null ) + { + inputStream.close(); + } + } + + } + + /** + * @param warsValue we can value in format: wars=foo.war|contextpath;bar.war ( |contextpath is optionnal if empty use the war name) + * so here we return war file name and populate webappWarPerContext + */ + private void populateWebAppWarPerContext( String warsValue ) + { + if ( warsValue == null ) + { + return; + } + + StringTokenizer st = new StringTokenizer( warsValue, ";" ); + while ( st.hasMoreTokens() ) + { + String warValue = st.nextToken(); + debugMessage( "populateWebAppWarPerContext warValue:" + warValue ); + String warFileName = ""; + String contextValue = ""; + int separatorIndex = warValue.indexOf( "|" ); + if ( separatorIndex >= 0 ) + { + warFileName = warValue.substring( 0, separatorIndex ); + contextValue = warValue.substring( separatorIndex + 1, warValue.length() ); + + } + else + { + warFileName = contextValue; + } + debugMessage( "populateWebAppWarPerContext contextValue/warFileName:" + contextValue + "/" + warFileName ); + this.webappWarPerContext.put( contextValue, warFileName ); + } + } + + + /** + * Expand the specified input stream into the specified file. + * + * @param input InputStream to be copied + * @param file The file to be created + * @throws java.io.IOException if an input/output error occurs + */ + private static void expand( InputStream input, File file ) + throws IOException + { + BufferedOutputStream output = null; + try + { + output = new BufferedOutputStream( new FileOutputStream( file ) ); + byte buffer[] = new byte[2048]; + while ( true ) + { + int n = input.read( buffer ); + if ( n <= 0 ) + { + break; + } + output.write( buffer, 0, n ); + } + } + finally + { + if ( output != null ) + { + try + { + output.close(); + } + catch ( IOException e ) + { + // Ignore + } + } + } + } + + public boolean useServerXml() + { + return Boolean.parseBoolean( runtimeProperties.getProperty( USE_SERVER_XML_KEY, Boolean.FALSE.toString() ) ); + } + + + public void debugMessage( String message ) + { + if ( debug ) + { + System.out.println( message ); + } + } + + + public boolean enableNaming() + { + return Boolean.parseBoolean( runtimeProperties.getProperty( ENABLE_NAMING_KEY, Boolean.FALSE.toString() ) ); + } + + private void installLogger( String loggerName ) + throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, + InvocationTargetException + { + if ( "slf4j".equals( loggerName ) ) + { + + try + { + // Check class is available + + //final Class<?> clazz = Class.forName( "org.slf4j.bridge.SLF4JBridgeHandler" ); + final Class<?> clazz = + Thread.currentThread().getContextClassLoader().loadClass( "org.slf4j.bridge.SLF4JBridgeHandler" ); + + // Remove all JUL handlers + java.util.logging.LogManager.getLogManager().reset(); + + // Install slf4j bridge handler + final Method method = clazz.getMethod( "install", null ); + method.invoke( null ); + } + catch ( ClassNotFoundException e ) + { + System.out.println( "WARNING: issue configuring slf4j jul bridge, skip it" ); + } + } + else + { + System.out.println( "WARNING: loggerName " + loggerName + " not supported, skip it" ); + } + } + + private Properties loadProperties( File file ) + throws FileNotFoundException, IOException + { + Properties properties = new Properties(); + if ( file.exists() ) + { + + FileInputStream fileInputStream = new FileInputStream( file ); + try + { + properties.load( fileInputStream ); + } + finally + { + fileInputStream.close(); + } + + } + return properties; + } + + private void saveProperties( Properties properties, File file ) + throws FileNotFoundException, IOException + { + FileOutputStream fileOutputStream = new FileOutputStream( file ); + try + { + properties.store( fileOutputStream, "Timestamp file for executable war/jar" ); + } + finally + { + fileOutputStream.close(); + } + } +} Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat8Runner.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat8Runner.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat8RunnerCli.java URL: http://svn.apache.org/viewvc/tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat8RunnerCli.java?rev=1617630&view=auto ============================================================================== --- tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat8RunnerCli.java (added) +++ tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat8RunnerCli.java Wed Aug 13 00:17:06 2014 @@ -0,0 +1,238 @@ +package org.apache.tomcat.maven.runner; +/* + * 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 org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.GnuParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.OptionBuilder; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; +import java.util.Properties; + +/** + * @author Olivier Lamy + * @since 2.0 + */ +@SuppressWarnings("static-access") +public class Tomcat8RunnerCli +{ + + public static final String STAND_ALONE_PROPERTIES_FILENAME = "tomcat.standalone.properties"; + + static Option httpPort = + OptionBuilder.withArgName( "httpPort" ).hasArg().withDescription( "http port to use" ).create( "httpPort" ); + + static Option httpsPort = + OptionBuilder.withArgName( "httpsPort" ).hasArg().withDescription( "https port to use" ).create( "httpsPort" ); + + static Option maxPostSize = + OptionBuilder.withArgName( "maxPostSize" ).hasArg().withDescription( "max post size to use" ).create( + "maxPostSize" ); + + static Option ajpPort = + OptionBuilder.withArgName( "ajpPort" ).hasArg().withDescription( "ajp port to use" ).create( "ajpPort" ); + + static Option serverXmlPath = + OptionBuilder.withArgName( "serverXmlPath" ).hasArg().withDescription( "server.xml to use, optional" ).create( + "serverXmlPath" ); + + static Option resetExtract = + OptionBuilder.withArgName( "resetExtract" ).withDescription( "clean previous extract directory" ).create( + "resetExtract" ); + + static Option help = OptionBuilder.withLongOpt( "help" ).withDescription( "help" ).create( 'h' ); + + static Option debug = OptionBuilder.withLongOpt( "debug" ).withDescription( "debug" ).create( 'X' ); + + static Option sysProps = OptionBuilder.withDescription( "use value for given property" ).hasArgs().withDescription( + "key=value" ).withValueSeparator().create( 'D' ); + + static Option clientAuth = + OptionBuilder.withArgName( "clientAuth" ).withDescription( "enable client authentication for https" ).create( + "clientAuth" ); + + static Option keyAlias = + OptionBuilder.withArgName( "keyAlias" ).hasArgs().withDescription( "alias from keystore for ssl" ).create( + "keyAlias" ); + + static Option obfuscate = + OptionBuilder.withArgName( "password" ).hasArgs().withDescription( "obfuscate the password and exit" ).create( + "obfuscate" ); + + static Option httpProtocol = OptionBuilder.withArgName( "httpProtocol" ).hasArg().withDescription( + "http protocol to use: HTTP/1.1 or org.apache.coyote.http11.Http11NioProtocol" ).create( "httpProtocol" ); + + static Option extractDirectory = OptionBuilder.withArgName( "extractDirectory" ).hasArg().withDescription( + "path to extract war content, default value: .extract" ).create( "extractDirectory" ); + + static Option loggerName = OptionBuilder.withArgName( "loggerName" ).hasArg().withDescription( + "logger to use: slf4j to use slf4j bridge on top of jul" ).create( "loggerName" ); + + static Option uriEncoding = OptionBuilder.withArgName( "uriEncoding" ).hasArg().withDescription( + "connector uriEncoding default ISO-8859-1" ).create( "uriEncoding" ); + + static Options options = new Options(); + + static + { + options.addOption( httpPort ).addOption( httpsPort ).addOption( ajpPort ).addOption( serverXmlPath ).addOption( + resetExtract ).addOption( help ).addOption( debug ).addOption( sysProps ).addOption( + httpProtocol ).addOption( clientAuth ).addOption( keyAlias ).addOption( obfuscate ).addOption( + extractDirectory ).addOption( loggerName ).addOption( uriEncoding ).addOption( maxPostSize ); + } + + + public static void main( String[] args ) + throws Exception + { + CommandLineParser parser = new GnuParser(); + CommandLine line = null; + try + { + line = parser.parse( Tomcat8RunnerCli.options, args ); + } + catch ( ParseException e ) + { + System.err.println( "Parsing failed. Reason: " + e.getMessage() ); + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp( getCmdLineSyntax(), Tomcat8RunnerCli.options ); + System.exit( 1 ); + } + + if ( line.hasOption( help.getOpt() ) ) + { + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp( getCmdLineSyntax(), Tomcat8RunnerCli.options ); + System.exit( 0 ); + } + + if ( line.hasOption( obfuscate.getOpt() ) ) + { + System.out.println( PasswordUtil.obfuscate( line.getOptionValue( obfuscate.getOpt() ) ) ); + System.exit( 0 ); + } + Tomcat8Runner tomcat8Runner = new Tomcat8Runner(); + + tomcat8Runner.runtimeProperties = buildStandaloneProperties(); + + if ( line.hasOption( serverXmlPath.getOpt() ) ) + { + tomcat8Runner.serverXmlPath = line.getOptionValue( serverXmlPath.getOpt() ); + } + + String port = tomcat8Runner.runtimeProperties.getProperty( Tomcat8Runner.HTTP_PORT_KEY ); + if ( port != null ) + { + tomcat8Runner.httpPort = Integer.parseInt( port ); + } + + // cli win for the port + if ( line.hasOption( httpPort.getOpt() ) ) + { + tomcat8Runner.httpPort = Integer.parseInt( line.getOptionValue( httpPort.getOpt() ) ); + } + + if ( line.hasOption( maxPostSize.getOpt() ) ) + { + tomcat8Runner.maxPostSize = Integer.parseInt( line.getOptionValue( maxPostSize.getOpt() ) ); + } + + if ( line.hasOption( httpsPort.getOpt() ) ) + { + tomcat8Runner.httpsPort = Integer.parseInt( line.getOptionValue( httpsPort.getOpt() ) ); + } + if ( line.hasOption( ajpPort.getOpt() ) ) + { + tomcat8Runner.ajpPort = Integer.parseInt( line.getOptionValue( ajpPort.getOpt() ) ); + } + if ( line.hasOption( resetExtract.getOpt() ) ) + { + tomcat8Runner.resetExtract = true; + } + if ( line.hasOption( debug.getOpt() ) ) + { + tomcat8Runner.debug = true; + } + + if ( line.hasOption( httpProtocol.getOpt() ) ) + { + tomcat8Runner.httpProtocol = line.getOptionValue( httpProtocol.getOpt() ); + } + + if ( line.hasOption( sysProps.getOpt() ) ) + { + Properties systemProperties = line.getOptionProperties( sysProps.getOpt() ); + if ( systemProperties != null && !systemProperties.isEmpty() ) + { + for ( Map.Entry<Object, Object> sysProp : systemProperties.entrySet() ) + { + System.setProperty( (String) sysProp.getKey(), (String) sysProp.getValue() ); + } + } + } + if ( line.hasOption( clientAuth.getOpt() ) ) + { + tomcat8Runner.clientAuth = clientAuth.getOpt(); + } + if ( line.hasOption( keyAlias.getOpt() ) ) + { + tomcat8Runner.keyAlias = line.getOptionValue( keyAlias.getOpt() ); + } + + if ( line.hasOption( extractDirectory.getOpt() ) ) + { + tomcat8Runner.extractDirectory = line.getOptionValue( extractDirectory.getOpt() ); + } + + if ( line.hasOption( loggerName.getOpt() ) ) + { + tomcat8Runner.loggerName = line.getOptionValue( loggerName.getOpt() ); + } + + if ( line.hasOption( uriEncoding.getOpt() ) ) + { + tomcat8Runner.uriEncoding = line.getOptionValue( uriEncoding.getOpt() ); + } + + // here we go + tomcat8Runner.run(); + } + + private static Properties buildStandaloneProperties() + throws IOException + { + InputStream is = + Thread.currentThread().getContextClassLoader().getResourceAsStream( STAND_ALONE_PROPERTIES_FILENAME ); + Properties properties = new Properties(); + properties.load( is ); + return properties; + } + + public static String getCmdLineSyntax() + { + return "java -jar [path to your exec war jar]"; + } +} Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat8RunnerCli.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: tomcat/maven-plugin/branches/tc8.x/tomcat8-war-runner/src/main/java/org/apache/tomcat/maven/runner/Tomcat8RunnerCli.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org