Initial revision

git-svn-id: https://svn.apache.org/repos/asf/maven/maven-1/plugins/trunk@112724 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
jvanzyl 2003-01-24 03:44:26 +00:00
parent 66e44f2734
commit 530c640d4f
821 changed files with 55754 additions and 0 deletions

3
.cvsignore Normal file
View File

@ -0,0 +1,3 @@
target
velocity.log
maven.log

3
ant/.cvsignore Normal file
View File

@ -0,0 +1,3 @@
target
velocity.log
maven.log

368
ant/plugin.jelly Normal file
View File

@ -0,0 +1,368 @@
<?xml version="1.0"?>
<project
xmlns:j="jelly:core"
xmlns:u="jelly:util">
<!-- ================================================================== -->
<!-- A N T B U I L D G E N E R A T O R -->
<!-- ================================================================== -->
<!-- This plugin generates a stand alone ant build.xml file that can be -->
<!-- used without having Maven installed. The dependencies are -->
<!-- retrieved using the ant <get> task and then the standard <javac> -->
<!-- and <jar> tasks are used to produce a JAR. This is primarily for -->
<!-- people who want to build from sources but don't want to use Maven. -->
<!-- ================================================================== -->
<goal name="ant"
description="Generate an Ant build file"
prereqs="ant:generate-build"/>
<goal
name="ant:generate-build"
description="Generate an Ant build file">
<j:file name="${maven.ant.generatebuild.file}" prettyPrint="true">
<j:whitespace xmlns="dummy">
<project name="${pom.artifactId}" default="jar" basedir=".">
<property name="defaulttargetdir" value="target"/>
<property name="libdir" value="target/lib" />
<property name="classesdir" value="target/classes"/>
<property name="testclassesdir" value="target/test-classes"/>
<property name="testreportdir" value="target/test-reports"/>
<property name="distdir" value="dist"/>
<property name="javadocdir" value="dist/docs/api"/>
<property name="final.name" value="${maven.final.name}"/>
<target
name="init"
description="o Initializes some properties">
<mkdir dir="$${libdir}"/>
<condition property="noget">
<equals arg1="$${build.sysclasspath}" arg2="only"/>
</condition>
</target>
<target
name="compile"
depends="get-deps"
description="o Compile the code">
<mkdir dir="$${classesdir}"/>
<javac
destdir="$${classesdir}"
excludes="**/package.html"
debug="true"
deprecation="true"
optimize="false">
<src>
<pathelement location="${pom.build.sourceDirectory}"/>
</src>
<classpath>
<fileset dir="$${libdir}">
<include name="*.jar"/>
</fileset>
</classpath>
</javac>
<!-- Copy any resources that must be present in the deployed
JAR file.
-->
<j:forEach var="resource" items="${pom.build.resources}">
<copy todir="$${classesdir}">
<j:set var="dir" value="${resource.directory}"/>
<j:if test="${empty dir}">
<j:set var="dir" value="."/>
</j:if>
<fileset dir="${dir}">
<j:forEach var="res" items="${resource.includes}">
<include name="${res}"/>
</j:forEach>
<j:forEach var="res" items="${resource.excludes}">
<exclude name="${res}"/>
</j:forEach>
</fileset>
</copy>
</j:forEach>
<!-- Copy any resources required for unit testing -->
<j:forEach var="resource" items="${pom.build.unitTest.resources}">
<copy todir="$${testclassesdir}">
<j:set var="dir" value="${resource.directory}"/>
<j:if test="${empty dir}">
<j:set var="dir" value="."/>
</j:if>
<fileset dir="${dir}">
<j:forEach var="pattern" items="${resource.includes}">
<include name="${pattern}"/>
</j:forEach>
<j:forEach var="pattern" items="${resource.excludes}">
<exclude name="${pattern}"/>
</j:forEach>
</fileset>
</copy>
</j:forEach>
</target>
<target
name="jar"
depends="compile,test"
description="o Create the jar">
<jar
jarfile="target/$${final.name}.jar"
basedir="$${classesdir}"
excludes="**/package.html"
/>
</target>
<target
name="clean"
description="o Clean up the generated directories">
<delete dir="$${defaulttargetdir}"/>
<delete dir="$${distdir}"/>
</target>
<target
name="dist"
depends="jar, javadoc"
description="o Create a distribution">
<mkdir dir="dist"/>
<copy todir="dist">
<fileset dir="$${defaulttargetdir}" includes="*.jar"/>
<fileset dir="$${basedir}" includes="LICENSE*, README*"/>
</copy>
</target>
<target
name="test"
depends="internal-test"
if="test.failure"
description="o Run the test cases">
<fail message="There were test failures."/>
</target>
<target
name="internal-test"
depends="compile-tests">
<j:if test="${unitTestSourcesPresent}">
<mkdir dir="$${testreportdir}"/>
<junit printSummary="yes"
haltonerror="true"
failureproperty="test.failure"
fork="true"
dir="./">
<!--
I think the following is wrong
<sysproperty key="basedir" value="${pom.build.unitTestSourceDirectory}"/>
<sysproperty key="basedir" value="${basedir}"/> // this gives a full path
including the C:\ on windows
-->
<sysproperty key="basedir" value="."/>
<formatter type="xml"/>
<formatter type="plain" usefile="false"/>
<classpath>
<fileset dir="$${libdir}">
<include name="*.jar"/>
</fileset>
<pathelement path="$${testclassesdir}"/>
<pathelement path="$${classesdir}"/>
</classpath>
<batchtest todir="$${testreportdir}">
<fileset dir="${pom.build.unitTestSourceDirectory}">
<j:forEach var="pat" items="${pom.build.unitTest.includes}">
<include name="${pat}"/>
</j:forEach>
<j:forEach var="pat" items="${pom.build.unitTest.excludes}">
<exclude name="${pat}"/>
</j:forEach>
<!-- add extra excludes if the property is set -->
<j:if test="${context.getVariable('maven.ant.excludeTests') != null}">
<u:tokenize var="patterns" delim=",">${maven.ant.excludeTests}</u:tokenize>
<j:forEach var="pattern" items="${patterns}">
<exclude name="${pattern}" />
</j:forEach>
</j:if>
</fileset>
</batchtest>
</junit>
</j:if>
</target>
<target
name="compile-tests"
depends="compile">
<j:if test="${unitTestSourcesPresent}">
<mkdir dir="$${testclassesdir}"/>
<javac
destdir="$${testclassesdir}"
excludes="**/package.html"
debug="true"
deprecation="true"
optimize="false">
<src>
<pathelement location="${pom.build.unitTestSourceDirectory}"/>
</src>
<classpath>
<fileset dir="$${libdir}">
<include name="*.jar"/>
</fileset>
<pathelement path="$${classesdir}"/>
</classpath>
</javac>
<j:choose trim="true">
<j:when test="${!pom.build.unitTest.resources.includes.isEmpty()}">
<j:set var="maven.has.test.resource.patterns" value="true"/>
</j:when>
<j:when test="${!pom.build.unitTest.resources.excludes.isEmpty()}">
<j:set var="maven.has.test.resource.patterns" value="true"/>
</j:when>
</j:choose>
<j:if test="${maven.has.test.resource.patterns}">
<copy todir="$${testclassesdir}">
<fileset dir="${pom.build.unitTestSourceDirectory}">
<j:forEach var="res" items="${pom.build.unitTest.resources.includes}">
<include name="${res}"/>
</j:forEach>
<j:forEach var="res" items="${pom.build.unitTest.resources.excludes}">
<exclude name="${res}"/>
</j:forEach>
</fileset>
</copy>
</j:if>
</j:if>
</target>
<target
name="javadoc"
depends="jar"
description="o Generate javadoc">
<mkdir dir="$${javadocdir}"/>
<!-- Get the year to display in the Javadocs -->
<tstamp>
<format property="year" pattern="${pom.inceptionYear}-yyyy"/>
</tstamp>
<property
name="copyright"
value="Copyright &amp;copy; ${year} ${pom.organization.name}. All Rights Reserved."
/>
<property
name="title"
value="${pom.name} ${pom.currentVersion} API"
/>
<javadoc
sourcepath="${pom.build.sourceDirectory}"
packagenames="${pom.package}.*"
destdir="$${javadocdir}"
author="true"
private="true"
version="true"
use="true"
windowtitle="${title}"
doctitle="${title}"
bottom="${copyright}">
<classpath>
<fileset dir="$${libdir}">
<include name="*.jar"/>
</fileset>
<pathelement location="target/$${final.name}.jar"/>
</classpath>
</javadoc>
</target>
<target
name="get-deps"
depends="init"
unless="noget">
<j:forEach var="dep" items="${pom.dependencies}">
<get
src="${maven.repo.remote}/${dep.artifactDirectory}/jars/${dep.artifact}"
dest="$${libdir}/${dep.artifact}"
usetimestamp="true"
ignoreerrors="true"
/></j:forEach>
<!-- force junit for tests -->
<get
src="${maven.repo.remote}/junit/jars/junit-3.8.1.jar"
dest="$${libdir}/junit-3.8.1.jar"
usetimestamp="true"
ignoreerrors="true"/>
<get
src="${maven.repo.remote}/ant/jars/ant-1.5.jar"
dest="$${libdir}/ant-1.5.jar"
usetimestamp="true"
ignoreerrors="true"/>
<get
src="${maven.repo.remote}/ant/jars/ant-optional-1.5.jar"
dest="$${libdir}/ant-optional-1.5.jar"
usetimestamp="true"
ignoreerrors="true"/>
</target>
<!-- ================================================================== -->
<!-- A N T A U T O I N S T A L L E R -->
<!-- ================================================================== -->
<!-- For users that have Ant installed Maven can be automatically -->
<!-- installed by answering a few simple questions. We only need to -->
<!-- know what the user wants for ${maven.home} and ${maven.repo.local} -->
<!-- and we're set. -->
<!-- ================================================================== -->
<target
name="install-maven">
<!--
Ask the user what they would like to use for
${maven.home}
${maven.repo.local}
-->
<get
src="$${maven.repo.remote}/maven/maven-install-latest.jar"
dest="$${user.home}/maven-install-latest.jar"
usetimestamp="true"
/>
<unjar
src="$${user.home}/maven-install-latest.jar"
dest="$${maven.home}"
/>
</target>
</project>
</j:whitespace>
</j:file>
</goal>
</project>

8
ant/plugin.properties Normal file
View File

@ -0,0 +1,8 @@
# -------------------------------------------------------------------
# Default Maven properties for the ant Plugin
# -------------------------------------------------------------------
# These are the properties that we believe are immutable so we
# keep them apart from the project specific properties.
# -------------------------------------------------------------------
maven.ant.generatebuild.file = build.xml

7
ant/project.properties Normal file
View File

@ -0,0 +1,7 @@
# -------------------------------------------------------------------
# P R O J E C T P R O P E R T I E S
# -------------------------------------------------------------------
#maven.jarResources.basedir = src
maven.xdoc.date=left
maven.xdoc.version=${pom.currentVersion}

46
ant/project.xml Normal file
View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project>
<extend>${basedir}/../project.xml</extend>
<pomVersion>3</pomVersion>
<id>maven-ant-plugin</id>
<name>Maven Ant Plug-in</name>
<currentVersion>1.2-SNAPSHOT</currentVersion>
<description>
Generates ant build files from a maven project, so that plain
ant users can build your project
</description>
<shortDescription>Java Project Management Tools</shortDescription>
<url>http://jakarta.apache.org/turbine/maven/reference/plugins/ant/</url>
<issueTrackingUrl>http://jira.werken.com/BrowseProject.jspa?id=10030</issueTrackingUrl>
<siteAddress>jakarta.apache.org</siteAddress>
<siteDirectory>/www/jakarta.apache.org/turbine/maven/reference/plugins/ant/</siteDirectory>
<distributionDirectory>/www/jakarta.apache.org/builds/jakarta-turbine-maven/</distributionDirectory>
<developers>
<developer>
<name>dIon Gillard</name>
<id>dion</id>
<email>dion@multitask.com.au</email>
<organization>Multitask Consulting</organization>
<roles>
<role>Java Developer</role>
</roles>
</developer>
<developer>
<name>Jason van Zyl</name>
<id>jvanzyl</id>
<email>jason@zenplex.com</email>
<organization>Zenplex</organization>
<roles>
<role>Architect</role>
<role>Release Manager</role>
</roles>
</developer>
</developers>
</project>

1
ant/xdocs/.cvsignore Normal file
View File

@ -0,0 +1 @@
stylesheets

53
ant/xdocs/changes.xml Normal file
View File

@ -0,0 +1,53 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Changes</title>
<author email="dion@multitask.com.au">dIon Gillard</author>
</properties>
<body>
<release version="1.2" date="in CVS">
<action dev="dion" type="add">
Added the new maven.ant.excludedTests property
</action>
<action dev="dion" type="fix">
If a project has no test source, the test targets are empty.
</action>
<action dev="jcej" type="fix">
<p>
Fixing a chicken-and-egg problem. The "test" and "compile-tests"
tasks were putting target/${final.name}.jar into the classpath.
</p>
<p>
But... the "jar" target that creates that jarfile is dependent
upon those two targets.
</p>
<p>
So, there was no way for the first two to succeed since the
jarfile couldn't be created. Now, the first two include target/classes
in the classpath and all is well.
</p>
</action>
<action dev="jcej" type="add">
Added the maven.ant.generatebuild.file property and docs
</action>
<action dev="dion" type="add">
Added more documentation on properties and supported SCM systems
</action>
</release>
<release version="1.1" date="2002-09-15">
<action dev="dion" type="update">
Fix documentation
</action>
<action dev="dion" type="fix">
Fix for bug Maven-52: generated ant build should execute the unit tests before generating a jar.
</action>
</release>
<release version="1.0" date="2002-08-04">
<action dev="jvanzyl" type="add">
Original release for Maven 1.0-beta6
</action>
</release>
</body>
</document>

36
ant/xdocs/goals.xml Normal file
View File

@ -0,0 +1,36 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Maven Ant Plug-in Goals</title>
<author email="dion@multitask.com.au">dIon Gillard</author>
</properties>
<body>
<goals>
<goal>
<name>ant</name>
<description>
This is the default goal of the plugin and simply attains
the <code>ant:generate-build</code> goal.
</description>
</goal>
<goal>
<name>ant:generate-build</name>
<description>
Generates an <a href="http://jakarta.apache.org/ant/">ant</a>
<code>build.xml</code> in the current directory which has targets to
<ul>
<li>Compile the java source code</li>
<li>Create a jar from the compiled java code</li>
<li>Create a distribution</li>
<li>Run unit tests</li>
<li>Generate JavaDoc</li>
<li>Download all required jar files</li>
<li>Download and install Maven</li>
</ul>
</description>
</goal>
</goals>
</body>
</document>

27
ant/xdocs/index.xml Normal file
View File

@ -0,0 +1,27 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Maven Ant Plug-in</title>
<author email="jason@zenplex.com">Jason van Zyl</author>
</properties>
<body>
<section name="Maven Ant Plug-in">
<p>
This plugin generates a vanilla ant build.xml file that so that user's
that haven't installed Maven can still build. Though it is always
highly recommended that you install Maven :-)
</p>
<p>
For more information on the functionality provided by this plugin,
please see the <a href="goals.html">Goals</a> document.
</p>
<p>
For more information on how to customise the functionality provided
by this plugin, please see the <a href="properties.html">properties</a>
document.
</p>
</section>
</body>
</document>

16
ant/xdocs/navigation.xml Normal file
View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="Maven Ant Plugin">
<title>Maven Ant Plugin</title>
<body>
<links>
<item name="Maven" href="http://jakarta.apache.org/turbine/maven/"/>
<item name="Ant" href="http://jakarta.apache.org/ant/"/>
</links>
<menu name="Overview">
<item name="Goals" href="/goals.html" />
<item name="Properties" href="/properties.html" />
</menu>
</body>
</project>

44
ant/xdocs/properties.xml Normal file
View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<document>
<properties>
<title>Maven Ant Plugin Properties</title>
<author email="dion@multitask.com.au">dIon Gillard</author>
</properties>
<body>
<section name="Maven Ant Plugin Settings">
<table>
<tr>
<th>Property name</th>
<th>Optional?</th>
<th>Description</th>
</tr>
<tr>
<td>maven.ant.excludeTests</td>
<td>Yes</td>
<td>
Holds a comma separated list of source file patterns that
will be excluded in the generated Ant build, e.g.
</td>
</tr>
<tr>
<td colspan="3">
<source>
maven.ant.excludeTests=**/*Test.java,**/*Suite.java
</source>
</td>
</tr>
<tr>
<td>maven.ant.generatebuild.file</td>
<td>Yes</td>
<td>
Sets the name of the ant buildfile to create.
Defaults to "build.xml". This is used by the "ant:generate-build"
goal.
</td>
</tr>
</table>
</section>
</body>
</document>

3
antlr/.cvsignore Normal file
View File

@ -0,0 +1,3 @@
target
velocity.log
maven.log

46
antlr/plugin.jelly Normal file
View File

@ -0,0 +1,46 @@
<?xml version="1.0"?>
<project xmlns:j="jelly:core"
xmlns:antlr="jelly:antlr"
xmlns:util="jelly:util"
xmlns:maven="jelly:maven">
<j:set var="antlrSrcDir" value="${maven.antlr.src.dir}"/>
<goal name="antlr:prepare-filesystem"
description="Make any necessary directories for antlr processing">
<j:if test="${!antlrSrcDir.equals('MAVEN_ANTLR_SRC_DIR_NOT_SET')}">
<mkdir dir="${maven.build.dir}/antlr"/>
</j:if>
</goal>
<goal name="antlr:generate"
description="Generate source from antlr grammars"
prereqs="antlr:prepare-filesystem">
<j:if test="${!antlrSrcDir.equals('MAVEN_ANTLR_SRC_DIR_NOT_SET')}">
<path id="maven.antlr.compile.src.set"
location="${maven.build.dir}/antlr"/>
<maven:addPath id="maven.compile.src.set"
refid="maven.antlr.compile.src.set"/>
<util:tokenize var="grammars" delim=" ">
${maven.antlr.grammars}
</util:tokenize>
<antlr:antlr outputDir="${maven.build.dir}/antlr">
<j:forEach var="grammar" items="${grammars.iterator()}">
<antlr:grammar>${grammar}</antlr:grammar>
</j:forEach>
</antlr:antlr>
</j:if>
</goal>
<preGoal name="java:compile">
<j:if test="${!antlrSrcDir.equals('MAVEN_ANTLR_SRC_DIR_NOT_SET')}">
<attainGoal name="antlr:generate"/>
</j:if>
</preGoal>
</project>

1
antlr/plugin.properties Normal file
View File

@ -0,0 +1 @@
maven.antlr.src.dir=MAVEN_ANTLR_SRC_DIR_NOT_SET

5
antlr/project.properties Normal file
View File

@ -0,0 +1,5 @@
# -------------------------------------------------------------------
# P R O J E C T P R O P E R T I E S
# -------------------------------------------------------------------
maven.xdoc.date=left
maven.xdoc.version=${pom.currentVersion}

89
antlr/project.xml Normal file
View File

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project>
<extend>${basedir}/../project.xml</extend>
<pomVersion>3</pomVersion>
<id>maven-antlr-plugin</id>
<name>Maven Antlr Plugin</name>
<currentVersion>1.1-SNAPSHOT</currentVersion>
<description>
</description>
<shortDescription>Java Project Management Tools</shortDescription>
<url>http://jakarta.apache.org/turbine/maven/reference/plugins/antlr/</url>
<issueTrackingUrl>http://jira.werken.com/BrowseProject.jspa?id=10030</issueTrackingUrl>
<siteAddress>jakarta.apache.org</siteAddress>
<siteDirectory>/www/jakarta.apache.org/turbine/maven/reference/plugins/antlr/</siteDirectory>
<distributionDirectory>/www/jakarta.apache.org/builds/jakarta-turbine-maven/</distributionDirectory>
<developers>
<developer>
<name>dIon Gillard</name>
<id>dion</id>
<email>dion@multitask.com.au</email>
<organization>Multitask Consulting</organization>
<roles>
<role>Documentation</role>
</roles>
</developer>
<developer>
<name>Stéphane Mor</name>
<id>smor</id>
<email>stephanemor@yahoo.fr</email>
<organization>Hasgard Systèmes et Réseaux</organization>
<roles>
<role>Java Developer</role>
</roles>
</developer>
<developer>
<name>Jason van Zyl</name>
<id>jvanzyl</id>
<email>jason@zenplex.com</email>
<organization>Zenplex</organization>
<roles>
<role>Architect</role>
<role>Release Manager</role>
</roles>
</developer>
</developers>
<dependencies>
<dependency>
<id>ant</id>
<version>1.5.1</version>
<properties>
<classloader>root</classloader>
</properties>
</dependency>
<dependency>
<id>commons-jelly+tags-antlr</id>
<version>SNAPSHOT</version>
<properties>
<classloader>root.maven</classloader>
</properties>
</dependency>
<dependency>
<id>commons-lang</id>
<version>1.0-b1.1</version>
<properties>
<classloader>root.maven</classloader>
</properties>
</dependency>
<dependency>
<id>antlr</id>
<version>2.7.1</version>
<jar>antlrall-2.7.1.jar</jar>
<properties>
<classloader>root</classloader>
</properties>
</dependency>
</dependencies>
</project>

1
antlr/xdocs/.cvsignore Normal file
View File

@ -0,0 +1 @@
stylesheets

22
antlr/xdocs/changes.xml Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Changes</title>
<author email="dion@multitask.com.au">dIon Gillard</author>
</properties>
<body>
<release version="1.1" date="in CVS">
<action dev="dion" type="add">
Added documentation for navigation, changes, properties and goals
</action>
</release>
<release version="1.0" date="2002-07-16">
<action dev="jvanzyl" type="add">
Original release for Maven 1.0-beta6
</action>
</release>
</body>
</document>

49
antlr/xdocs/goals.xml Normal file
View File

@ -0,0 +1,49 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Maven Ant Plug-in Goals</title>
<author email="dion@multitask.com.au">dIon Gillard</author>
</properties>
<body>
<section name="Goals">
<p>
<strong>Note:</strong> The goals in this plugin are only executed
when the <a href="properties.html">maven.antlr.src.dir</a> property
is set
</p>
<table>
<tr><th>Goal</th><th>Description</th></tr>
<tr>
<td>antlr:generate</td>
<td>
<p>
Generates code for all grammars defined in the
<a href="properties.html">${maven.antlr.grammars}</a>
property.
</p>
<p>
This goal is called before the <code>java:compile</code>
goal so that code is generated before compilation.
</p>
</td>
</tr>
<tr>
<td>antlr:prepare-filesystem</td>
<td>
<p>
Creates the <code>${maven.build.dir}/antlr</code>
directory which holds antlr generated code.
</p>
<p>
This directory is added to the code to be compiled by
Maven, as specified by the <code>maven.compile.src.set</code>
property.
</p>
</td>
</tr>
</table>
</section>
</body>
</document>

30
antlr/xdocs/index.xml Normal file
View File

@ -0,0 +1,30 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Maven Antlr Plug-in</title>
<author email="dion@multitask.com.au">dIon Gillard</author>
</properties>
<body>
<section name="Maven Antlr Plug-in">
<p>
This plugin generates code based on user-supplied Antlr grammars.
</p>
<p>
The code is automatically generated before the <code>java:compile</code>
goal, so that the generated code is automatically processed as if
it was part of the normal application source code.
</p>
<p>
For more information on the functionality provided by this plugin,
please see the <a href="goals.html">Goals</a> document.
</p>
<p>
For more information on how to customise the functionality provided
by this plugin, please see the <a href="properties.html">properties</a>
document.
</p>
</section>
</body>
</document>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="Maven Activity Plugin">
<title>Maven Antlr Plugin</title>
<body>
<links>
<item name="Maven" href="http://jakarta.apache.org/turbine/maven/"/>
<item name="Antlr" href="http://www.antlr.org/"/>
</links>
<menu name="Overview">
<item name="Goals" href="/goals.html" />
<item name="Properties" href="/properties.html" />
</menu>
</body>
</project>

View File

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<document>
<properties>
<title>Maven Antlr Plugin Properties</title>
<author email="dion@multitask.com.au">dIon Gillard</author>
</properties>
<body>
<section name="Maven Antlr Plugin Settings">
<table>
<tr>
<th>Property name</th>
<th>Optional?</th>
<th>Description</th>
</tr>
<tr>
<td>maven.antlr.grammars</td>
<td>No</td>
<td>
Sets the grammars to generate code for.
</td>
</tr>
<tr>
<td>maven.antlr.src.dir</td>
<td>No</td>
<td>
Must be set to allow antlr processing to happen.
<strong>FIXME: It appears this property isn't used?</strong>
</td>
</tr>
</table>
</section>
<section name="Other properties used">
<table>
<tr>
<th>Property name</th>
<th>Optional?</th>
<th>Description</th>
</tr>
<tr>
<td>maven.build.dir</td>
<td>Yes</td>
<td>
This is the directory that output files are generated to. The
antlr generated code is placed in the <code>antlr</code>
directory below this
</td>
</tr>
<tr>
<td>maven.compile.src.set</td>
<td>Yes</td>
<td>
The source directories maven uses to compile java code.
The antlr plugin adds the directory it generates code to
this path, so that generated code is compiled seamlessly
</td>
</tr>
</table>
</section>
</body>
</document>

125
aspectj/plugin.jelly Normal file
View File

@ -0,0 +1,125 @@
<?xml version="1.0"?>
<project xmlns:j="jelly:core" xmlns:util="jelly:util">
<!--==================================================================-->
<!-- Compile all source code, weaving the Aspects -->
<!--==================================================================-->
<goal name="aspectj"
description="Compile code with AspectJ"
prereqs="aspectj:compile"/>
<goal name="aspectj:compile"
description="Compile code with AspectJ">
<j:if test="${sourcesPresent == 'true'}">
<taskdef name="ajc" classname="org.aspectj.tools.ant.taskdefs.Ajc"/>
<available property="aspectSourcesPresent"
file="${pom.build.aspectSourceDirectory}"/>
<uptodate property="aspectj.compile.notRequired"
targetfile="${maven.build.dir}/${maven.final.name}.jar">
<srcfiles dir="${pom.build.sourceDirectory}"/>
<j:if test="${aspectSourcesPresent == 'true'}">
<srcfiles dir="${pom.build.aspectSourceDirectory}"/>
</j:if>
</uptodate>
<j:set var="aspectjCompileNotRequired" value="${aspectj.compile.notRequired}"/>
<j:if test="${aspectjCompileNotRequired == null}">
<ajc
destdir="${maven.build.dest}"
excludes="**/package.html"
debug="${maven.compile.debug}"
deprecation="${maven.compile.deprecation}"
optimize="${maven.compile.optimize}">
<src>
<path refid="maven.compile.src.set"/>
<j:if test="${aspectSourcesPresent == 'true'}">
<pathelement location="${pom.build.aspectSourceDirectory}"/>
</j:if>
</src>
<j:forEach var="sm" items="${pom.build.sourceModifications}">
<available property="classPresent" classname="${sm.className}"/>
<j:if test="${classPresent != 'true'}">
<j:forEach var="exclude" items="${sm.excludes}">
<exclude name="${exclude}"/>
</j:forEach>
</j:if>
</j:forEach>
<classpath>
<path refid="maven.dependency.classpath"/>
<pathelement path="${maven.build.dest}"/>
<pathelement path="${plugin.getDependencyPath('aspectj:aspectjrt')}"/>
</classpath>
</ajc>
</j:if>
</j:if>
</goal>
<goal name="aspectj:ajdoc" description="Javadoc source using ajdoc">
<j:if test="${sourcesPresent == 'true'}">
<taskdef name="ajdoc" classname="org.aspectj.tools.ant.taskdefs.Ajdoc" />
<available property="aspectSourcesPresent"
file="${pom.build.aspectSourceDirectory}"/>
<!-- retrieve various javadoc plugin vars -->
<util:tokenize var="javadocVarList" delim=",">
maven.javadoc.author,maven.javadoc.destdir,
maven.javadoc.links,maven.javadoc.maxmemory,
maven.javadoc.private,maven.javadoc.stylesheet,
maven.javadoc.use,maven.javadoc.version
</util:tokenize>
<j:forEach var="javadocVar" items="${javadocVarList}">
<j:set var="javadocVar" value="${javadocVar.trim()}" />
<j:set var="${javadocVar}"
value="${pom.getPluginContext('maven-javadoc-plugin').getVariable(javadocVar)}"/>
</j:forEach>
<ajdoc packagenames="${pom.package}.*"
destdir="${maven.javadoc.destdir}"
author="${maven.javadoc.author}"
private="${maven.javadoc.private}"
version="${maven.javadoc.version}"
use="${maven.javadoc.use}"
windowtitle="${title}"
doctitle="${title}"
bottom="${copyright}"
stylesheetfile="${maven.javadoc.stylesheet}">
<j:forEach var="link" items="${links}">
<link href="${link.trim()}"/>
</j:forEach>
<classpath>
<path refid="maven.dependency.classpath"/>
<path location="${maven.build.dest}"/>
<pathelement path="${plugin.getDependencyPath('aspectj:aspectjrt')}"/>
</classpath>
<sourcepath>
<path refid="maven.compile.src.set"/>
<j:if test="${aspectSourcesPresent == 'true'}">
<pathelement location="${pom.build.aspectSourceDirectory}"/>
</j:if>
</sourcepath>
</ajdoc>
</j:if>
</goal>
</project>

View File

@ -0,0 +1,5 @@
# -------------------------------------------------------------------
# P R O J E C T P R O P E R T I E S
# -------------------------------------------------------------------
maven.xdoc.date=left
maven.xdoc.version=${pom.currentVersion}

90
aspectj/project.xml Normal file
View File

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project>
<extend>${basedir}/../project.xml</extend>
<pomVersion>3</pomVersion>
<id>maven-aspectj-plugin</id>
<name>Maven AspectJ Plug-in</name>
<currentVersion>1.1-SNAPSHOT</currentVersion>
<description>
</description>
<shortDescription>Eclipse Plugin for AspectJ</shortDescription>
<url>http://jakarta.apache.org/turbine/maven/reference/plugins/aspectj/</url>
<issueTrackingUrl>http://jira.werken.com/BrowseProject.jspa?id=10030</issueTrackingUrl>
<siteAddress>jakarta.apache.org</siteAddress>
<siteDirectory>/www/jakarta.apache.org/turbine/maven/reference/plugins/aspectj/</siteDirectory>
<distributionDirectory>/www/jakarta.apache.org/builds/jakarta-turbine-maven/</distributionDirectory>
<developers>
<developer>
<name>dIon Gillard</name>
<id>dion</id>
<email>dion@multitask.com.au</email>
<organization>Multitask Consulting</organization>
<roles>
<role>Documentation</role>
</roles>
</developer>
<developer>
<name>Vincent Massol</name>
<id>vmassol</id>
<email>vmassol@octo.com</email>
<organization>Octo Technology</organization>
<roles>
<role>Java Developer</role>
</roles>
</developer>
</developers>
<dependencies>
<dependency>
<id>aspectj:aspectjrt</id>
<version>1.0.6</version>
<properties>
<classloader>root</classloader>
</properties>
</dependency>
<dependency>
<id>aspectj:aspectj-ant</id>
<version>1.0.6</version>
<properties>
<classloader>root</classloader>
</properties>
</dependency>
<dependency>
<id>aspectj:aspectj-tools</id>
<version>1.0.6</version>
<properties>
<classloader>root</classloader>
</properties>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>${basedir}</directory>
<excludes>
<exclude>target/**</exclude>
<exclude>src/**</exclude>
<exclude>xdocs/**</exclude>
<exclude>maven.xml</exclude>
<exclude>maven.log</exclude>
<exclude>velocity.log</exclude>
<exclude>.cvsignore</exclude>
</excludes>
</resource>
</resources>
</build>
</project>

1
aspectj/xdocs/.cvsignore Normal file
View File

@ -0,0 +1 @@
stylesheets

22
aspectj/xdocs/changes.xml Normal file
View File

@ -0,0 +1,22 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Changes</title>
<author email="dion@multitask.com.au">dIon Gillard</author>
</properties>
<body>
<release version="1.1" date="in CVS">
<action dev="dion" type="add">
Added documentation for navigation, changes, properties and goals
</action>
</release>
<release version="1.0" date="2002-07-16">
<action dev="jvanzyl" type="add">
Original release for Maven 1.0-beta6
</action>
</release>
</body>
</document>

42
aspectj/xdocs/goals.xml Normal file
View File

@ -0,0 +1,42 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Maven AspectJ Plug-in Goals</title>
<author email="dion@multitask.com.au">dIon Gillard</author>
</properties>
<body>
<section name="Goals">
<table>
<tr><th>Goal</th><th>Description</th></tr>
<tr>
<td>aspectj</td>
<td>
This is the default goal of the plugin and simply attains
the <code>aspectj:compile</code> goal.
</td>
</tr>
<tr>
<td>aspectj:compile</td>
<td>
Compiles source code as found in the
<source><![CDATA[
<build>
<aspectSourceDirectory>...</aspectSourceDirectory>
</build>
]]>
</source>
element from your
<a href="http://jakarta.apache.org/turbine/maven/reference/project-descriptor.html">
project descriptor</a>
<p>
Code is only recompiled if any of the source is newer than
the jar file
</p>
</td>
</tr>
</table>
</section>
</body>
</document>

26
aspectj/xdocs/index.xml Normal file
View File

@ -0,0 +1,26 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Maven AspectJ Plug-in</title>
<author email="dion@multitask.com.au">dIon Gillard</author>
</properties>
<body>
<section name="Maven AspectJ Plug-in">
<p>
This plugin provides the basic facilities for compiling
code using AspectJ.
</p>
<p>
For more information on the functionality provided by this plugin,
please see the <a href="goals.html">Goals</a> document.
</p>
<p>
For more information on how to customise the functionality provided
by this plugin, please see the <a href="properties.html">properties</a>
document.
</p>
</section>
</body>
</document>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="Maven AspectJ Plugin">
<title>Maven AspectJ Plugin</title>
<body>
<links>
<item name="Maven" href="http://jakarta.apache.org/turbine/maven/"/>
<item name="AspectJ" href="http://www.aspectj.org/"/>
</links>
<menu name="Overview">
<item name="Goals" href="/goals.html" />
<item name="Properties" href="/properties.html" />
</menu>
</body>
</project>

View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<document>
<properties>
<title>Maven AspectJ Plugin Properties</title>
<author email="dion@multitask.com.au">dIon Gillard</author>
</properties>
<body>
<section name="Maven AspectJ Plugin Settings">
<table>
<tr>
<th>Property name</th>
<th>Optional?</th>
<th>Description</th>
</tr>
<tr>
<td>maven.compile.debug</td>
<td>Yes</td>
<td>
Specifies wether to include debugging information in the compiled
class files; the default value is <code>on</code>.
Used by the "java:compile" goal.
</td>
</tr>
<tr>
<td>maven.compile.deprecation</td>
<td>Yes</td>
<td>
Specifies wether source should be compiled with deprecation
information; the default value is <code>off</code>.
Used by the "java:compile" goal.
</td>
</tr>
<tr>
<td>maven.compile.optimize</td>
<td>Yes</td>
<td>
Specifies whether source should be compiled with optimization; the
default value is <code>off</code>.
Used by the "java:compile" goal.
</td>
</tr>
<tr>
<td>maven.compile.src.set</td>
<td>Yes</td>
<td>
The source directories maven uses to compile java code.
</td>
</tr>
<tr>
<td>pom.build.sourceModifications</td>
<td>Yes</td>
<td>
This property is the list of the
<source><![CDATA[
<build>
<sourceModification>
<sourceModification>
<className></className>
<excludes>
<exclude></exclude>
</excludes>
</sourceModification>
</sourceModification>
</build>
]]></source>
source modifications in your
<a href="http://jakarta.apache.org/turbine/maven/reference/project-descriptor.html">
project descriptor</a>. This property is used during compilation to exclude or
include classes from compilation depending on whether a named class is available
</td>
</tr>
</table>
</section>
<section name="Other properties used">
<table>
<tr>
<th>Property name</th>
<th>Optional?</th>
<th>Description</th>
</tr>
<tr>
<td>sourcesPresent</td>
<td>Yes</td>
<td>
This property is set by Maven to indicate the presence of
Java source code for compilation. The plugin only attempts
to compile AspectJ code if there is java source present.
</td>
</tr>
<tr>
<td>maven.build.dest</td>
<td>Yes</td>
<td>
The destination directory for compiled code
</td>
</tr>
<tr>
<td>maven.dependency.classpath</td>
<td>Yes</td>
<td>
This property holds the Ant <code>path</code> of all the dependent jar
files listed in the <code>dependencies</code> block of your
<a href="http://jakarta.apache.org/turbine/maven/reference/project-descriptor.html">
project descriptor</a>
</td>
</tr>
</table>
</section>
</body>
</document>

6
cactus/.cvsignore Normal file
View File

@ -0,0 +1,6 @@
target
maven.log
velocity.log
build.properties
.classpath
.project

57
cactus/LICENSE.txt Normal file
View File

@ -0,0 +1,57 @@
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/

View File

@ -0,0 +1,29 @@
The Maven team is pleased to announce the Cactus plugin 1.0 release!
http://jakarta.apache.org/turbine/maven/reference/plugins/cactus
The Maven Cactus plugin is a plugin for Cactus
(http://jakarta.apache.org/cactus) that allows to automatically start
containers, run Cactus tests and stop the containers.
Features in this version includes:
o Support for Tomcat 4.x
o Support for Resin 2.x
o HTML report generation (integrated with Maven reports)
o Support for keeping the server running between redeployments
Limitations:
o Bug when overriding the cactus web.xml in one's project
o Supports only the Servlet API 2.3
You can download the Cactus Maven plugin here:
http://www.ibiblio.org/maven/maven/jars/maven-cactus-plugin-1.0.jar
Have fun!
-Vincent

View File

@ -0,0 +1,34 @@
The Maven team is pleased to announce the Cactus plugin 1.1 release!
http://jakarta.apache.org/turbine/maven/reference/plugins/cactus
The Maven Cactus plugin is a plugin for Cactus
(http://jakarta.apache.org/cactus) that allows to automatically start
containers, run Cactus tests and stop the containers.
Changes in this version:
o Added support for HttpUnit integration out of the box (i.e. the
HttpUnit jars are automatically added by the Cactus plugin).
o Ability to exclude Cactus tests (for long running tests for example,
in debug period).
o The web.xml elements required for Cactus are now automatically added to the
user project web.xml.
o Added support for running the tests using the JUnit Swing Test Runner.
Simply create the following Maven property
"maven.cactus.testrunner = swing" to use the Swing Test Runner.
o Added automatic discovery of Cactus Test Cases and ignore test support
classes.
o Creation of the project war/webapp is now left to the Maven War plugin.
Cactus repackages it by adding the Cactus tests, the Cactus
configuration files and the Cactus external jars. Thus, the Cactus
plugin now supports the "war:webapp" goal.
o Improved documentation: "news" section on front page and improved
"Quick Start" page.
o Support for WebLogic 7.x.
You can download the Cactus Maven plugin here:
http://www.ibiblio.org/maven/maven/jars/maven-cactus-plugin-1.1.jar
Have fun!
-Vincent

237
cactus/cactus.dvsl Normal file
View File

@ -0,0 +1,237 @@
#######################################################################
## J U N I T D V S L S T Y L E S H E E T ##
#######################################################################
## This stylesheet is used to transform the output of JUnit's xml
## generator. The XML is transformed into a standard xdoc that can
## then be transformed (yet again) using whatever stylesheet is used
## to format one's site.
##
## Based on the XSL stylesheet junit-noframes.xsl from Ant.
##
## Version: $Id: cactus.dvsl,v 1.1 2003/01/24 03:44:37 jvanzyl Exp $
#######################################################################
## G L O B A L V A R I A B L E S ##
#######################################################################
## Used to facilitate quoting in the template.
##
#set ($quote = '"')
#######################################################################
## V E L O C I T Y M A C R O S ##
#######################################################################
## Convert a string that represents a number using the specified
## pattern.
##
#macro (formatAsNumber $string $pattern)
#set ($value = $context.toolbox.numbers.parse($string))
$context.toolbox.formatter.formatNumber($value, $pattern)
#end
## Prints a standard navbar for navigation.
##
#macro (navbar)
<p>
[<a href="#Summary">summary</a>]
[<a href="#Package List">package list</a>]
[<a href="#Test Cases">test cases</a>]
</p>
#end
## Prints a standard header for a test suite.
##
#macro (testSuiteHeader)
<tr>
<th>Name</th>
<th>Tests</th>
<th>Errors</th>
<th>Failures</th>
<th>Time(s)</th>
</tr>
#end
## Prints a standard header for a test case.
##
#macro (testCaseHeader)
<tr>
<th>Name</th>
<th>Status</th>
<th>Type</th>
<th>Time(s)</th>
</tr>
#end
## Prints the message from a failure.
##
#macro (displayFailure $current)
#if ($current.attribute("message"))
$context.toolbox.htmlescape.getText($current.attribute("message"))
#else
N/A
#end
<p/>
<code>
$context.toolbox.htmlescape.getText($current.value())
</code>
#end
## Generates the report if unit tests were present.
##
#macro (generateReport)
#navbar ()
<p>
The following document contains the results of the <a
href="http://jakarta.apache.org/cactus">Cactus</a> tests.
</p>
</section>
###################################################################
<section name="Summary">
#navbar ()
#set ($testCount = $node.valueOf("sum(testsuite/@tests)"))
#set ($errorCount = $node.valueOf("sum(testsuite/@errors)"))
#set ($failureCount = $node.valueOf("sum(testsuite/@failures)"))
#set ($timeCount = $node.valueOf("sum(testsuite/@time)"))
#set ($successRate = $node.valueOf("($testCount - ($failureCount + $errorCount)) div $testCount"))
<table>
<tr>
<th>Tests</th>
<th>Errors</th>
<th>Failures</th>
<th>Success rate</th>
<th>Time(s)</th>
</tr>
<tr>
<td>#formatAsNumber ($testCount "0")</td>
<td>#formatAsNumber ($errorCount "0")</td>
<td>#formatAsNumber ($failureCount "0")</td>
<td>#formatAsNumber ($successRate "0.00%")</td>
<td>#formatAsNumber ($timeCount "0.000")</td>
</tr>
</table>
<p>
Note: <i>failures</i> are anticipated and checked for with
assertions while <i>errors</i> are unanticipated.
</p>
</section>
###################################################################
<section name="Package List">
#navbar ()
<table>
#testSuiteHeader ()
#foreach ($testsuite in $node.selectNodes("./testsuite[not(./@package = preceding-sibling::testsuite/@package)]"))
#set ($package = $testsuite.attribute('package'))
#set ($quotedPackage = "$quote$package$quote")
#set ($testCount = $node.valueOf("sum(./testsuite[./@package = $quotedPackage]/@tests)"))
#set ($errorCount = $node.valueOf("sum(./testsuite[./@package = $quotedPackage]/@errors)"))
#set ($failureCount = $node.valueOf("sum(./testsuite[./@package = $quotedPackage]/@failures)"))
#set ($timeCount = $node.valueOf("sum(./testsuite[./@package = $quotedPackage]/@time)"))
<tr>
<td><a href="#$package">$package</a></td>
<td>#formatAsNumber ($testCount "0")</td>
<td>#formatAsNumber ($failureCount "0")</td>
<td>#formatAsNumber ($errorCount "0")</td>
<td>#formatAsNumber ($timeCount "0.000")</td>
</tr>
#end
</table>
<p>
Note: package statistics are not computed recursively, they only
sum up all of its testsuites numbers.
</p>
#foreach ($testsuite in $node.selectNodes("./testsuite[not(./@package = preceding-sibling::testsuite/@package)]"))
#set ($package = "$testsuite.attribute('package')")
#set ($quotedPackage = "$quote$package$quote")
<subsection name="$package">
<table>
#testSuiteHeader ()
#foreach ($test in $node.selectNodes("/testsuites/testsuite[./@package = $quotedPackage]"))
<tr>
<td><a href="#$test.attribute('name')">$test.attribute('name')</a></td>
<td>#formatAsNumber ($test.attribute('tests') "0")</td>
<td>#formatAsNumber ($test.attribute('errors') "0")</td>
<td>#formatAsNumber ($test.attribute('failures') "0")</td>
<td>#formatAsNumber ($test.attribute('time') "0.000")</td>
</tr>
#end
</table>
</subsection>
#end
</section>
###################################################################
<section name="Test Cases">
#navbar ()
#foreach ($testsuite in $node.selectNodes("./testsuite"))
<subsection name="$testsuite.attribute('name')">
<table>
#testCaseHeader ()
## test can even not be started at all (failure to load the class)
## so report the error directly
##
#foreach ($error in $testsuite.selectNodes("./error"))
<tr> <td colspan="4"> #displayFailure ($error) </td> </tr>
#end
#foreach ($testcase in $testsuite.selectNodes("./testcase"))
<tr>
<td>$testcase.attribute("name")</td>
#if ($testcase.get("failure"))
<td>Failure</td>
<td> #displayFailure ($testcase.selectSingleNode("failure")) </td>
#elseif ($testcase.get("error"))
<td>Error</td>
<td> #displayFailure ($testcase.selectSingleNode("error")) </td>
#else
<td>Success</td>
<td></td>
#end
#if ($testcase.attribute("time"))
<td>#formatAsNumber ($testcase.attribute("time") "0.000")</td>
#else
<td></td>
#end
</tr>
#end
</table>
</subsection>
#end
</section>
#end
#######################################################################
## T E M P L A T E D E F I N I T I O N S ##
#######################################################################
## Matches the root element of the JUnit XML report.
##
#match ("testsuites")
<?xml version="1.0"?>
<document>
<properties>
<title>Cactus Test Results</title>
</properties>
<body>
<section name="Cactus Test Results">
#if (! $node.get("testsuite"))
<p>
This project does not contain any unit tests.
</p>
</section>
#else
#generateReport()
#end
</body>
</document>
#end

386
cactus/plugin.jelly Normal file
View File

@ -0,0 +1,386 @@
<?xml version="1.0"?>
<!--
=============================================================================
Cactus plugin for Maven.
=============================================================================
-->
<project xmlns:j="jelly:core" xmlns:dvsl="dvsl"
xmlns:cactus="jelly:org.apache.maven.cactus.CactusTagLibrary">
<!-- Import all the jelly scripts found in the maven.cactus.conf.dir
directory. They are jelly scripts to start/stop the different
containers. -->
<fileScanner var="scanner">
<fileset dir="${maven.cactus.scripts.dir}" includes="*.jelly"/>
</fileScanner>
<j:forEach var="script" items="${scanner.iterator()}">
<j:import inherit="true" uri="${script.toURL().toString()}"/>
</j:forEach>
<!--
========================================================================
Initialization. Creates objects useful for several goals.
========================================================================
-->
<goal name="cactus:init" description="Creates objects useful for several goals">
<taskdef name="junit"
classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask"/>
<!-- Classpath containing all Cactus jars that are needed on Cactus
client side -->
<path id="cactus.classpath.clientside">
<path refid="maven.dependency.classpath"/>
<pathelement location="${maven.build.dest}"/>
<pathelement location="${maven.cactus.classes.dir}"/>
<pathelement location="${maven.cactus.build.resources.dir}"/>
<pathelement path="${plugin.getDependencyPath('junit')}"/>
<pathelement path="${plugin.getDependencyPath('cactus:cactus')}"/>
<pathelement path="${plugin.getDependencyPath('commons-httpclient')}"/>
<pathelement path="${plugin.getDependencyPath('commons-logging')}"/>
<pathelement path="${plugin.getDependencyPath('aspectj:aspectjrt')}"/>
<pathElement path="${plugin.getDependencyPath('httpunit')}"/>
<pathElement path="${plugin.getDependencyPath('nekohtml')}"/>
<!-- These 2 jars should not be needed but it won't work without
them -->
<pathelement path="${plugin.getDependencyPath('xml-apis')}"/>
<pathelement path="${plugin.getDependencyPath('xerces')}"/>
</path>
</goal>
<!--
========================================================================
Compile Cactus tests.
========================================================================
-->
<goal name="cactus:compile" prereqs="java:compile"
description="Compile Cactus tests">
<mkdir dir="${maven.cactus.build.dir}"/>
<mkdir dir="${maven.cactus.classes.dir}"/>
<javac
destdir="${maven.cactus.classes.dir}"
excludes="**/package.html"
debug="${maven.compile.debug}"
deprecation="${maven.compile.deprecation}"
optimize="${maven.compile.optimize}">
<classpath>
<pathelement path="${maven.build.dest}"/>
<path refid="maven.dependency.classpath"/>
<pathelement path="${plugin.getDependencyPath('cactus:cactus')}"/>
<pathelement path="${plugin.getDependencyPath('junit')}"/>
<pathElement path="${plugin.getDependencyPath('httpunit')}"/>
</classpath>
<src>
<path location="${maven.cactus.src.dir}"/>
</src>
</javac>
</goal>
<!--
========================================================================
Create the Cactus webapp (i.e. add Cactus related jars/config/test
classes to either the project war or the project webapp).
========================================================================
-->
<goal name="cactus:webapp" description="Create the Cactus webapp">
<available file="${maven.cactus.prewar.dir}/${pom.artifactId}.war"
property="maven.cactus.prewar.exists"/>
<j:choose>
<j:when test="${maven.cactus.prewar.exists}">
<!-- Expand the project war -->
<unwar src="${maven.cactus.prewar.dir}/${pom.artifactId}.war"
dest="${maven.cactus.build.dir}/${pom.artifactId}"/>
<attainGoal name="cactus:webapp-update"/>
</j:when>
<j:otherwise>
<available file="${maven.cactus.prewar.dir}/${pom.artifactId}/WEB-INF"
type="dir" property="maven.cactus.prewebapp.exists"/>
<j:choose>
<j:when test="${maven.cactus.prewebapp.exists}">
<copy todir="${maven.cactus.build.dir}/${pom.artifactId}">
<fileset dir="${maven.cactus.prewar.dir}/${pom.artifactId}"/>
</copy>
<attainGoal name="cactus:webapp-update"/>
</j:when>
<j:otherwise>
<echo>
Either a war or a webapp must exist. Please call the War plugin
first.
</echo>
</j:otherwise>
</j:choose>
</j:otherwise>
</j:choose>
</goal>
<!--
========================================================================
Generate a web.xml which is the merge betweem the user project web.xml
and the webapp elements needed by Cactus.
========================================================================
-->
<goal name="cactus:merge-webxml" prereqs="init-dvsl-tag"
description="Generate a web.xml which is the merge betweem the user project web.xml and the webapp elements needed by Cactus">
<available file="${maven.war.webxml}"
property="maven.cactus.webxml.exists"/>
<j:choose>
<j:when test="${maven.cactus.webxml.exists}">
<j:set var="webxml" value="${maven.war.webxml}"/>
</j:when>
<j:otherwise>
<j:set var="webxml" value="${maven.cactus.emptywebxml}"/>
</j:otherwise>
</j:choose>
<dvsl:dvsl
basedir="${basedir}"
style="${maven.cactus.webxml.dvsl}"
toolboxFile="${plugin.dir}/toolbox.props"
in="${webxml}"
out="${maven.cactus.build.dir}/${pom.artifactId}/WEB-INF/web.xml">
</dvsl:dvsl>
</goal>
<!--
========================================================================
Generate an expanded Cactus webapp from a project expanded webapp.
========================================================================
-->
<goal name="cactus:webapp-update" prereqs="cactus:compile"
description="Generate an expanded Cactus webapp from a project expanded webapp">
<!-- Copy Cactus configuration files -->
<copy todir="${maven.cactus.build.dir}/${pom.artifactId}"
file="${maven.cactus.jspRedirector}"/>
<!-- Create the web.xml which is result of merging the project web.xml
and the elements needed by Cactus -->
<attainGoal name="cactus:merge-webxml"/>
<!-- Copy Cactus jars -->
<copy todir="${maven.cactus.build.dir}/${pom.artifactId}/WEB-INF/lib"
file="${plugin.getDependencyPath('cactus:cactus')}"/>
<copy todir="${maven.cactus.build.dir}/${pom.artifactId}/WEB-INF/lib"
file="${plugin.getDependencyPath('aspectj:aspectjrt')}"/>
<copy todir="${maven.cactus.build.dir}/${pom.artifactId}/WEB-INF/lib"
file="${plugin.getDependencyPath('commons-logging')}"/>
<copy todir="${maven.cactus.build.dir}/${pom.artifactId}/WEB-INF/lib"
file="${plugin.getDependencyPath('junit')}"/>
<copy todir="${maven.cactus.build.dir}/${pom.artifactId}/WEB-INF/lib"
file="${plugin.getDependencyPath('httpunit')}"/>
<!-- Copy Cactus tests -->
<copy todir="${maven.cactus.build.dir}/${pom.artifactId}/WEB-INF/classes">
<fileset dir="${maven.cactus.classes.dir}"/>
</copy>
</goal>
<!--
========================================================================
Test initialization.
========================================================================
-->
<goal name="cactus:test-init" description="Test initialization">
<path id="cactus.scanner.classpath">
<path refid="maven.dependency.classpath"/>
<pathElement location="${maven.build.dest}"/>
<pathElement location="${maven.cactus.classes.dir}"/>
<pathElement location="${plugin.getDependencyPath('cactus:cactus')}"/>
<pathElement location="${plugin.getDependencyPath('commons-logging')}"/>
<pathElement location="${plugin.getDependencyPath('junit')}"/>
<pathElement location="${plugin.getDependencyPath('commons-httpclient')}"/>
<pathElement location="${plugin.getDependencyPath('aspectj:aspectjrt')}"/>
<pathElement location="${plugin.getDependencyPath('httpunit')}"/>
<pathElement location="${plugin.getDependencyPath('nekohtml')}"/>
<j:forEach var="lib" items="${pom.dependencies}">
<pathElement location="${maven.repo.local}/${lib.artifactDirectory}/jars/${lib.artifact}"/>
</j:forEach>
</path>
<cactus:scanner var="cactusScanner" classpathref="cactus.scanner.classpath">
<fileset dir="${maven.cactus.classes.dir}">
<include name="${maven.cactus.test.fileset.include}"/>
<exclude name="${maven.cactus.test.fileset.exclude}"/>
</fileset>
</cactus:scanner>
</goal>
<!--
========================================================================
Start the Cactus tests using the <junit> Ant task with the JUnit
Text Test Runner.
========================================================================
-->
<goal name="cactus:test-text" prereqs="cactus:test-init,cactus:init"
description="Start the tests using the text runner">
<mkdir dir="${maven.cactus.test.reportsDirectory}"/>
<mkdir dir="${maven.cactus.build.resources.dir}"/>
<copy todir="${maven.cactus.build.resources.dir}"
file="${maven.cactus.configFile}" filtering="on">
<filterset>
<filter token="maven.cactus.port" value="${maven.cactus.port}"/>
</filterset>
</copy>
<junit printSummary="yes" fork="true" dir="${basedir}"
failureProperty="maven.cactus.test.failure">
<formatter type="xml"/>
<formatter type="plain" usefile="${maven.cactus.junit.usefile}"/>
<classpath refid="cactus.classpath.clientside"/>
<j:forEach var="test" items="${cactusScanner.iterator()}">
<test name="${test}" todir="${maven.cactus.test.reportsDirectory}"/>
</j:forEach>
</junit>
<j:if test="${maven.cactus.test.failure}">
<j:set var="cactusignore__" value="${maven.cactus.test.failure.ignore}X"/>
<j:if test="${cactusignore__ == 'X'}">
<fail message="There were test failures."/>
</j:if>
</j:if>
</goal>
<!--
========================================================================
Start the Cactus tests using the <junit> Ant task with the JUnit
Swing Test Runner.
========================================================================
-->
<goal name="cactus:test-swing" prereqs="cactus:test-init,cactus:init"
description="Start the tests using the swing runner">
<mkdir dir="${maven.cactus.build.resources.dir}"/>
<copy todir="${maven.cactus.build.resources.dir}"
file="${maven.cactus.configFile}" filtering="on">
<filterset>
<filter token="maven.cactus.port" value="${maven.cactus.port}"/>
</filterset>
</copy>
<!-- Copy the JUnit excluded.properties - This is needed because the
the Commons logging package need to be excluded from being loaded
by the special JUnit classloader. Otherwise, it fails. -->
<copy todir="${maven.cactus.build.resources.dir}/junit/runner"
file="${maven.cactus.testrunner.swing.excluded}"/>
<java classname="junit.swingui.TestRunner" fork="true" dir="${basedir}">
<j:forEach var="test" items="${cactusScanner.iterator()}">
<jvmarg value="-Dmaven.cactus.test.${test}"/>
</j:forEach>
<arg line="org.apache.maven.cactus.DynamicTestAll"/>
<classpath>
<path refid="cactus.classpath.clientside"/>
<pathelement location="${plugin.dir}"/>
</classpath>
</java>
</goal>
<!--
========================================================================
Generate Cactus test report (xdoc format). Run maven xdoc:transform
to then transform into HTML.
========================================================================
-->
<goal name="cactus:generate" prereqs="init-dvsl-tag"
description="Generate HTML report">
<mkdir dir="${maven.cactus.test.reportsDirectory}"/>
<!-- Consolidate the reports into a single -->
<junitreport todir="${maven.cactus.test.reportsDirectory}">
<fileset dir="${maven.cactus.test.reportsDirectory}">
<include name="TEST-*.xml"/>
</fileset>
</junitreport>
<!-- Convert single report into an xdoc -->
<dvsl:dvsl
basedir="${basedir}"
style="${plugin.dir}/cactus.dvsl"
toolboxFile="${plugin.dir}/toolbox.props"
in="${maven.cactus.test.reportsDirectory}/TESTS-TestSuites.xml"
out="${maven.gen.docs}/cactus-report.xml">
</dvsl:dvsl>
</goal>
<!--
========================================================================
Execute a single Cactus test case defined using the 'testcase'
variable.
NOTE: This assumes that the server was already started and that the
Cactus war has already been deployed.
========================================================================
-->
<goal name="cactus:single" prereqs="war:war,cactus:compile,cactus:init"
description="Execute a single test defined using the 'testcase' variable">
<j:choose>
<j:when test="${empty(testcase)}">
<echo>
You must define the test case to run via -Dtestcase=classname
Example: maven -Dtestcase=MyTest cactus:single
</echo>
</j:when>
<j:otherwise>
<junit printSummary="yes" fork="true" dir="${basedir}"
failureProperty="maven.cactus.test.failure">
<formatter type="xml"/>
<formatter type="plain" usefile="${maven.cactus.junit.usefile}"/>
<classpath refid="cactus.classpath.clientside"/>
<test name="${testcase}"
todir="${maven.cactus.test.reportsDirectory}"/>
</junit>
<j:if test="${maven.cactus.test.failure}">
<j:set var="cactusignore__"
value="${maven.cactus.test.failure.ignore}X"/>
<j:if test="${cactusignore__ == 'X'}">
<fail message="There were test failures."/>
</j:if>
</j:if>
</j:otherwise>
</j:choose>
</goal>
</project>

71
cactus/plugin.properties Normal file
View File

@ -0,0 +1,71 @@
# -------------------------------------------------------------------
# Default properties for the Cactus Plugin
# -------------------------------------------------------------------
# Location of containers. These properties need to be put in your
# local build.properties as they depend on where you installed
# your containers on your local machine.
#
# Examples:
#
# maven.cactus.tomcat4x.home = c:/apps/tomcat-4.1.10
# maven.cactus.resin2x.home = C:/Apps/resin-2.1.4
# maven.cactus.weblogic7x.home = C:/bea
# DVSL Template to merge user web.xml to entries needed by Cactus
maven.cactus.webxml.dvsl = ${plugin.dir}/conf/web.xml.dvsl
# Empty web.xml to use if the user project does not provide a web.xml file
maven.cactus.emptywebxml = ${plugin.dir}/conf/web.xml
# Location of Cactus JSP Redirector
maven.cactus.jspRedirector = ${plugin.dir}/conf/web/jspRedirector.jsp
# Location of cactus.properties Cactus configuration file
maven.cactus.configFile = ${plugin.dir}/conf/cactus.properties
# Location of Cactus tests in project sources
maven.cactus.src.dir = src/test-cactus
# Location of scripts for the different containers
maven.cactus.scripts.dir = ${plugin.dir}/scripts
# Location of container configuration files
maven.cactus.conf.containers.dir = ${plugin.dir}/conf/containers
# Location where the cactus plugin puts its generateds stuff in
# the project build directory.
maven.cactus.build.dir = ${maven.build.dir}/cactus
# Location where the cactus plugin puts the compiled cactus test classes
maven.cactus.classes.dir = ${maven.cactus.build.dir}/classes
# Location where the cactus plugin puts resources that need to be in the
# Cactus client side classpath.
maven.cactus.build.resources.dir = ${maven.cactus.build.dir}/resources
# Port under which the container will be started
maven.cactus.port = 8080
# If true, the junit task used to run the Cactus tests will output the
# test result to a file
maven.cactus.junit.usefile = true
# Location of generated raw test reports
maven.cactus.test.reportsDirectory = ${maven.cactus.build.dir}/test-reports
# Location where the project war/webapp is located (either as a war or an
# expanded webapp). Cactus will then add its own stuff to the war/webapp.
maven.cactus.prewar.dir = ${maven.war.build.dir}
# Define what TestRunner to use. Default is the JUnit text test runner
# (the one used by the <junit> Ant task). Valid values are: text, swing
maven.cactus.testrunner = text
# Location of junit excluded.properties file to use when using the Swing
# Test Runner
maven.cactus.testrunner.swing.excluded = ${plugin.dir}/conf/excluded.properties
# Include/Exclude for Cactus tests
maven.cactus.test.fileset.include=**/*.class
maven.cactus.test.fileset.exclude=

View File

@ -0,0 +1,6 @@
# -------------------------------------------------------------------
# P R O J E C T P R O P E R T I E S
# -------------------------------------------------------------------
maven.xdoc.date=left
maven.xdoc.version=${pom.currentVersion}
maven.checkstyle.format = turbine

184
cactus/project.xml Normal file
View File

@ -0,0 +1,184 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project>
<extend>${basedir}/../project.xml</extend>
<pomVersion>3</pomVersion>
<id>maven-cactus-plugin</id>
<name>Maven Cactus Plug-in</name>
<currentVersion>1.2-SNAPSHOT</currentVersion>
<description>
Plugin for Cactus (http://jakarta.apache.org/cactus) that
allows to automatically start containers, run Cactus tests and stop
the containers.
</description>
<shortDescription>Cactus plugin</shortDescription>
<url>http://jakarta.apache.org/turbine/maven/reference/plugins/cactus/</url>
<issueTrackingUrl>http://jira.werken.com/BrowseProject.jspa?id=10030</issueTrackingUrl>
<siteAddress>jakarta.apache.org</siteAddress>
<siteDirectory>/www/jakarta.apache.org/turbine/maven/reference/plugins/cactus/</siteDirectory>
<distributionDirectory>/www/jakarta.apache.org/builds/jakarta-turbine-maven/</distributionDirectory>
<versions>
<version>
<id>1.0</id>
<name>1.0</name>
<tag>MAVEN_CACTUS_1_0</tag>
</version>
<version>
<id>1.1</id>
<name>1.1</name>
<tag>MAVEN_CACTUS_1_1</tag>
</version>
<version>
<id>1.2</id>
<name>1.2</name>
<tag>HEAD</tag>
</version>
</versions>
<developers>
<developer>
<name>Vincent Massol</name>
<id>vmassol</id>
<email>vmassol@octo.com</email>
<organization>OCTO Technology</organization>
<roles>
<role>Java Developer</role>
<role>Architect</role>
<role>Release Manager</role>
</roles>
</developer>
</developers>
<contributors>
<contributor>
<name>Eric Pugh</name>
<email>EPugh@upstate.com</email>
</contributor>
</contributors>
<dependencies>
<dependency>
<id>cactus:cactus</id>
<version>13-1.4.1</version>
<properties>
<classloader>root.maven</classloader>
</properties>
</dependency>
<dependency>
<id>cactus:cactus-ant</id>
<version>1.4.1</version>
<properties>
<classloader>root.maven</classloader>
</properties>
</dependency>
<dependency>
<id>commons-httpclient</id>
<version>2.0alpha1-20020829</version>
<properties>
<classloader>root.maven</classloader>
</properties>
</dependency>
<dependency>
<id>commons-logging</id>
<version>1.0.1</version>
<properties>
<classloader>root.maven</classloader>
</properties>
</dependency>
<dependency>
<id>aspectj:aspectjrt</id>
<version>1.0.6</version>
<properties>
<classloader>root.maven</classloader>
</properties>
</dependency>
<dependency>
<id>httpunit</id>
<version>1.5</version>
<properties>
<classloader>root.maven</classloader>
</properties>
</dependency>
<dependency>
<id>nekohtml</id>
<version>0.6.5</version>
<properties>
<classloader>root.maven</classloader>
</properties>
</dependency>
<dependency>
<id>junit</id>
<version>3.8.1</version>
<properties>
<classloader>root</classloader>
</properties>
</dependency>
<dependency>
<id>ant:ant</id>
<version>1.5.1</version>
<properties>
<classloader>root</classloader>
</properties>
</dependency>
<dependency>
<id>commons-jelly</id>
<version>SNAPSHOT</version>
<properties>
<classloader>root.maven</classloader>
</properties>
</dependency>
<dependency>
<id>commons-jelly+tags-ant</id>
<version>SNAPSHOT</version>
<properties>
<classloader>root.maven</classloader>
</properties>
</dependency>
<dependency>
<id>commons-beanutils</id>
<version>1.4.1</version>
<properties>
<classloader>root.maven</classloader>
</properties>
</dependency>
<!-- Should not be needed but it seems there is a bug with Maven when junit
dependency is added -->
<dependency>
<id>xml-apis</id>
<version>1.0.b2</version>
<properties>
<classloader>root</classloader>
</properties>
</dependency>
<!-- Should not be needed but it seems there is a bug with Maven when junit
dependency is added -->
<dependency>
<id>xerces</id>
<version>2.0.2</version>
<properties>
<classloader>root</classloader>
</properties>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,270 @@
package org.apache.maven.cactus;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.Path;
import org.apache.cactus.AbstractTestCase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URLClassLoader;
import java.net.URL;
import java.lang.reflect.Modifier;
import java.lang.reflect.Method;
/**
* Process {@link FileSet} and extracts classes that are Cactus tests. A
* class is considered to be a Cactus Test Case if:
* <ul>
* <li>It extends {@link AbstractTestCase}</li>
* <li>It is not abstract</li>
* <li>It has at least one method that starts with "test", returns void and
* takes no parameters</li>
* </ul>
*
* @author <a href="mailto:vmassol@apache.org">Vincent Massol</a>
* @version $Id: CactusScanner.java,v 1.1 2003/01/24 03:44:39 jvanzyl Exp $
*/
public class CactusScanner
{
private Log log = LogFactory.getLog(CactusScanner.class);
/**
* The Ant project
*/
private Project project;
/**
* Lists of Cactus class names that were found in the {@link FileSet}
*/
private List cactusTests = new ArrayList();
public void setProject(Project project)
{
this.project = project;
}
public void clear()
{
this.cactusTests.clear();
}
/**
* @return the list of valid Cactus test cases
*/
public Iterator iterator() {
return this.cactusTests.iterator();
}
/**
* Finds the Cactus test cases from a list of files.
*
* @param fs the list of files in which to look for Cactus tests
* @param classpath the classpaths needed to load the test classes
*/
public void processFileSet(FileSet fs, Path classpath)
{
DirectoryScanner ds = fs.getDirectoryScanner(this.project);
ds.scan();
String[] files = ds.getIncludedFiles();
for (int i = 0; i < files.length; i++)
{
// The path is supposed to be a relative path that matches the
// package directory structure. Thus we only need to replace
// the directory separator char by a "." and remove the file
// extension to get the FQN java class name.
// Is it a java class file?
if (files[i].endsWith(".class"))
{
String fqn = files[i]
.substring(0, files[i].length() - ".class".length())
.replace(File.separatorChar, '.');
log.debug("Found candidate class: [" + fqn + "]");
// Is it a Cactus test case?
if (isCactusTestCase(fqn, classpath))
{
log.debug("Found Cactus test case: [" + fqn + "]");
this.cactusTests.add(fqn);
}
}
}
}
/**
* @param className the fully qualified name of the class to check
* @param classpath the classpaths needed to load the test classes
* @return true if the class is a Cactus test case
*/
private boolean isCactusTestCase(String className, Path classpath)
{
Class clazz = loadClass(className, classpath);
if (clazz == null)
{
return false;
}
Class abstractTestCaseClass = null;
try
{
abstractTestCaseClass = clazz.getClassLoader().loadClass(
AbstractTestCase.class.getName());
}
catch (ClassNotFoundException e)
{
log.debug("Cannot load class", e);
return false;
}
if (!abstractTestCaseClass.isAssignableFrom(clazz))
{
log.debug("Not a Cactus test as class [" + className + "] does "
+ "not inherit from [" + AbstractTestCase.class.getName()
+ "]");
return false;
}
// the class must not be abstract
if (Modifier.isAbstract(clazz.getModifiers()))
{
log.debug("Not a Cactus test as class [" + className + "] is "
+ "abstract");
return false;
}
// the class must have at least one test, i.e. a public method
// starting with "test" and that takes no parameters
boolean hasTestMethod = false;
Method[] methods = clazz.getMethods();
for (int i = 0; i < methods.length; i++)
{
if (methods[i].getName().startsWith("test")
&& (methods[i].getReturnType() == Void.TYPE)
&& (methods[i].getParameterTypes().length == 0))
{
hasTestMethod = true;
break;
}
}
if (!hasTestMethod)
{
log.debug("Not a Cactus test as class [" + className + "] has "
+ "no method that start with \"test\", returns void and has "
+ "no parameters");
return false;
}
return true;
}
/**
* @param className the fully qualified name of the class to check
* @param classpath the classpaths needed to load the test classes
* @return the class object loaded by reflection from its string name
*/
private Class loadClass(String className, Path classpath)
{
Class clazz = null;
try
{
clazz = createClassLoader(classpath).loadClass(className);
}
catch (ClassNotFoundException e)
{
log.error("Failed to load class [" + className + "]", e);
}
return clazz;
}
/**
* @param classpath the classpaths needed to load the test classes
* @return a ClassLoader that has all the needed classpaths for loading
* the Cactus tests classes
*/
private ClassLoader createClassLoader(Path classpath)
{
URL[] urls = new URL[classpath.size()];
try
{
for (int i = 0; i < classpath.size(); i++)
{
log.debug("Adding ["
+ new File(classpath.list()[i]).toURL() + "] "
+ "to class loader classpath");
urls[i] = new File(classpath.list()[i]).toURL();
}
}
catch (MalformedURLException e)
{
log.debug("Invalid URL", e);
}
return new URLClassLoader(urls);
}
}

View File

@ -0,0 +1,241 @@
package org.apache.maven.cactus;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import org.apache.commons.jelly.TagSupport;
import org.apache.commons.jelly.XMLOutput;
import org.apache.commons.jelly.MissingAttributeException;
import org.apache.commons.jelly.tags.ant.TaskSource;
import org.apache.commons.jelly.tags.ant.AntTagLibrary;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference;
/**
* Cactus Jelly Tag that scans Ant FileSets and return a list of
* qualified class name that are Cactus TestCases (i.e.
* ServletTestCase, JspTestCase or FilterTestCase) or subclasses
* of Cactus TestCases.
*
* Note: This is useful when used with the &lt;junit&gt; Ant
* task for example, in order to find out the list of tests to
* execute.
*
* @author <a href="mailto:vmassol@apache.org">Vincent Massol</a>
* @version $Id: CactusScannerTag.java,v 1.1 2003/01/24 03:44:39 jvanzyl Exp $
*/
public class CactusScannerTag extends TagSupport implements TaskSource
{
private Log log = LogFactory.getLog(CactusScannerTag.class);
/**
* The {@link CactusScanner} object that is exposed by this tag
* to the Jelly script.
*/
private CactusScanner cactusScanner;
/**
* We need to save the fileset as its XML attributes are set after the
* fileset object is created and thus we need to wait until it is
* completely initialized before being able to process it using
* {@link CactusScanner#processFileSet}.
*/
private FileSet fileset;
/**
* Nested &lt;classpath&gt; tag values. This is the classpath that will
* be used to dynamically load the test classes to decide whether they
* are Cactus tests or not.
*
* Note: There is a bug in Jelly and it does not work yet. ATM you should
* use the classpathref attribute instead.
*/
private Path classpath;
/**
* Reference to an Ant {@link Path} object containing the classpath.
* @see #classpath
*/
private String classpathref;
/**
* The Jelly variable (exposed to the Jelly script) that will
* contain a reference to the {@link CactusScanner} object.
*/
private String var;
public CactusScannerTag()
{
this.cactusScanner = new CactusScanner();
}
/**
* @see TagSupport#doTag(XMLOutput)
*/
public void doTag(XMLOutput xmlOutput) throws Exception
{
this.cactusScanner.setProject(AntTagLibrary.getProject(context));
this.cactusScanner.clear();
// run the body first to configure the task via nested tags
invokeBody(xmlOutput);
// Process the fileset to extract Cactus test cases. We need to pass
// the project dependency classpath as the CactusScanner will need
// to load the cactus test classes to decide whether they are Cactus
// test case or not and that needs the dependent jars to be in the
// classpath.
Path cp = this.classpath;
if (this.classpathref != null)
{
cp = (Path) AntTagLibrary.getProject(
context).getReference(this.classpathref);
}
this.cactusScanner.processFileSet(this.fileset, cp);
// output the cactusScanner
if ( var == null )
{
throw new MissingAttributeException( "var" );
}
context.setVariable(var, cactusScanner);
}
/**
* This method is called internally by Jelly to know on which object to
* call the {@link TaskSource#setTaskProperty} method.
*
* @see TaskSource#getTaskObject()
*/
public Object getTaskObject()
{
return this;
}
/**
* @see TaskSource#setTaskProperty(String, Object)
*/
public void setTaskProperty(String name, Object value) throws Exception
{
BeanUtils.setProperty(this, name, value);
}
/**
* Adds a set of files (nested fileset attribute). This method is called
* dynamically by {@link #setTaskProperty}.
*/
public void addFileset(FileSet set)
{
log.debug("Adding fileset [" + set + "]");
this.fileset = set;
}
public Path createClasspath()
{
log.debug("Creating classpath");
if (this.classpath == null)
{
this.classpath = new Path(AntTagLibrary.getProject(context));
}
return this.classpath.createPath();
}
public Path getClasspath()
{
return this.classpath;
}
public void setClasspath(Path classpath)
{
log.debug("Setting classpath [" + classpath + "]");
if (this.classpath == null)
{
this.classpath = classpath;
} else {
this.classpath.append(classpath);
}
}
public void setClasspathRef(Reference r)
{
createClasspath().setRefid(r);
}
/**
* @return the Cactus scanner object
*/
public CactusScanner getCactusScanner()
{
return this.cactusScanner;
}
/**
* Sets the name of the variable exported by this tag
*/
public void setVar(String var)
{
this.var = var;
}
public void setClasspathref(String classpathref)
{
this.classpathref = classpathref;
}
}

View File

@ -0,0 +1,72 @@
package org.apache.maven.cactus;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import org.apache.commons.jelly.TagLibrary;
/**
* Maven tag library for use in Jelly scripts.
*
* @author <a href="vmassol@apache.org">Vincent Massol</a>
* @version $Id: CactusTagLibrary.java,v 1.1 2003/01/24 03:44:39 jvanzyl Exp $
*/
public class CactusTagLibrary extends TagLibrary
{
public CactusTagLibrary()
{
registerTag("scanner", CactusScannerTag.class);
}
}

View File

@ -0,0 +1,130 @@
package org.apache.maven.cactus;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import junit.framework.TestCase;
import junit.framework.Test;
import junit.framework.TestSuite;
import java.util.Properties;
import java.util.Enumeration;
/**
* JUnit tests suite that runs all the tests found in System Properties
* whose name start with {@link #PREFIX}.
*
* @author <a href="mailto:vmassol@apache.org">Vincent Massol</a>
* @version $Id: DynamicTestAll.java,v 1.1 2003/01/24 03:44:41 jvanzyl Exp $
*/
public class DynamicTestAll extends TestCase
{
/**
* Prefix for test classnames specified as System Properties.
*/
private static final String PREFIX = "maven.cactus.test";
/**
* Defines the testcase name for JUnit.
*
* @param theName the test name.
*/
public DynamicTestAll(String theName)
{
super(theName);
}
/**
* @return a test suite that includes all tests defined as System
* Properties whose name starts with {@link #PREFIX}.
*/
public static Test suite()
{
TestSuite suite = new TestSuite("All Cactus tests");
Properties properties = System.getProperties();
Enumeration keys = properties.keys();
while (keys.hasMoreElements())
{
String key = (String) keys.nextElement();
if (key.startsWith(PREFIX))
{
suite.addTestSuite(loadClass(
key.substring(PREFIX.length() + 1)));
}
}
return suite;
}
/**
* @param classname name of class to load dynamically
* @return the loaded class
*/
private static Class loadClass(String classname)
{
Class clazz = null;
try
{
clazz = DynamicTestAll.class.getClassLoader().loadClass(classname);
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
// Ignore the class
}
return clazz;
}
}

View File

@ -0,0 +1,21 @@
# Configuration file for Cactus.
# Each project using Cactus need to have such a file put in the client side
# CLASSPATH (Meaning the directory containgin this file should be in the client
# side CLASSPATH, not the file itself of course ... :) )
# Defines the URLs that will be used by Cactus to call it's redirectors.
# You need to specify in these URLs the webapp context that you use for your
# application. In the example below, the context is "test".
# Web app Context under which our application to test runs
cactus.contextURL = http://localhost:@maven.cactus.port@/test
# Default Servlet Redirector Name. Used by ServletTestCase test cases.
cactus.servletRedirectorName = ServletRedirector
# Default JSP Redirector Name. Used by JspTestCase test cases.
cactus.jspRedirectorName = JspRedirector
# Default Filter Redirector Name. Used by FilterTestCase test cases.
cactus.filterRedirectorName = FilterRedirector

View File

@ -0,0 +1,21 @@
<caucho.com>
<http-server>
<app-dir>.</app-dir>
<http port='@maven.cactus.port@'/>
<host id=''>
<authenticator class-name='com.caucho.http.security.XmlAuthenticator'>
<init-param user='testuser:testpassword:test'/>
</authenticator>
<war-dir id='.'/>
</host>
</http-server>
</caucho.com>

View File

@ -0,0 +1,29 @@
<Server port="8005" shutdown="SHUTDOWN" debug="0">
<Service name="Tomcat-Standalone">
<Connector className="org.apache.catalina.connector.http.HttpConnector"
port="@maven.cactus.port@" minProcessors="5" maxProcessors="75"
acceptCount="10" debug="0"/>
<Engine name="Standalone" defaultHost="localhost" debug="0">
<Realm className="org.apache.catalina.realm.MemoryRealm" />
<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true"
autoDeploy="true">
<Context path="/test" docBase="test" debug="0" reloadable="true"
crossContext="true">
<Loader checkInterval="1"/>
</Context>
</Host>
</Engine>
</Service>
</Server>

View File

@ -0,0 +1,3 @@
<tomcat-users>
<user name="testuser" password="testpassword" roles="test"/>
</tomcat-users>

View File

@ -0,0 +1,65 @@
dn: dc=@domain@
dc: @domain@
objectclass: top
objectclass: domain
dn: ou=@realm@, dc=@domain@
ou: @realm@
objectclass: top
objectclass: organizationalUnit
dn: ou=groups,ou=@realm@, dc=@domain@
ou: groups
objectclass: organizationalUnit
objectclass: top
dn: cn=Administrators,ou=groups,ou=@realm@, dc=@domain@
memberURL: ldap:///ou=groups,ou=@realm@,dc=@domain@??sub?(&(objectclass=person)(wlsMemberOf=cn=Administrators,ou=groups,ou=@realm@,dc=@domain@))
description: Administrators group
objectclass: top
objectclass: groupOfUniqueNames
objectclass: groupOfURLs
cn: Administrators
dn: cn=Deployers,ou=groups,ou=@realm@, dc=@domain@
memberURL: ldap:///ou=groups,ou=@realm@,dc=@domain@??sub?(&(objectclass=person)(wlsMemberOf=cn=Deployers,ou=groups,ou=@realm@,dc=@domain@))
description: Deployers group
objectclass: top
objectclass: groupOfUniqueNames
objectclass: groupOfURLs
cn: Deployers
dn: cn=Operators,ou=groups,ou=@realm@, dc=@domain@
memberURL: ldap:///ou=groups,ou=@realm@,dc=@domain@??sub?(&(objectclass=person)(wlsMemberOf=cn=Operators,ou=groups,ou=@realm@,dc=@domain@))
description: Operators group
objectclass: top
objectclass: groupOfUniqueNames
objectclass: groupOfURLs
cn: Operators
dn: cn=Monitors,ou=groups,ou=@realm@, dc=@domain@
memberURL: ldap:///ou=groups,ou=@realm@,dc=@domain@??sub?(&(objectclass=person)(wlsMemberOf=cn=Monitors,ou=groups,ou=@realm@,dc=@domain@))
description: Monitors group
objectclass: top
objectclass: groupOfUniqueNames
objectclass: groupOfURLs
cn: Monitors
dn: ou=people,ou=@realm@, dc=@domain@
ou: people
objectclass: organizationalUnit
objectclass: top
dn: uid=system,ou=people,ou=@realm@, dc=@domain@
description: system
objectclass: inetOrgPerson
objectclass: organizationalPerson
objectclass: person
objectclass: top
cn: system
sn: system
userpassword: {ssha}XYqqB9c/6OXoNVCOil7ZRdbb/GSIXVcE
uid: system
objectclass: wlsUser
wlsMemberOf: cn=Administrators,ou=groups,ou=@realm@,dc=@domain@

View File

@ -0,0 +1,2 @@

 tfИ2щs©®ы"И4ДЗ-jjЃ{<7B>©ѓD6bт(

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<Domain Name="testdomain">
<Server Name="testserver" NativeIOEnabled="true" ListenPort="@maven.cactus.port@"/>
</Domain>

View File

@ -0,0 +1,9 @@
#Wed Jun 19 22:19:44 BST 2002
acl.modify.weblogic.admin.acl=Administrators
acl.unlockServer.weblogic.admin=Administrators
user.system=0xa7dc9690ce40f88dac3bdd23cb32588ff5546bb6
acl.lockServer.weblogic.admin=Administrators
acl.unlockuser.weblogic.passwordpolicy=Administrators
acl.shutdown.weblogic.admin=Administrators
acl.boot.weblogic.server=Administrators,everyone
group.Administrators=system

View File

@ -0,0 +1,10 @@
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 6.0//EN" "http://www.bea.com/servers/wls610/dtd/ weblogic-web-jar.dtd">
<weblogic-web-app>
<security-role-assignment>
<role-name>test</role-name>
<principal-name>testuser</principal-name>
</security-role-assignment>
</weblogic-web-app>

View File

@ -0,0 +1,16 @@
#
# The list of excluded package paths for the TestCaseClassLoader
#
excluded.0=sun.*
excluded.1=com.sun.*
excluded.2=org.omg.*
excluded.3=javax.*
excluded.4=sunw.*
excluded.5=java.*
excluded.6=org.w3c.dom.*
excluded.7=org.xml.sax.*
excluded.8=net.jini.*
excluded.9=org.apache.common.logging.*
excluded.10=org.apache.cactus.*
excluded.11=com.meterware.httpunit.*

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app>
<!-- Empty web.xml to use when the user project does not provide a web.xml.
We need a web.xml in order to perform the merge with our web.xml
DVSL template. See plugin.jelly. -->
</web-app>

View File

@ -0,0 +1,118 @@
## -----------------------------------------------------
## X M L R O O T
## -----------------------------------------------------
#match ("web-app")
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
$context.applyTemplates("icon")
$context.applyTemplates("display-name")
$context.applyTemplates("description")
$context.applyTemplates("distributable")
$context.applyTemplates("context-param")
<filter>
<filter-name>FilterRedirector</filter-name>
<filter-class>org.apache.cactus.server.FilterTestRedirector</filter-class>
</filter>
$context.applyTemplates("filter")
<filter-mapping>
<filter-name>FilterRedirector</filter-name>
<url-pattern>/FilterRedirector</url-pattern>
</filter-mapping>
$context.applyTemplates("filter-mapping")
$context.applyTemplates("listener")
<servlet>
<servlet-name>ServletRedirector</servlet-name>
<servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class>
</servlet>
<servlet>
<servlet-name>ServletRedirectorSecure</servlet-name>
<servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class>
</servlet>
<servlet>
<servlet-name>JspRedirector</servlet-name>
<jsp-file>/jspRedirector.jsp</jsp-file>
</servlet>
$context.applyTemplates("servlet")
<servlet-mapping>
<servlet-name>ServletRedirector</servlet-name>
<url-pattern>/ServletRedirector</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletRedirectorSecure</servlet-name>
<url-pattern>/ServletRedirectorSecure</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>JspRedirector</servlet-name>
<url-pattern>/JspRedirector</url-pattern>
</servlet-mapping>
$context.applyTemplates("servlet-mapping")
$context.applyTemplates("session-config")
$context.applyTemplates("mime-mapping")
$context.applyTemplates("welcome-file-list")
$context.applyTemplates("error-page")
$context.applyTemplates("taglib")
$context.applyTemplates("resource-env-ref")
$context.applyTemplates("resource-ref")
<security-constraint>
<web-resource-collection>
<web-resource-name>SecurityRestriction</web-resource-name>
<description>Protect the Cactus redirector servlet.</description>
<url-pattern>/ServletRedirectorSecure</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>Authorized Users Group</description>
<role-name>test</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<security-role>
<description>Test role</description>
<role-name>test</role-name>
</security-role>
$context.applyTemplates("env-entry")
$context.applyTemplates("ejb-ref")
$context.applyTemplates("ejb-local-ref")
</web-app>
#end
## -----------------------------------------------------
## D E F A U L T C O P Y
## -----------------------------------------------------
#match( "text()" )$node.value()#end
#match( "@*" ) $node.name()="$node.value()"#end
#match("*")
#if ($node.name() == "source")
$context.applyTemplates("source");
#else<$node.name()$context.applyTemplates("@*")>#foreach($n in $node.children())$context.applyTemplates($n)#end</$node.name()>
#end
#end

View File

@ -0,0 +1,28 @@
<%@page import="org.apache.cactus.server.*" session="true" %><%
/**
* Note:
* It is very important not to put any character between the end
* of the page tag and the beginning of the java code expression, otherwise,
* the generated servlet containss a 'out.println("\r\n");' and this breaks
* our mechanism !
*/
/**
* This JSP is used as a proxy to call your server-side unit tests. We use
* a JSP rather than a servlet because for testing custom JSP tags for
* example we need access to JSP implicit objects (PageContext and
* JspWriter).
*/
JspImplicitObjects objects = new JspImplicitObjects();
objects.setHttpServletRequest(request);
objects.setHttpServletResponse(response);
objects.setServletConfig(config);
objects.setServletContext(application);
objects.setJspWriter(out);
objects.setPageContext(pageContext);
JspTestRedirector redirector = new JspTestRedirector();
redirector.doGet(objects);
%>

View File

@ -0,0 +1,4 @@
#maven.cactus.tomcat4x.home = C:/Apps/jakarta-tomcat-4.1.10
#maven.cactus.resin2x.home = C:/Apps/resin-2.1.4

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project>
<!-- the version of maven's project object model -->
<pomVersion>3</pomVersion>
<!-- a unique name for this project -->
<id>maven-cactus-sample</id>
<!-- a short but descriptive name for the project -->
<name>Cactus Sample</name>
<!-- The version of the project under development, e.g.
1.1, 1.2, 2.0-dev -->
<currentVersion>1.0-SNAPSHOT</currentVersion>
<!-- details about the organization that 'owns' the project -->
<organization>
<name>Apache Software Foundation</name>
<url>http://jakarta.apache.org/</url>
</organization>
<!-- the year the project started -->
<inceptionYear>2002</inceptionYear>
<!-- the top level of java packages that this project defines
e.g. if your project contains the packages
com.mycompany.accounts.reports, com.mycompany.accounts.reports
and com.mycompany.accounts.utils, the package would be
'com.mycompany.accounts' -->
<package>org.apache.maven.cactus.sample</package>
<!-- a short description of what the project does -->
<shortDescription>A sample project using the Cactus plugin for Maven</shortDescription>
<!-- the project home page -->
<url>http://jakarta.apache.org/turbine/maven/</url>
<!-- the version control repository and http url for online access
the connection element has the form:
scm:<system>:<system specific connection string> -->
<repository>
<connection>scm:cvs:pserver:anoncvs@cvs.apache.org:/home/cvspublic:jakarta-turbine-maven</connection>
<url>http://cvs.apache.org/viewcvs/jakarta-turbine-maven/</url>
</repository>
<!-- any mailing lists for the project -->
<mailingLists/>
<!-- who the developers are for the project -->
<developers />
<!-- jar files the project is dependent on -->
<dependencies>
<dependency>
<id>servletapi</id>
<version>2.3</version>
</dependency>
</dependencies>
<!-- build information for the project -->
<build>
<sourceDirectory>src/java</sourceDirectory>
<unitTestSourceDirectory>src/test</unitTestSourceDirectory>
<unitTest>
<includes>
<include>**/Test*.java</include>
</includes>
</unitTest>
</build>
</project>

View File

@ -0,0 +1,150 @@
package org.apache.maven.cactus.sample;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import java.io.IOException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* Sample tag that interacts with its body. The tag acts as a filter for its
* body. "Target" and "Replacement" Strings are defined by the tag's attributes
* and each "occurrence" of the target is replaced by the "replacement".
*
* @author <a href="mailto:nick@eblox.com">Nicholas Lesiecki</a>
*
* @version $Id: SampleBodyTag.java,v 1.1 2003/01/24 03:44:46 jvanzyl Exp $
*/
public class SampleBodyTag extends BodyTagSupport
{
/**
* The substring to be replaced in the body.
*/
private String target;
/**
* The substring that will replace the target in the body.
*/
private String replacement;
/**
* Sets the substring to be replaced in the body.
*
* @param theTarget the substring to be replaced in the body
*/
public void setTarget(String theTarget)
{
this.target = theTarget;
}
/**
* Sets the substring that will replace the target in the body.
*
* @param theReplacement the replacement string
*/
public void setReplacement(String theReplacement)
{
this.replacement = theReplacement;
}
/**
* @see BodyTagSupport#doAfterBody()
*/
public int doAfterBody() throws JspTagException
{
String contentString = this.bodyContent.getString();
StringBuffer contentBuffer = new StringBuffer(contentString);
int beginIndex = -1;
int targetLength = this.target.length();
// while instances of target still exist
while ((beginIndex = contentString.indexOf(this.target)) > -1)
{
int endIndex = beginIndex + targetLength;
contentBuffer.replace(beginIndex, endIndex, this.replacement);
contentString = contentBuffer.toString();
}
// write out the changed body
JspWriter pageWriter = this.bodyContent.getEnclosingWriter();
try
{
pageWriter.write(contentString);
}
catch (IOException e)
{
throw new JspTagException(e.getMessage());
}
return SKIP_BODY;
}
/**
* @see BodyTagSupport#release()
*/
public void release()
{
this.target = null;
this.replacement = null;
}
}

View File

@ -0,0 +1,181 @@
package org.apache.maven.cactus.sample;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.apache.maven.cactus.sample.util.GenericResponseWrapper;
/**
* Sample filter that implements some very simple business logic. The goal is
* to provide some functional tests for Cactus and examples for Cactus users.
* This filter simply adds a header and a footer to the returned HTML.
*
* @author <a href="mailto:vmassol@apache.org">Vincent Massol</a>
*
* @version $Id: SampleFilter.java,v 1.1 2003/01/24 03:44:46 jvanzyl Exp $
*/
public class SampleFilter implements Filter
{
/**
* We need to save the filter config as the Fitler API does not offer
* a means to get the filter config ... except in the <code>init()</code>
*/
private FilterConfig config;
/**
* Filter initialisation. Called by the servlet engine during the life
* cycle of the filter.
*
* @param theConfig the filter config
*
* @exception ServletException on failure
*/
public void init(FilterConfig theConfig) throws ServletException
{
this.config = theConfig;
}
/**
* Perform the filter function. Called by the container upon a request
* matching the filter pattern defined in <code>web.xml</code>.
*
* @param theRequest the incmoing HTTP request
* @param theResponse the returned HTTP response
* @param theChain the chain of filters extracted from the definition
* given in <code>web.xml</code> by the container.
*
* @exception ServletException on failure
* @exception IOException on failure
*/
public void doFilter(ServletRequest theRequest,
ServletResponse theResponse, FilterChain theChain) throws IOException,
ServletException
{
OutputStream out = theResponse.getOutputStream();
addHeader(out);
// Create a wrapper of the response so that we can later write to
// the response (add the footer). If we did not do this, we would
// get an error saying that the response has already been
// committed.
GenericResponseWrapper wrapper =
new GenericResponseWrapper((HttpServletResponse) theResponse);
theChain.doFilter(theRequest, wrapper);
out.write(wrapper.getData());
addFooter(out);
out.close();
}
/**
* Write the header to the output stream. The header text is extracted
* from a filter initialisation parameter (defined in
* <code>web.xml</code>). Don't write anything if no parameter is defined.
*
* @param theOutputStream the output stream
*
* @exception IOException on failure
*/
protected void addHeader(OutputStream theOutputStream) throws IOException
{
String header = this.config.getInitParameter("header");
if (header != null)
{
theOutputStream.write(header.getBytes());
}
}
/**
* Write the footer to the output stream. The footer text is extracted
* from a filter initialisation parameter (defined in
* <code>web.xml</code>). Don't write anything if no parameter is defined.
*
* @param theOutputStream the output stream
*
* @exception IOException on failure
*/
protected void addFooter(OutputStream theOutputStream) throws IOException
{
String footer = this.config.getInitParameter("footer");
if (footer != null)
{
theOutputStream.write(footer.getBytes());
}
}
/**
* Filter un-initialisation. Called by the servlet engine during the life
* cycle of the filter.
*/
public void destroy()
{
}
}

View File

@ -0,0 +1,79 @@
package org.apache.maven.cactus.sample;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class SampleServlet extends HttpServlet
{
public boolean isAuthenticated(HttpServletRequest request)
{
HttpSession session = request.getSession(false);
if (session == null)
{
return false;
}
String authenticationAttribute =
(String) session.getAttribute("authenticated");
return new Boolean(authenticationAttribute).booleanValue();
}
}

View File

@ -0,0 +1,123 @@
package org.apache.maven.cactus.sample.util;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletOutputStream;
/**
* Helper class to help write filters that manipulates the output stream. This
* is because normally, the <code>ServletOutputStream</code> cannot be
* modified after a resource has committed it.
*
* Note: This code was adapted from the Filter tutorial found
* {@link <a href="http://www.orionserver.com/tutorials/filters/lesson3/">
* here</a>}
*
* @author <a href="mailto:vmassol@apache.org">Vincent Massol</a>
*
* @version $Id: FilterServletOutputStream.java,v 1.1 2003/01/24 03:44:47 jvanzyl Exp $
*
* @see GenericResponseWrapper
*/
public class FilterServletOutputStream extends ServletOutputStream
{
/**
* The stream where all the data will get written to
*/
private DataOutputStream stream;
/**
* Constructor.
*
* @param theOutput the output stream that we wrap in a
* <code>DataOutputStream</code> in order to hold the data
*/
public FilterServletOutputStream(OutputStream theOutput)
{
stream = new DataOutputStream(theOutput);
}
// Overriden methods from ServletOutputStream ----------------------------
/**
* @see ServletOutputStream#write(int)
*/
public void write(int b) throws IOException
{
stream.write(b);
}
/**
* @see ServletOutputStream#write(byte[])
*/
public void write(byte[] b) throws IOException
{
stream.write(b);
}
/**
* @see ServletOutputStream#write(byte[], int, int)
*/
public void write(byte[] b, int off, int len) throws IOException
{
stream.write(b, off, len);
}
}

View File

@ -0,0 +1,179 @@
package org.apache.maven.cactus.sample.util;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* Wrapper around a <code>HttpServletResponse</code> that we use to easily
* write filters that manipulate the output stream. Indeed, we cannot pass
* the output stream of our filter direectly to the next filter in the chain
* because then we won't be able to write to it (the response will have been
* committed). Instead, we pass this wrapper class and then copy its data
* to our filter output stream.
*
* Note: This code was adapted from the Filter tutorial found
* {@link <a href="http://www.orionserver.com/tutorials/filters/lesson3/">
* here</a>}
*
* @author <a href="mailto:vmassol@apache.org">Vincent Massol</a>
*
* @version $Id: GenericResponseWrapper.java,v 1.1 2003/01/24 03:44:46 jvanzyl Exp $
*
* @see FilterServletOutputStream
*/
public class GenericResponseWrapper extends HttpServletResponseWrapper
{
/**
* Holder for the output data
*/
private ByteArrayOutputStream output;
/**
* Save the content length so that we can query it at a later time
* (otherwise it would not be possible as
* <code>HttpServletResponseWrapper</code> does not have a method to get
* the content length).
*/
private int contentLength;
/**
* Save the content type so that we can query it at a later time
* (otherwise it would not be possible as
* <code>HttpServletResponseWrapper</code> does not have a method to get
* the content type).
*/
private String contentType;
// Constructors ----------------------------------------------------------
/**
* @param theResponse the wrapped response object
*/
public GenericResponseWrapper(HttpServletResponse theResponse)
{
super(theResponse);
this.output = new ByteArrayOutputStream();
}
// New methods -----------------------------------------------------------
/**
* @return the data sent to the output stream
*/
public byte[] getData()
{
return output.toByteArray();
}
// Overridden methods ----------------------------------------------------
/**
* @see HttpServletResponseWrapper#getOutputStream()
*/
public ServletOutputStream getOutputStream()
{
return new FilterServletOutputStream(this.output);
}
/**
* @see HttpServletResponseWrapper#setContentLength(int)
*/
public void setContentLength(int theLength)
{
this.contentLength = theLength;
super.setContentLength(theLength);
}
/**
* @see HttpServletResponseWrapper#getContentLength()
*/
public int getContentLength()
{
return this.contentLength;
}
/**
* @see HttpServletResponseWrapper#setContentType(String)
*/
public void setContentType(String theType)
{
this.contentType = theType;
super.setContentType(theType);
}
/**
* @see HttpServletResponseWrapper#getContentType()
*/
public String getContentType()
{
return this.contentType;
}
/**
* @see HttpServletResponseWrapper#getWriter()
*/
public PrintWriter getWriter()
{
return new PrintWriter(getOutputStream(), true);
}
}

View File

@ -0,0 +1,170 @@
package org.apache.maven.cactus.sample;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTag;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.cactus.JspTestCase;
import org.apache.cactus.WebResponse;
/**
* Tests of the <code>SampleBodyTag</code> class.
*
* @author <a href="mailto:nick@eblox.com">Nciholas Lesiecki</a>
*
* @version $Id: TestSampleBodyTag.java,v 1.1 2003/01/24 03:44:46 jvanzyl Exp $
*/
public class TestSampleBodyTag extends JspTestCase
{
private SampleBodyTag tag;
private BodyContent tagContent;
/**
* Defines the testcase name for JUnit.
*
* @param theName the testcase's name.
*/
public TestSampleBodyTag(String theName)
{
super(theName);
}
/**
* Start the tests.
*
* @param theArgs the arguments. Not used
*/
public static void main(String[] theArgs)
{
junit.swingui.TestRunner.main(
new String[] { TestSampleBodyTag.class.getName() });
}
/**
* @return a test suite (<code>TestSuite</code>) that includes all methods
* starting with "test"
*/
public static Test suite()
{
// All methods starting with "test" will be executed in the test suite.
return new TestSuite(TestSampleBodyTag.class);
}
/**
* In addition to creating the tag instance and adding the pageContext to
* it, this method creates a BodyContent object and passes it to the tag.
*/
public void setUp()
{
this.tag = new SampleBodyTag();
this.tag.setPageContext(this.pageContext);
//create the BodyContent object and call the setter on the tag instance
this.tagContent = this.pageContext.pushBody();
this.tag.setBodyContent(this.tagContent);
}
//-------------------------------------------------------------------------
/**
* Sets the replacement target and replacement String on the tag, then calls
* doAfterBody(). Most of the assertion work is done in endReplacement().
*/
public void testReplacement() throws Exception
{
//set the target and the String to replace it with
this.tag.setTarget("@target@");
this.tag.setReplacement("replacement");
//add the tag's body by writing to the BodyContent object created in
//setUp()
this.tagContent.println("@target@ is now @target@");
this.tagContent.println("@target@_@target@");
//none of the other life cycle methods need to be implemented, so they
//do not need to be called.
int result = this.tag.doAfterBody();
assertEquals(BodyTag.SKIP_BODY, result);
}
public void tearDown()
{
//necessary for tag to output anything on most servlet engines.
this.pageContext.popBody();
}
/**
* Verifies that the target String has indeed been replaced in the tag's
* body.
*/
public void endReplacement(WebResponse theResponse)
{
String content = theResponse.getText();
assertTrue("Response should have contained the ["
+ "replacement is now replacement] string",
content.indexOf("replacement is now replacement") > -1);
assertTrue("Response should have contained the ["
+ "replacement_replacement] string",
content.indexOf("replacement") > -1);
}
}

View File

@ -0,0 +1,259 @@
package org.apache.maven.cactus.sample;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.cactus.FilterTestCase;
import org.apache.cactus.WebResponse;
/**
* Tests of the <code>SampleFilter</code> filter class.
*
* @author <a href="mailto:vmassol@apache.org">Vincent Massol</a>
*
* @version $Id: TestSampleFilter.java,v 1.1 2003/01/24 03:44:46 jvanzyl Exp $
*/
public class TestSampleFilter extends FilterTestCase
{
/**
* Defines the testcase name for JUnit.
*
* @param theName the testcase's name.
*/
public TestSampleFilter(String theName)
{
super(theName);
}
/**
* Start the tests.
*
* @param theArgs the arguments. Not used
*/
public static void main(String[] theArgs)
{
junit.swingui.TestRunner.main(
new String[] { TestSampleFilter.class.getName() });
}
/**
* @return a test suite (<code>TestSuite</code>) that includes all methods
* starting with "test"
*/
public static Test suite()
{
// All methods starting with "test" will be executed in the test suite.
return new TestSuite(TestSampleFilter.class);
}
//-------------------------------------------------------------------------
/**
* Test that adding a header to the output stream is working fine when
* a header parameter is defined.
*
* @exception ServletException on test failure
* @exception IOException on test failure
*/
public void testAddHeaderParamOK() throws ServletException, IOException
{
SampleFilter filter = new SampleFilter();
config.setInitParameter("header", "<h1>header</h1>");
filter.init(config);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
filter.addHeader(baos);
assertEquals("<h1>header</h1>", baos.toString());
}
//-------------------------------------------------------------------------
/**
* Test that adding a header to the output stream is working fine
* (i.e. nothing gets written) when no header parameter is defined.
*
* @exception ServletException on test failure
* @exception IOException on test failure
*/
public void testAddHeaderParamNotDefined() throws ServletException,
IOException
{
SampleFilter filter = new SampleFilter();
filter.init(config);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
filter.addHeader(baos);
assertEquals("", baos.toString());
}
//-------------------------------------------------------------------------
/**
* Test that adding a footer to the output stream is working fine when
* a footer parameter is defined.
*
* @exception ServletException on test failure
* @exception IOException on test failure
*/
public void testAddFooterParamOK() throws ServletException, IOException
{
SampleFilter filter = new SampleFilter();
config.setInitParameter("footer", "<h1>footer</h1>");
filter.init(config);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
filter.addFooter(baos);
assertEquals("<h1>footer</h1>", baos.toString());
}
//-------------------------------------------------------------------------
/**
* Test that adding a footer to the output stream is working fine
* (i.e. nothing gets written) when no footer parameter is defined.
*
* @exception ServletException on test failure
* @exception IOException on test failure
*/
public void testAddFooterParamNotDefined() throws ServletException,
IOException
{
SampleFilter filter = new SampleFilter();
filter.init(config);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
filter.addFooter(baos);
assertEquals("", baos.toString());
}
//-------------------------------------------------------------------------
/**
* Test that the filter does correctly add a header and footer to
* any requets it is serving.
*
* @exception ServletException on test failure
* @exception IOException on test failure
*/
public void testDoFilterOK() throws ServletException, IOException
{
SampleFilter filter = new SampleFilter();
config.setInitParameter("header", "<h1>header</h1>");
config.setInitParameter("footer", "<h1>footer</h1>");
filter.init(config);
FilterChain mockFilterChain = new FilterChain()
{
public void doFilter(ServletRequest theRequest,
ServletResponse theResponse) throws IOException,
ServletException
{
PrintWriter writer = theResponse.getWriter();
writer.print("<p>some content</p>");
writer.close();
}
public void init(FilterConfig theConfig)
{
}
public void destroy()
{
}
};
filter.doFilter(request, response, mockFilterChain);
}
/**
* Test that the filter does correctly add a header and footer to
* any requets it is serving.
*
* @param theResponse the response from the server side.
*/
public void endDoFilterOK(WebResponse theResponse)
{
assertEquals("<h1>header</h1><p>some content</p><h1>footer</h1>",
theResponse.getText());
}
}

View File

@ -0,0 +1,97 @@
package org.apache.maven.cactus.sample;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import org.apache.cactus.ServletTestCase;
import org.apache.cactus.WebRequest;
public class TestSampleServlet extends ServletTestCase
{
public TestSampleServlet(String testName)
{
super(testName);
}
public void testIsAuthenticatedAuthenticated()
{
SampleServlet servlet = new SampleServlet();
session.setAttribute("authenticated", "true");
assertTrue(servlet.isAuthenticated(request));
}
public void testIsAuthenticatedNotAuthenticated()
{
SampleServlet servlet = new SampleServlet();
assertTrue(!servlet.isAuthenticated(request));
}
public void beginIsAuthenticatedNoSession(WebRequest request)
{
request.setAutomaticSession(false);
}
public void testIsAuthenticatedNoSession()
{
SampleServlet servlet = new SampleServlet();
assertTrue(!servlet.isAuthenticated(request));
}
}

View File

@ -0,0 +1,185 @@
<?xml version="1.0"?>
<!--
=============================================================================
Script for running Cactus tests in Resin 2.x
=============================================================================
-->
<project xmlns:j="jelly:core">
<!--
========================================================================
Run the Cactus tests in Resin 2.x
========================================================================
-->
<goal name="cactus:test-resin-2x"
description="Run the Cactus tests in Resin 2.x">
<j:set var="home" value="${maven.cactus.resin2x.home}X"/>
<!-- Verify Resin home is defined -->
<j:choose>
<j:when test="${home != 'X'}">
<echo message="maven.cactus.resin2x.home = ${maven.cactus.resin2x.home}"/>
<attainGoal name="cactus:resin-2x-run"/>
</j:when>
<j:otherwise>
<echo>Property maven.cactus.resin2x.home is not defined</echo>
</j:otherwise>
</j:choose>
</goal>
<!--
========================================================================
Run Resin
========================================================================
-->
<goal name="cactus:resin-2x-run" prereqs="cactus:setup-resin-2x"
description="Start Resin, run the tests, stop Resin">
<!-- Start the servlet engine, wait for it to be started, run the
unit tests, stop the servlet engine, wait for it to be stopped.
The servlet engine is stopped if the tests fail for any reason -->
<!-- Is Resin 2.x already started? -->
<condition property="resin2xstarted">
<socket server="localhost" port="${maven.cactus.port}"/>
</condition>
<j:choose>
<j:when test="${resin2xstarted == null}">
<j:thread>
<attainGoal name="cactus:start-resin-2x"/>
</j:thread>
</j:when>
<j:otherwise>
<attainGoal name="cactus:redeploy-resin-2x"/>
</j:otherwise>
</j:choose>
<waitfor checkevery="500">
<http url="http://localhost:${maven.cactus.port}/test/ServletRedirector?Cactus_Service=RUN_TEST"/>
</waitfor>
<attainGoal name="cactus:test-${maven.cactus.testrunner}"/>
<!-- Only stop if the container was not already started -->
<j:if test="${resin2xstarted == null}">
<attainGoal name="cactus:stop-resin-2x"/>
<waitfor checkevery="500">
<not>
<http url="http://localhost:${maven.cactus.port}/test/ServletRedirector?Cactus_Service=RUN_TEST"/>
</not>
</waitfor>
</j:if>
</goal>
<!--
========================================================================
Deploy the test webapp in Resin
========================================================================
-->
<goal name="cactus:deploy-resin-2x" prereqs="cactus:webapp"
description="Deploy the test webapp in Resin">
<copy todir="${maven.cactus.build.dir}/resin2x/test">
<fileset dir="${maven.cactus.build.dir}/${pom.id}"/>
</copy>
</goal>
<!--
========================================================================
Redeploy the test webapp in Resin by only deploying the files in
WEB-INF/classes (it is faster)
========================================================================
-->
<goal name="cactus:redeploy-resin-2x" prereqs="cactus:webapp"
description="Redeploy the test webapp in Resin">
<copy todir="${maven.cactus.build.dir}/resin2x/test">
<fileset dir="${maven.cactus.build.dir}/${pom.id}">
<include name="WEB-INF/classes/**"/>
</fileset>
</copy>
</goal>
<!--
========================================================================
Prepare directories and variables for running the tests
========================================================================
-->
<goal name="cactus:setup-resin-2x"
description="Prepare directories and variables for running the tests">
<mkdir dir="${maven.cactus.build.dir}/resin2x"/>
<copy todir="${maven.cactus.build.dir}/resin2x" filtering="on">
<fileset dir="${maven.cactus.conf.containers.dir}/resin2x"/>
<filterset>
<filter token="maven.cactus.port" value="${maven.cactus.port}"/>
</filterset>
</copy>
</goal>
<!--
========================================================================
Start Resin 2.x
========================================================================
-->
<goal name="cactus:start-resin-2x"
prereqs="cactus:setup-resin-2x,cactus:deploy-resin-2x"
description="Starts Resin 2.x">
<java classname="org.apache.cactus.ant.ResinRun" fork="yes">
<arg value="-start"/>
<arg value="-conf"/>
<arg value="resin.conf"/>
<!-- Needed so that Resin use the resin home variable as it's
root directory for resolving file paths -->
<jvmarg value="-Dresin.home=${maven.cactus.build.dir}/resin2x"/>
<classpath>
<pathelement location="${plugin.getDependencyPath('cactus:cactus-ant')}"/>
<fileset dir="${maven.cactus.resin2x.home}/lib">
<include name="*.jar"/>
</fileset>
</classpath>
</java>
</goal>
<!--
========================================================================
Stop Resin 2.x
========================================================================
-->
<goal name="cactus:stop-resin-2x"
description="Stops a running Resin 2.x">
<java classname="org.apache.cactus.ant.ResinRun" fork="yes">
<arg value="-stop"/>
<classpath>
<pathelement location="${plugin.getDependencyPath('cactus:cactus-ant')}"/>
<fileset dir="${maven.cactus.resin2x.home}/lib">
<include name="*.jar"/>
</fileset>
</classpath>
</java>
</goal>
</project>

View File

@ -0,0 +1,198 @@
<?xml version="1.0"?>
<!--
=============================================================================
Script for running Cactus tests in Tomcat 4.x
=============================================================================
-->
<project xmlns:j="jelly:core">
<!--
========================================================================
Run the Cactus tests in Tomcat 4.x
========================================================================
-->
<goal name="cactus:test-tomcat-4x"
description="Run the Cactus tests in Tomcat 4.x">
<j:set var="home" value="${maven.cactus.tomcat4x.home}X"/>
<!-- Verify Tomcat home is defined -->
<j:choose>
<j:when test="${home != 'X'}">
<echo message="maven.cactus.tomcat4x.home = ${maven.cactus.tomcat4x.home}"/>
<attainGoal name="cactus:tomcat-4x-run"/>
</j:when>
<j:otherwise>
<echo>Property maven.cactus.tomcat4x.home is not defined</echo>
</j:otherwise>
</j:choose>
</goal>
<!--
========================================================================
Run the tests
========================================================================
-->
<goal name="cactus:tomcat-4x-run"
description="Start Tomcat, run the tests, stop Tomcat">
<!-- Start the servlet engine, wait for it to be started, run the
unit tests, stop the servlet engine, wait for it to be stopped.
The servlet engine is stopped if the tests fail for any reason -->
<!-- Is Tomcat 4.x already started? -->
<condition property="tomcat4xstarted">
<socket server="localhost" port="${maven.cactus.port}"/>
</condition>
<j:choose>
<j:when test="${tomcat4xstarted == null}">
<j:thread>
<attainGoal name="cactus:start-tomcat-4x"/>
</j:thread>
</j:when>
<j:otherwise>
<attainGoal name="cactus:redeploy-tomcat-4x"/>
</j:otherwise>
</j:choose>
<waitfor checkevery="500">
<http url="http://localhost:${maven.cactus.port}/test/ServletRedirector?Cactus_Service=RUN_TEST"/>
</waitfor>
<attainGoal name="cactus:test-${maven.cactus.testrunner}"/>
<!-- Only stop if the container was not already started -->
<j:if test="${tomcat4xstarted == null}">
<attainGoal name="cactus:stop-tomcat-4x"/>
<waitfor checkevery="500">
<not>
<http url="http://localhost:${maven.cactus.port}/test/ServletRedirector?Cactus_Service=RUN_TEST"/>
</not>
</waitfor>
</j:if>
</goal>
<!--
========================================================================
Deploy the test webapp in Tomcat
========================================================================
-->
<goal name="cactus:deploy-tomcat-4x" prereqs="cactus:webapp"
description="Deploy the test webapp in Tomcat">
<copy todir="${maven.cactus.build.dir}/tomcat4x/webapps/test">
<fileset dir="${maven.cactus.build.dir}/${pom.id}"/>
</copy>
</goal>
<!--
========================================================================
Redeploy the test webapp in Tomcat by only deploying the files in
WEB-INF/classes (it is faster)
========================================================================
-->
<goal name="cactus:redeploy-tomcat-4x" prereqs="cactus:webapp"
description="Redeploy the test webapp in Tomcat">
<copy todir="${maven.cactus.build.dir}/tomcat4x/webapps/test">
<fileset dir="${maven.cactus.build.dir}/${pom.id}">
<include name="WEB-INF/classes/**"/>
</fileset>
</copy>
<!-- Ideally we would need to wait until Tomcat has finished reloading
the changes. But apart from using the new Manager in Tomcat 4.1.x
I don't know how to do that ... Thus ATM there is a risk that
Tomcat will not have picked up the changes when the tests
run... -->
</goal>
<!--
========================================================================
Set up a Tomcat directory structure
========================================================================
-->
<goal name="cactus:setup-tomcat-4x"
description="Set up a Tomcat directory structure">
<!-- Create work and conf directories and copy configuration files -->
<mkdir dir="${maven.cactus.build.dir}/tomcat4x/conf"/>
<mkdir dir="${maven.cactus.build.dir}/tomcat4x/webapps"/>
<!-- Copy Tomcat configuration files, replacing filter tokens -->
<copy todir="${maven.cactus.build.dir}/tomcat4x/conf" filtering="on">
<fileset dir="${maven.cactus.conf.containers.dir}/tomcat4x"/>
<filterset>
<filter token="maven.cactus.port" value="${maven.cactus.port}"/>
<filter token="maven.cactus.tomcat4x.home"
value="${maven.cactus.tomcat4x.home}"/>
</filterset>
</copy>
<!-- Copy the Tomcat web.xml - We need to copy this file as it has
changed between Tomcat 4.x versions and one version of it doesn't
work with another version of Tomcat 4 -->
<copy file="${maven.cactus.tomcat4x.home}/conf/web.xml"
todir="${maven.cactus.build.dir}/tomcat4x/conf"/>
</goal>
<!--
========================================================================
Start Tomcat 4.x
========================================================================
-->
<goal name="cactus:start-tomcat-4x"
prereqs="cactus:setup-tomcat-4x,cactus:deploy-tomcat-4x"
description="Starts Tomcat 4.x">
<java classname="org.apache.catalina.startup.Bootstrap" fork="yes">
<jvmarg value="-Dcatalina.home=${maven.cactus.tomcat4x.home}"/>
<jvmarg value="-Dcatalina.base=${maven.cactus.build.dir}/tomcat4x"/>
<arg value="start"/>
<classpath>
<pathelement path="${java.home}/../lib/tools.jar"/>
<fileset dir="${maven.cactus.tomcat4x.home}">
<include name="bin/bootstrap.jar"/>
</fileset>
</classpath>
</java>
</goal>
<!--
========================================================================
Stop Tomcat 4.x
========================================================================
-->
<goal name="cactus:stop-tomcat-4x"
description="Stops a running Tomcat 4.x">
<java classname="org.apache.catalina.startup.Bootstrap" fork="yes">
<jvmarg value="-Dcatalina.home=${maven.cactus.tomcat4x.home}"/>
<jvmarg value="-Dcatalina.base=${maven.cactus.build.dir}/tomcat4x"/>
<arg value="stop"/>
<classpath>
<fileset dir="${maven.cactus.tomcat4x.home}">
<include name="bin/bootstrap.jar"/>
</fileset>
</classpath>
</java>
</goal>
</project>

View File

@ -0,0 +1,207 @@
<?xml version="1.0"?>
<!--
=============================================================================
Script for running Cactus tests in WebLogic 7.x
=============================================================================
-->
<project xmlns:j="jelly:core">
<!--
========================================================================
Run the Cactus tests in WebLogic 7.x
========================================================================
-->
<goal name="cactus:test-weblogic-7x"
description="Run the Cactus tests in WebLogic 7.x">
<j:set var="home" value="${maven.cactus.weblogic7x.home}X"/>
<!-- Verify Tomcat home is defined -->
<j:choose>
<j:when test="${home != 'X'}">
<echo message="maven.cactus.weblogic7x.home = ${maven.cactus.weblogic7x.home}"/>
<attainGoal name="cactus:weblogic-7x-run"/>
</j:when>
<j:otherwise>
<echo>Property maven.cactus.weblogic7x.home is not defined</echo>
</j:otherwise>
</j:choose>
</goal>
<!--
========================================================================
Run the tests
========================================================================
-->
<goal name="cactus:weblogic-7x-run"
description="Start WebLogic, run the tests, stop WebLogic">
<!-- Start the servlet engine, wait for it to be started, run the
unit tests, stop the servlet engine, wait for it to be stopped.
The servlet engine is stopped if the tests fail for any reason -->
<!-- Is WebLogic 7.x already started? -->
<condition property="weblogic7xstarted">
<socket server="localhost" port="${maven.cactus.port}"/>
</condition>
<j:choose>
<j:when test="${weblogic7xstarted == null}">
<j:thread>
<attainGoal name="cactus:start-weblogic-7x"/>
</j:thread>
</j:when>
<j:otherwise>
<attainGoal name="cactus:redeploy-weblogic-7x"/>
</j:otherwise>
</j:choose>
<waitfor checkevery="500">
<http url="http://localhost:${maven.cactus.port}/test/ServletRedirector?Cactus_Service=RUN_TEST"/>
</waitfor>
<attainGoal name="cactus:test-${maven.cactus.testrunner}"/>
<!-- Only stop if the container was not already started -->
<j:if test="${weblogic7xstarted == null}">
<attainGoal name="cactus:stop-weblogic-7x"/>
<waitfor checkevery="500">
<not>
<http url="http://localhost:${maven.cactus.port}/test/ServletRedirector?Cactus_Service=RUN_TEST"/>
</not>
</waitfor>
</j:if>
</goal>
<!--
========================================================================
Deploy the test webapp in WebLogic
========================================================================
-->
<goal name="cactus:deploy-weblogic-7x" prereqs="cactus:webapp"
description="Deploy the test webapp in WebLogic">
<copy todir="${maven.cactus.build.dir}/weblogic7x/testdomain/applications/test">
<fileset dir="${maven.cactus.build.dir}/${pom.id}"/>
<!-- Update the war to include the proprietary weblogic.xml config
file. -->
<fileset dir="${maven.cactus.conf.containers.dir}/weblogic7x">
<include name="weblogic.xml"/>
</fileset>
</copy>
</goal>
<!--
========================================================================
Redeploy the test webapp in WebLogic
========================================================================
-->
<goal name="cactus:redeploy-weblogic-7x" prereqs="cactus:webapp"
description="Redeploy the test webapp in WebLogic">
<copy todir="${maven.cactus.build.dir}/tomcat4x/webapps/test">
<fileset dir="${maven.cactus.build.dir}/${pom.id}">
<include name="WEB-INF/classes/**"/>
</fileset>
</copy>
</goal>
<!--
========================================================================
Set up a WebLogic directory structure
========================================================================
-->
<goal name="cactus:setup-weblogic-7x"
description="Set up a WebLogic directory structure">
<mkdir dir="${maven.cactus.build.dir}/weblogic7x/testdomain/applications"/>
<mkdir dir="${maven.cactus.build.dir}/weblogic7x/testdomain/testserver"/>
<!-- Copy WL configuration files -->
<copy todir="${maven.cactus.build.dir}/weblogic7x/testdomain"
filtering="on">
<fileset dir="${maven.cactus.conf.containers.dir}/weblogic7x">
<exclude name="SerializedSystemIni.dat"/>
<exclude name="DefaultAuthenticatorInit.ldift"/>
<exclude name="weblogic.xml"/>
</fileset>
<filterset>
<filter token="maven.cactus.port" value="${maven.cactus.port}"/>
<filter token="maven.cactus.weblogic7x.home"
value="${maven.cactus.weblogic7x.home}"/>
</filterset>
</copy>
<copy todir="${maven.cactus.build.dir}/weblogic7x/testdomain"
filtering="off">
<fileset dir="${maven.cactus.conf.containers.dir}/weblogic7x">
<include name="SerializedSystemIni.dat"/>
<include name="DefaultAuthenticatorInit.ldift"/>
<exclude name="weblogic.xml"/>
</fileset>
</copy>
</goal>
<!--
========================================================================
Start WebLogic 7.x
========================================================================
-->
<goal name="cactus:start-weblogic-7x"
prereqs="cactus:setup-weblogic-7x,cactus:deploy-weblogic-7x"
description="Starts WebLogic 7.x">
<java classname="weblogic.Server" fork="yes"
dir="${maven.cactus.build.dir}/weblogic7x/testdomain">
<classpath>
<pathelement location="${maven.cactus.weblogic7x.home}/weblogic700/server/lib/weblogic_sp.jar"/>
<pathelement location="${maven.cactus.weblogic7x.home}/weblogic700/server/lib/weblogic.jar"/>
</classpath>
<jvmarg value="-hotspot"/>
<jvmarg value="-ms64m"/>
<jvmarg value="-mx64m"/>
<jvmarg value="-Djava.library.path=${java.library.path};${maven.cactus.weblogic7x.home}/weblogic700/server/bin"/>
<jvmarg value="-Dweblogic.Name=testserver"/>
<jvmarg value="-Dbea.home=${maven.cactus.weblogic7x.home}"/>
<jvmarg value="-Dweblogic.management.username=system"/>
<jvmarg value="-Dweblogic.management.password=password"/>
<jvmarg value="-Djava.security.policy==./server/lib/weblogic.policy"/>
</java>
</goal>
<!--
========================================================================
Stop WebLogic 7.x
========================================================================
-->
<goal name="cactus:stop-weblogic-7x"
description="Stops a running WebLogic 7.x">
<java classname="weblogic.Admin" fork="yes">
<classpath>
<pathelement location="${maven.cactus.weblogic7x.home}/weblogic700/server/lib/weblogic_sp.jar"/>
<pathelement location="${maven.cactus.weblogic7x.home}/weblogic700/server/lib/weblogic.jar"/>
</classpath>
<arg line="-url t3://localhost:${maven.cactus.port}"/>
<arg line="-username system"/>
<arg line="-password password"/>
<arg value="SHUTDOWN"/>
</java>
</goal>
</project>

1
cactus/xdocs/.cvsignore Normal file
View File

@ -0,0 +1 @@
stylesheets

84
cactus/xdocs/changes.xml Normal file
View File

@ -0,0 +1,84 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Changes</title>
<author email="vmassol@octo.com">Vincent Massol</author>
</properties>
<body>
<release version="1.2" date="in CVS">
<action dev="vmassol" type="add">
Added Checkstyle report to Cactus plugin web site.
</action>
<action dev="vmassol" type="fix">
The plugin now works even if not connected to the internet.
</action>
<action dev="vmassol" type="fix" due-to="Eric Pugh" due-to-email="EPugh@upstate.com">
Fixed problem when the <code>web.xml</code> of the application to
test was defining security configuration. The Cactus was adding its
own but the web.xml DTD only supports one. The new implementation
discards the application security information which is replaced by
the Cactus definition.
</action>
</release>
<release version="1.1" date="2002-11-16">
<action dev="vmassol" type="add">
Added support for HttpUnit integration out of the box (i.e. the
HttpUnit jars are automatically added by the Cactus plugin).
</action>
<action dev="vmassol" type="add">
Ability to exclude Cactus tests (for long running tests for example,
in debug period).
</action>
<action dev="vmassol" type="update">
The <code>web.xml</code> elements required for Cactus are now
automatically added to the user project <code>web.xml</code>.
</action>
<action dev="vmassol" type="add">
Added support for running the tests using the JUnit Swing Test Runner.
Simply create the following Maven property
<code>maven.cactus.testrunner = swing</code> to use the Swing Test
Runner.
</action>
<action dev="vmassol" type="add">
Added automatic discovery of Cactus Test Cases and ignore test support
classes.
</action>
<action dev="vmassol" type="update">
Creation of the project war/webapp is now left to the Maven War plugin.
Cactus repackages it by adding the Cactus tests, the Cactus
configuration files and the Cactus external jars. Thus, the Cactus
plugin now supports the "war:webapp" goal.
</action>
<action dev="vmassol" type="update">
Improved documentation: "news" section on front page and improved
"Quick Start" page.
</action>
<action dev="vmassol" type="add">
Support for WebLogic 7.x.
</action>
</release>
<release version="1.0" date="2002-11-06">
<action dev="vmassol" type="add">
Sample project showing how to use the Cactus plugin.
</action>
<action dev="vmassol" type="add">
Generates HTML reports
</action>
<action dev="vmassol" type="add">
Support for Resin 2.x.
</action>
<action dev="vmassol" type="add">
Support for Tomcat 4.x (supports hot redeploy).
</action>
<action dev="vmassol" type="add">
Creation of the Cactus plugin
</action>
</release>
</body>
</document>

51
cactus/xdocs/features.xml Normal file
View File

@ -0,0 +1,51 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Features of the Cactus plugin</title>
<author email="vmassol@octo.com">Vincent Massol</author>
</properties>
<body>
<section name="Cactus Plug-in Features">
<ul>
<li>
Support for the following containers:
<ul>
<li>
Support for Tomcat 4.x
</li>
<li>
Support for Resin 2.x
</li>
<li>
Support for WebLogic 7.x
</li>
</ul>
</li>
<li>
HTML report generation (integrated with Maven reports).
</li>
<li>
Support for keeping the server running between redeployments.
</li>
<li>
Automatic discovery of Cactus Test Cases and ignore test support
classes.
</li>
<li>
Ability to use either the Text or Swing Test Runner for running the
Cactus tests.
</li>
<li>
Automatically merge the <code>web.xml</code> elements needed by
Cactus to the user project <code>web.xml</code> file.
</li>
<li>
Ability to exclude Cactus tests (for long running tests for example,
in debug period).
</li>
</ul>
</section>
</body>
</document>

52
cactus/xdocs/goals.xml Normal file
View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<document>
<properties>
<title>Maven cactus Plug-in Goals</title>
<author email="dion@apache.org">dIon Gillard</author>
</properties>
<body>
<goals>
<goal>
<name>cactus:compile</name>
<description>Compile Cactus tests</description>
</goal>
<goal>
<name>cactus:generate</name>
<description>Generate HTML report</description>
</goal>
<goal>
<name>cactus:init</name>
<description>Creates objects useful for several goals</description>
</goal>
<goal>
<name>cactus:merge-webxml</name>
<description>Generate a web.xml which is the merge betweem the user project web.xml and the webapp elements needed by Cactus</description>
</goal>
<goal>
<name>cactus:single</name>
<description>Execute a single test defined using the 'testcase' variable</description>
</goal>
<goal>
<name>cactus:test-init</name>
<description>Test initialization</description>
</goal>
<goal>
<name>cactus:test-swing</name>
<description>Start the tests using the swing runner</description>
</goal>
<goal>
<name>cactus:test-text</name>
<description>Start the tests using the text runner</description>
</goal>
<goal>
<name>cactus:webapp</name>
<description>Create the Cactus webapp</description>
</goal>
<goal>
<name>cactus:webapp-update</name>
<description>Generate an expanded Cactus webapp from a project expanded webapp</description>
</goal>
</goals>
</body>
</document>

62
cactus/xdocs/index.xml Normal file
View File

@ -0,0 +1,62 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Maven Cactus Plug-in</title>
<author email="vmassol@octo.com">Vincent Massol</author>
</properties>
<body>
<section name="Maven Cactus Plug-in">
<p>
This is a plugin for
<a href="http://jakarta.apache.org/cactus">Cactus</a> that
allows to automatically start containers, run Cactus tests and stop
the containers.
</p>
<p>
Currently, this plugin only supports the Servlet API 2.3.
</p>
</section>
<section name="News">
<table>
<tr>
<th>Date</th>
<th>Description</th>
</tr>
<tr>
<td>16 Nov 2002</td>
<td>
Release of version 1.1.
</td>
</tr>
<tr>
<td>06 Nov 2002</td>
<td>
Release of version 1.0. Read the announcement
<a href="http://www.mail-archive.com/turbine-maven-user%40jakarta.apache.org/msg01876.html">here</a>.
</td>
</tr>
</table>
</section>
<section name="Documentation roadmap">
<p>
Check the <a href="features.html">features</a> page for all features
of this plugin.
</p>
<p>
Then, you should read the <a href="using.html">Quick Start</a> page
which provides details about how to use the plugin.
</p>
<p>
A sample application using Cactus is packaged within the Cactus plugin.
Go to where you installed Maven and look into the
<code>plugins/maven-cactus-plugin-*/sample</code> directory.
</p>
<p>
The latest changes are available <a href="changes.html">here</a>.
</p>
</section>
</body>
</document>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="Maven Cactus Plugin">
<title>Maven Cactus Plugin</title>
<body>
<links>
<item name="Maven" href="http://jakarta.apache.org/turbine/maven/"/>
<item name="Cactus" href="http://jakarta.apache.org/cactus/"/>
</links>
<menu name="Overview">
<item name="Features" href="/features.html"/>
<item name="Quick Start" href="/using.html"/>
<item name="Goals" href="/goals.html"/>
<item name="Properties" href="/properties.html"/>
</menu>
<menu name="Downloads">
<item name="Cactus Plugin 1.0" href="http://www.ibiblio.org/maven/maven/jars/maven-cactus-plugin-1.0.jar"/>
<item name="Cactus Plugin 1.1" href="http://www.ibiblio.org/maven/maven/jars/maven-cactus-plugin-1.1.jar"/>
</menu>
</body>
</project>

164
cactus/xdocs/properties.xml Normal file
View File

@ -0,0 +1,164 @@
<?xml version="1.0" encoding="UTF-8"?>
<document>
<properties>
<title>cactus Properties</title>
<author email="dion@apache.org">dIon Gillard</author>
</properties>
<body>
<section name="cactus Settings">
<table>
<tr>
<th>Property</th>
<th>Optional?</th>
<th>Description</th>
</tr>
<tr>
<td>maven.cactus.test.fileset.exclude</td>
<td>Yes</td>
<td>
<p>Default value is
<code>
</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.testrunner.swing.excluded</td>
<td>Yes</td>
<td>
<p>Default value is
<code>${plugin.dir}/conf/excluded.properties</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.build.dir</td>
<td>Yes</td>
<td>
<p>Default value is
<code>${maven.build.dir}/cactus</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.src.dir</td>
<td>Yes</td>
<td>
<p>Default value is
<code>src/test-cactus</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.classes.dir</td>
<td>Yes</td>
<td>
<p>Default value is
<code>${maven.cactus.build.dir}/classes</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.scripts.dir</td>
<td>Yes</td>
<td>
<p>Default value is
<code>${plugin.dir}/scripts</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.webxml.dvsl</td>
<td>Yes</td>
<td>
<p>Default value is
<code>${plugin.dir}/conf/web.xml.dvsl</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.test.reportsDirectory</td>
<td>Yes</td>
<td>
<p>Default value is
<code>${maven.cactus.build.dir}/test-reports</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.build.resources.dir</td>
<td>Yes</td>
<td>
<p>Default value is
<code>${maven.cactus.build.dir}/resources</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.jspRedirector</td>
<td>Yes</td>
<td>
<p>Default value is
<code>${plugin.dir}/conf/web/jspRedirector.jsp</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.configFile</td>
<td>Yes</td>
<td>
<p>Default value is
<code>${plugin.dir}/conf/cactus.properties</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.junit.usefile</td>
<td>Yes</td>
<td>
<p>Default value is
<code>true</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.test.fileset.include</td>
<td>Yes</td>
<td>
<p>Default value is
<code>**/*.class</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.prewar.dir</td>
<td>Yes</td>
<td>
<p>Default value is
<code>${maven.war.build.dir}</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.emptywebxml</td>
<td>Yes</td>
<td>
<p>Default value is
<code>${plugin.dir}/conf/web.xml</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.port</td>
<td>Yes</td>
<td>
<p>Default value is
<code>8080</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.conf.containers.dir</td>
<td>Yes</td>
<td>
<p>Default value is
<code>${plugin.dir}/conf/containers</code>.</p>
</td>
</tr>
<tr>
<td>maven.cactus.testrunner</td>
<td>Yes</td>
<td>
<p>Default value is
<code>text</code>.</p>
</td>
</tr>
</table>
</section>
</body>
</document>

52
cactus/xdocs/tasks.xml Normal file
View File

@ -0,0 +1,52 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Tasks</title>
<author email="vmassol@octo.com">Vincent Massol</author>
</properties>
<body>
<section name="Tasks">
<p>
Lists of todos and ideas for future versions.
</p>
<subsection name="Unassigned">
<p>
<ul>
<li>
Describe plugin properties in the Maven plugin documentation.
</li>
<li>
Fix the "single" goal as it will not really work because it
expects that the cactus war has been deployed and it won't
redeploy it when the code changes.
</li>
<li>
Transform cactus Ant scripts to Jelly scripts for :
Tomcat 3.x, Orion 1.5, Orion 1.6, WebLogic 6.x,
Enhydra 5.x
</li>
<li>
Add more scripts for JBoss/Jonas/Jetty.
</li>
<li>
Add a <code>test-all</code> goal that runs the tests on all
defined containers.
</li>
<li>
Support packaging as an EAR for EJB unit testing. Requires the
EAR plugin first.
</li>
<li>
Add the rhino jar for HttpUnit javascript support.
</li>
</ul>
</p>
</subsection>
</section>
</body>
</document>

68
cactus/xdocs/using.xml Normal file
View File

@ -0,0 +1,68 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Using the Maven Cactus Plug-in</title>
<author email="vmassol@octo.com">Vincent Massol</author>
</properties>
<body>
<section name="Using the Maven Cactus Plug-in">
<ol>
<li>
Create a <code>src/test-cactus</code> directory in your project and
put your Cactus test classes in it (with the normal package directory
structure). Note that the location of the Cactus test sources can be
configured through the <code>maven.cactus.src.dir</code> property.
</li>
<li>
Create a <code>build.properties</code> file in your project root
directory (where <code>project.xml</code> is located) and define in
it the location of the container you wish to use for the tests. For
example, if you wish to run the Cactus tests on Tomcat 4.1.10 and on
Resin 2.4, you will write:
</li>
<source><![CDATA[
maven.cactus.tomcat4x.home = C:/Apps/jakarta-tomcat-4.1.10
maven.cactus.resin2x.home = C:/Apps/resin-2.1.4
]]></source>
<li>
Call the
<a href="http://jakarta.apache.org/turbine/maven/reference/plugins/war/index.html">War</a>
plugin's goals to generate a war for your webapp. For example:
<code>maven war</code>. Note that in the future you would also be
able to call the Ear plugin if your application is an EAR.
</li>
<li>
Then, simply run the Cactus goal for your container. For example,
type <code>maven cactus:test-tomcat-4x</code> to run the tests with
Tomcat 4.x. You can type <code>maven -g</code> for a full list of the
available goals.
</li>
<li>
If you wish to generate Cactus HTML test reports, type
<code>maven cactus:generate site</code>.
</li>
</ol>
<p>
The plugin will automatically add what is needed for the Cactus tests
to your application WAR/webapp by repackaging it. In detail, it will
add the Cactus test classes, Cactus configuration files and Cactus jars
to your WAR/webapp. It will then deploy it, configure the container you
have chosen, start it, run the Cactus tests and stop the container.
</p>
<p>
It is possible (and recommended for performance reasons) to run all the
goals in one Maven invocation. For example:
<code>maven war cactus:test-tomcat-4x cactus:generate site</code>. You
can also put that sequence in your project's <code>maven.xml</code>
file.
</p>
</section>
</body>
</document>

3
castor/.cvsignore Normal file
View File

@ -0,0 +1,3 @@
target
velocity.log
maven.log

26
castor/plugin.jelly Normal file
View File

@ -0,0 +1,26 @@
<project
xmlns:j="jelly:core"
xmlns:define="jelly:define"
xmlns:castor="castor">
<!-- ================================================================== -->
<!-- C A S T O R -->
<!-- ================================================================== -->
<define:taglib uri="castor">
<define:tag name="srcgen">
<java
className="org.exolab.castor.builder.SourceGenerator"
failonerror="true">
<arg value="-i${schema}"/>
<arg value="-f"/>
<arg value="-package${package}"/>
<arg value="-types${types}"/>
<arg value="-nomarshall"/>
<arg value="-dest${generationDirectory}"/>
</java>
</define:tag>
</define:taglib>
</project>

10
castor/plugin.properties Normal file
View File

@ -0,0 +1,10 @@
# -------------------------------------------------------------------
# Default Maven properties for the VDoclet plugin.
# -------------------------------------------------------------------
# These are the properties that we believe are immutable so we
# keep them apart from the project specific properties.
# -------------------------------------------------------------------
maven.vdoclet.srcDir = NOT_SET
maven.vdoclet.destDir = NOT_SET
maven.vdoclet.template = NOT_SET

View File

@ -0,0 +1,3 @@
# -------------------------------------------------------------------
# P R O J E C T P R O P E R T I E S
# -------------------------------------------------------------------

46
castor/project.xml Normal file
View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project>
<extend>${basedir}/../project.xml</extend>
<pomVersion>3</pomVersion>
<id>maven-castor-plugin</id>
<name>Maven Castor Plug-in</name>
<currentVersion>1.0</currentVersion>
<description>
Various goals for making development with Plexus easy.
</description>
<shortDescription>Plexus Tools</shortDescription>
<url>http://jakarta.apache.org/turbine/maven/reference/plugins/castor/</url>
<issueTrackingUrl>http://jira.werken.com/BrowseProject.jspa?id=10030</issueTrackingUrl>
<siteAddress>jakarta.apache.org</siteAddress>
<siteDirectory>/www/jakarta.apache.org/turbine/maven/reference/plugins/castor/</siteDirectory>
<distributionDirectory>/www/jakarta.apache.org/builds/jakarta-turbine-maven/</distributionDirectory>
<developers>
<developer>
<name>Jason van Zyl</name>
<id>jvanzyl</id>
<email>jason@zenplex.com</email>
<organization>Zenplex</organization>
<roles>
<role>Architect</role>
<role>Release Manager</role>
</roles>
</developer>
</developers>
<dependencies>
<dependency>
<id>castor</id>
<version>0.9.4</version>
<properties>
<classloader>root</classloader>
</properties>
</dependency>
</dependencies>
</project>

1
castor/xdocs/.cvsignore Normal file
View File

@ -0,0 +1 @@
stylesheets

16
castor/xdocs/changes.xml Normal file
View File

@ -0,0 +1,16 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Changes</title>
<author email="jason@zenplex.com">Jason van Zyl</author>
</properties>
<body>
<release version="1.0" date="2002-08-04">
<action dev="jvanzyl" type="add">
Original release for Maven 1.0-beta8
</action>
</release>
</body>
</document>

20
castor/xdocs/goals.xml Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Maven Castor Plug-in Goals</title>
<author email="jason@zenplex.com">Jason van Zyl</author>
</properties>
<body>
<goals>
<goal>
<name>castor:srcgen</name>
<description>
For a given project generate a plexus runtime using the required
components.
</description>
</goal>
</goals>
</body>
</document>

16
castor/xdocs/index.xml Normal file
View File

@ -0,0 +1,16 @@
<?xml version="1.0"?>
<document>
<properties>
<title>Maven Castor Plug-in</title>
<author email="jason@zenplex.com">Jason van Zyl</author>
</properties>
<body>
<section name="Maven Castor Plug-in">
<p>
A plugin that currently just sets up castor for use in Jelly
</p>
</section>
</body>
</document>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="Maven Castor Plugin">
<title>Maven Castor Plugin</title>
<body>
<links>
<item name="Maven" href="http://jakarta.apache.org/turbine/maven/"/>
<item name="Castor" href="http://castor.exolab.org/"/>
</links>
<menu name="Overview">
<item name="Goals" href="/goals.html" />
<item name="Properties" href="/properties.html" />
</menu>
</body>
</project>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<document>
<properties>
<title>Maven Castor Plugin Properties</title>
<author email="jason@zenplex.com">Jason van Zyl</author>
</properties>
<body>
<section name="Maven Castor Plugin Settings">
<table>
<tr>
<th>Property name</th>
<th>Optional?</th>
<th>Description</th>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</table>
</section>
</body>
</document>

3
changelog/.cvsignore Normal file
View File

@ -0,0 +1,3 @@
target
velocity.log
maven.log

63
changelog/plugin.jelly Normal file
View File

@ -0,0 +1,63 @@
<?xml version="1.0"?>
<project
xmlns:j="jelly:core"
xmlns:define="jelly:define"
xmlns:changelog="changelog"
xmlns:doc="doc">
<define:taglib uri="changelog">
<define:jellybean
name="changelog"
className="org.apache.maven.changelog.ChangeLog"
method="doExecute"
/>
</define:taglib>
<!-- ================================================================== -->
<!-- C H A N G E L O G R E P O R T -->
<!-- ================================================================== -->
<goal
name="maven-changelog-plugin:report"
description="Generate a changelog report">
<j:if test="${context.getVariable('maven.mode.online') == null}">
<j:set var="maven.mode.online" value="true"/>
</j:if>
<j:choose>
<j:when test="${maven.mode.online}">
<j:set var="_connection">${pom.repository.connection}</j:set>
<j:if test="${!empty(_connection)}">
<echo>Generating the changelog report</echo>
<mkdir dir="${maven.gen.docs}"/>
<changelog:changelog
basedir="${basedir}"
developers="${pom.developers}"
factory="${maven.changelog.factory}"
output="${maven.build.dir}/changelog.xml"
outputEncoding="${maven.docs.outputencoding}"
range="${maven.changelog.range}"
repositoryConnection="${pom.repository.connection}"
/>
<doc:jsl
input="${maven.build.dir}/changelog.xml"
output="changelog-report.xml"
stylesheet="${plugin.resources}/changelog.jsl"
encoding="${maven.docs.outputencoding}"
omitXmlDeclaration="false"
outputMode="xml"
prettyPrint="true"
/>
</j:if>
</j:when>
<j:otherwise>
<echo>The Changelog is available in the online mode only.</echo>
</j:otherwise>
</j:choose>
</goal>
</project>

View File

@ -0,0 +1,13 @@
# -------------------------------------------------------------------
# P L U G I N P R O P E R I E S
# -------------------------------------------------------------------
# CVS change log plugin.
# -------------------------------------------------------------------
# These three don't belong here.
maven.build.dir = ${basedir}/target
maven.gen.docs = ${maven.build.dir}/generated-xdocs
maven.docs.outputencoding = ISO-8859-1
maven.changelog.range = 30
maven.changelog.factory = org.apache.maven.cvslib.CvsChangeLogFactory

View File

@ -0,0 +1,5 @@
# -------------------------------------------------------------------
# P R O J E C T P R O P E R T I E S
# -------------------------------------------------------------------
maven.xdoc.date=left
maven.xdoc.version=${pom.currentVersion}

120
changelog/project.xml Normal file
View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project>
<extend>${basedir}/../project.xml</extend>
<pomVersion>3</pomVersion>
<id>maven-changelog-plugin</id>
<name>Maven Changelog Plug-in</name>
<currentVersion>1.2-SNAPSHOT</currentVersion>
<description>
</description>
<shortDescription>Java Project Management Tools</shortDescription>
<url>http://jakarta.apache.org/turbine/maven/reference/plugins/changelog/</url>
<issueTrackingUrl>http://jira.werken.com/BrowseProject.jspa?id=10030</issueTrackingUrl>
<siteAddress>jakarta.apache.org</siteAddress>
<siteDirectory>/www/jakarta.apache.org/turbine/maven/reference/plugins/changelog/</siteDirectory>
<distributionDirectory>/www/jakarta.apache.org/builds/jakarta-turbine-maven/</distributionDirectory>
<developers>
<developer>
<name>dIon Gillard</name>
<id>dion</id>
<email>dion@multitask.com.au</email>
<organization>Multitask Consulting</organization>
<roles>
<role>Java Developer</role>
<role>Documentation</role>
</roles>
</developer>
<developer>
<name>Pete Kazmier</name>
<id>kaz</id>
<email>pete-apache-dev@kazmier.com</email>
<organization></organization>
<roles>
<role>Documentation</role>
<role>Java Developer</role>
</roles>
</developer>
<developer>
<name>Emmanuel Venisse</name>
<id>evenisse</id>
<email>evenisse@ifrance.com</email>
<organization>Fi System</organization>
<roles>
<role>Java Developer</role>
</roles>
</developer>
<developer>
<name>Jason van Zyl</name>
<id>jvanzyl</id>
<email>jason@zenplex.com</email>
<organization>Zenplex</organization>
<roles>
<role>Architect</role>
<role>Release Manager</role>
</roles>
</developer>
</developers>
<dependencies>
<dependency>
<id>ant</id>
<version>1.5.1</version>
<properties>
<classloader>root</classloader>
</properties>
</dependency>
<dependency>
<id>commons-jelly+tags-jsl</id>
<version>SNAPSHOT</version>
<properties>
<classloader>root.maven</classloader>
</properties>
</dependency>
<dependency>
<groupId>commons-jelly</groupId>
<artifactId>commons-jelly-tags-xml</artifactId>
<version>SNAPSHOT</version>
<url>http://jakarta.apache.org/commons/sandbox/jelly/tags/xml/</url>
<properties>
<classloader>root.maven</classloader>
</properties>
</dependency>
<dependency>
<id>commons-logging</id>
<version>1.0.1</version>
</dependency>
<dependency>
<id>junit</id>
<version>3.8.1</version>
</dependency>
<dependency>
<id>regexp</id>
<version>1.2</version>
</dependency>
<!-- Required because of the Developer class -->
<dependency>
<id>maven</id>
<version>b5</version>
<jar>maven.jar</jar>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,341 @@
package org.apache.maven.changelog;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Collection;
import java.util.Date;
// maven imports
import org.apache.maven.util.AsyncStreamReader;
// commons imports
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
// ant imports
import org.apache.tools.ant.taskdefs.ExecuteStreamHandler;
import org.apache.tools.ant.taskdefs.Execute;
import org.apache.tools.ant.types.Commandline;
/**
* An abstract implementation of the {@link org.apache.maven.changelog.ChangeLog}
* interface.
*
* @author Glenn McAllister
* @author <a href="mailto:jeff.martin@synamic.co.uk">Jeff Martin</a>
* @author <a href="mailto:jason@zenplex.com">Jason van Zyl</a>
* @author <a href="mailto:dion@multitask.com.au">dIon Gillard</a>
* @author <a href="mailto:bodewig@apache.org">Stefan Bodewig</a>
* @author <a href="mailto:peter@apache.org">Peter Donald</a>
* @author <a href="mailto:pete-apache-dev@kazmier.com">Pete Kazmier</a>
* @version
* $Id: AbstractChangeLogGenerator.java,v 1.1 2003/01/24 03:44:50 jvanzyl Exp $
*/
public abstract class AbstractChangeLogGenerator
implements ChangeLogGenerator, ExecuteStreamHandler
{
/**
* The working directory.
*/
protected File base;
/**
* Reference to the enclosing ChangeLog instance - used to obtain
* any necessary configuration information.
*/
protected ChangeLog changeLogExecutor;
/**
* The parser that takes the log output and transforms it into a
* collection of ChangeLogEntry's.
*/
protected ChangeLogParser clParser;
/** The connection string from the project */
private String connection;
/**
* The date range.
*/
protected String dateRange;
/**
* The collection of ChangeLogEntry's returned from clParser.
*/
protected Collection entries;
/**
* Stderr stream eater.
*/
protected AsyncStreamReader errorReader;
/**
* The scm process input stream.
*/
protected InputStream in;
/** Log */
private static final Log LOG = LogFactory.getLog(
AbstractChangeLogGenerator.class);
/**
* Initialize the generator from the changelog controller.
*
* @param changeLog The invoking controller (useful for logging)
* @see ChangeLogGenerator#init(ChangeLog)
*/
public void init(ChangeLog changeLog)
{
changeLogExecutor = changeLog;
base = changeLogExecutor.getBasedir();
// This lets the user 'not' set a limit on the log command. We
// need this cuz Subversion doesn't currently support date
// commands on web-based repositories, so it would be nice to
// let the user still use the changelog plugin.
if (changeLogExecutor.getRange() != null &&
changeLogExecutor.getRange().length() != 0)
{
setDateRange(changeLogExecutor.getRange());
}
setConnection(changeLogExecutor.getRepositoryConnection());
}
/**
* Set the dateRange member based on the number of days obtained
* from the ChangeLog.
*
* @param numDaysString The number of days of log output to
* generate.
*/
protected void setDateRange(String numDaysString)
{
int days = Integer.parseInt(numDaysString);
Date before = new Date(
System.currentTimeMillis() - (long) days * 24 * 60 * 60 * 1000);
Date to = new Date(
System.currentTimeMillis() + (long) 1 * 24 * 60 * 60 * 1000);
dateRange = getScmDateArgument(before, to);
}
/**
* Execute scm client driving the given parser.
*
* @param parser A {@link ChangeLogParser parser} to process the scm
* output.
* @return A collection of {@link ChangeLogEntry entries} parsed from
* the scm output.
* @throws IOException When there are issues executing scm.
* @see ChangeLogGenerator#getEntries(ChangeLogParser)
*/
public Collection getEntries(ChangeLogParser parser) throws IOException
{
if (parser == null)
{
throw new NullPointerException("parser cannot be null");
}
if (base == null)
{
throw new NullPointerException("basedir must be set");
}
if (!base.exists())
{
throw new FileNotFoundException(
"Cannot find base dir " + base.getAbsolutePath());
}
clParser = parser;
try
{
Execute exe = new Execute(this);
exe.setCommandline(getScmLogCommand().getCommandline());
exe.setWorkingDirectory(base);
exe.execute();
// log messages from stderr
String errors = errorReader.toString().trim();
if (errors.length() > 0)
{
LOG.error(errors);
}
}
catch (IOException ioe)
{
handleParserException(ioe);
}
return entries;
}
/**
* Handle ChangeLogParser IOExceptions. The default implementation
* just throws the exception again.
*
* @param ioe The IOException thrown.
* @throws IOException If the handler doesn't wish to handle the
* exception (the default behavior).
*/
protected void handleParserException(IOException ioe)
throws IOException
{
throw ioe;
}
/**
* Clean up any generated resources for this run.
*
* @see ChangeLogGenerator#cleanup()
*/
public void cleanup()
{
}
/**
* Constructs the appropriate command line to execute the scm's
* log command. This method must be implemented by subclasses.
*
* @return The command line to be executed.
*/
protected abstract Commandline getScmLogCommand();
/**
* Construct the command-line argument that is passed to the scm
* client to specify the appropriate date range.
*
* @param before The starting point.
* @param to The ending point.
* @return A string that can be used to specify a date to a scm
* system.
*/
protected abstract String getScmDateArgument(Date before, Date to);
/**
* Stop the process - currently unimplemented
*/
public void stop()
{
}
/**
* Set the input stream for the scm process.
* @param os An {@link java.io.OutputStream}
*/
public void setProcessInputStream(OutputStream os)
{
}
/**
* Set the error stream for reading from scm log. This stream will
* be read on a separate thread.
*
* @param is An {@link java.io.InputStream}
*/
public void setProcessErrorStream(InputStream is)
{
errorReader = new AsyncStreamReader(is);
}
/**
* Set the input stream used to read from scm log.
*
* @param is A stream of scm log output to be read from
*/
public void setProcessOutputStream(InputStream is)
{
in = is;
}
/**
* Start read from the scm log.
*
* @throws IOException When there are errors reading from the
* streams previously provided
*/
public void start() throws IOException
{
errorReader.start();
entries = clParser.parse(in);
}
/**
* Returns the connection.
* @return String
*/
public String getConnection()
{
return connection;
}
/**
* Sets the connection.
* @param connection The connection to set
*/
public void setConnection(String connection)
{
this.connection = connection;
}
}

View File

@ -0,0 +1,424 @@
package org.apache.maven.changelog;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
// java imports
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
// commons imports
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
// maven imports
import org.apache.maven.project.Developer;
/**
* Change log task. It uses a ChangeLogGenerator and ChangeLogParser to create
* a Collection of ChangeLogEntry objects, which are used to produce an XML
* output that represents the list of changes.
*
*
* @author <a href="mailto:glenn@somanetworks.com">Glenn McAllister</a>
* @author <a href="mailto:jeff.martin@synamic.co.uk">Jeff Martin</a>
* @author <a href="mailto:jason@zenplex.com">Jason van Zyl</a>
* @author <a href="mailto:dion@multitask.com.au">dIon Gillard</a>
* @author <a href="mailto:bodewig@apache.org">Stefan Bodewig</a>
* @author <a href="mailto:peter@apache.org">Peter Donald</a>
* @version $Id: ChangeLog.java,v 1.1 2003/01/24 03:44:52 jvanzyl Exp $
*/
public class ChangeLog
{
/**
* Used to specify the range of log entries to retrieve.
*/
private String range;
/**
* Input dir. Working directory for running CVS executable
*/
private File base;
/**
* The classname of our ChangeLogFactory, defaulting to Maven's built in
* CVS factory.
*/
private String clFactoryClass =
"org.apache.maven.cvslib.CvsChangeLogFactory";
/** the connection string used to access the SCM */
private String connection;
/** the list of developers on the project */
private List developers;
/** change log entries parsed */
private Collection entries;
/** Log */
private static final Log LOG = LogFactory.getLog(ChangeLog.class);
/**
* Output file for xml document
*/
private File output;
/** output encoding for the xml document */
private String outputEncoding;
/**
* Set the ChangeLogFactory class name. If this isn't set, the factory
* defaults to Maven's build in CVS factory.
*
* @param factoryClassName the fully qualified factory class name
*/
public void setFactory(String factoryClassName)
{
clFactoryClass = factoryClassName;
}
/**
* Set the range of log entries to process; the interpretation of this
* parameter depends on the generator.
*
* @param range the range of log entries.
*/
public void setRange(String range)
{
this.range = range;
}
/**
* Get the range of log entries to process; the interpretation of the range
* depends on the generator implementation.
*
* @return the range of log entries.
*/
public String getRange()
{
return range;
}
/**
* Set the base directory for the change log generator.
* @param base the base directory
*/
public void setBasedir(File base)
{
this.base = base;
}
/**
* Get the base directory for the change log generator.
*
* @return the base directory
*/
public File getBasedir()
{
return base;
}
/**
* Set the output file for the log.
* @param output the output file
*/
public void setOutput(File output)
{
this.output = output;
}
/**
* Return connection string declared in project.xml
* @return connection string
*/
public String getRepositoryConnection()
{
return connection;
}
/**
* Change SCM connection string
* @param aString a string containing the project's repository
* connection
*/
public void setRepositoryConnection(String aString)
{
connection = aString;
}
/**
* Execute task.
* @throws FileNotFoundException if {@link ChangeLog#base} doesn't exist
* @throws IOException if there are problems running CVS
* @throws UnsupportedEncodingException if the underlying platform doesn't
* support ISO-8859-1 encoding
*/
public void doExecute() throws FileNotFoundException, IOException,
UnsupportedEncodingException
{
if (output == null)
{
throw new NullPointerException("output must be set");
}
generateEntries();
replaceAuthorIdWithName();
createDocument();
}
/**
* Create the change log entries.
* @throws IOException if there is a problem creating the change log
* entries.
*/
private void generateEntries() throws IOException
{
ChangeLogFactory factory = createFactory();
ChangeLogGenerator generator = factory.createGenerator();
ChangeLogParser parser = factory.createParser();
generator.init(this);
parser.init(this);
try
{
setEntries(generator.getEntries(parser));
if (LOG.isInfoEnabled()) {
LOG.info("ChangeLog found: " + getEntries().size()
+ " entries");
}
}
finally
{
parser.cleanup();
generator.cleanup();
}
}
/**
* Create a new instance of the ChangeLogFactory specified by the
* <code>clFactory</code> member.
*
* @return the new ChangeLogFactory instance
* @throws IOException if there is a problem creating the instance.
*/
private ChangeLogFactory createFactory() throws IOException
{
try
{
Class clazz = Class.forName(clFactoryClass);
return (ChangeLogFactory) clazz.newInstance();
}
catch (ClassNotFoundException cnfe)
{
throw new IOException("Cannot find class " + clFactoryClass
+ " " + cnfe.toString());
}
catch (IllegalAccessException iae)
{
throw new IOException("Cannot access class " + clFactoryClass
+ " " + iae.toString());
}
catch (InstantiationException ie)
{
throw new IOException("Cannot instantiate class " + clFactoryClass
+ " " + ie.toString());
}
}
/**
* Set up list of developers mapping id to name.
* @task This should be a facility on the maven project itself
* @return a list of developers ids and names
*/
private Properties getUserList()
{
Properties userList = new Properties();
Developer developer = null;
for (Iterator i = getDevelopers().iterator(); i.hasNext();)
{
developer = (Developer) i.next();
userList.put(developer.getId(), developer.getName());
}
return userList;
}
/**
* replace all known author's id's with their maven specified names
*/
private void replaceAuthorIdWithName()
{
Properties userList = getUserList();
ChangeLogEntry entry = null;
for (Iterator i = getEntries().iterator(); i.hasNext();)
{
entry = (ChangeLogEntry) i.next();
if (userList.containsKey(entry.getAuthor()))
{
entry.setAuthor(userList.getProperty(entry.getAuthor()));
}
}
}
/**
* Create the XML document from the currently available details
* @throws FileNotFoundException when the output file previously provided
* does not exist
* @throws UnsupportedEncodingException when the platform doesn't support
* ISO-8859-1 encoding
*/
private void createDocument() throws FileNotFoundException,
UnsupportedEncodingException
{
PrintWriter out = new PrintWriter(new OutputStreamWriter(
new FileOutputStream(output), getOutputEncoding()));
out.println(toXML());
out.flush();
out.close();
}
/**
* @return an XML document representing this change log and it's entries
*/
private String toXML()
{
StringBuffer buffer = new StringBuffer();
buffer.append("<?xml version=\"1.0\" encoding=\"")
.append(getOutputEncoding())
.append("\" ?>\n")
.append("<changelog>\n");
for (Iterator i = getEntries().iterator(); i.hasNext();)
{
buffer.append(((ChangeLogEntry) i.next()).toXML());
}
buffer.append("</changelog>\n");
return buffer.toString();
}
/**
* Getter for property entries.
* @return Value of property entries.
*/
public Collection getEntries()
{
if (entries == null)
{
entries = Arrays.asList(new Object[0]);
}
return entries;
}
/**
* Setter for property entries.
* @param entries New value of property entries.
*/
public void setEntries(Collection entries)
{
this.entries = entries;
}
/**
* Returns the developers.
* @return List
*/
public List getDevelopers()
{
return developers;
}
/**
* Sets the developers.
* @param developers The developers to set
*/
public void setDevelopers(List developers)
{
this.developers = developers;
}
/**
* Returns the outputEncoding.
* @return String
*/
public String getOutputEncoding()
{
return outputEncoding;
}
/**
* Sets the outputEncoding.
* @param outputEncoding The outputEncoding to set
*/
public void setOutputEncoding(String outputEncoding)
{
this.outputEncoding = outputEncoding;
}
} // end of ChangeLog

View File

@ -0,0 +1,282 @@
package org.apache.maven.changelog;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Vector;
/**
* Change Log Entry - holds details about revisions to a file.
*
* @task add time of change to the entry
* @task investigate betwixt for toXML method
* @author <a href="mailto:dion@multitask.com.au">dIon Gillard</a>
* @version $Id: ChangeLogEntry.java,v 1.1 2003/01/24 03:44:51 jvanzyl Exp $
*/
public class ChangeLogEntry
{
/**
* Formatter used by the getDateFormatted method.
*/
private static final SimpleDateFormat DATE_FORMAT =
new SimpleDateFormat("yyyy-MM-dd");
/**
* Formatter used by the getTimeFormatted method.
*/
private static final SimpleDateFormat TIME_FORMAT =
new SimpleDateFormat("HH:mm:ss");
/**
* Formatter used to parse CVS date/timestamp.
*/
private static final SimpleDateFormat CVS_TIMESTAMP_FORMAT =
new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
/** Date the changes were committed */
private Date date;
/** User who made changes */
private String author;
/** comment provided at commit time */
private String comment = "";
/** ChangeLogFiles committed on the date, by the author, with comment*/
private Vector files = new Vector();
/**
* Constructor for the Entry object
*
* @param date the date of the change
* @param author who made the change
* @param comment the commit comments for the change
*/
public ChangeLogEntry(String date, String author, String comment)
{
setDate(date);
setAuthor(author);
setComment(comment);
}
/**
* Constructor used when attributes aren't available until later
*/
public ChangeLogEntry()
{
}
/**
* Adds a file to the list for this entry
* @param file a {@link ChangeLogFile}
*/
public void addFile(ChangeLogFile file)
{
files.addElement(file);
}
/**
* Adds a feature to the File attribute of the Entry object.
* @param file the file name committed
* @param revision the revision of the latest change
*/
public void addFile(String file, String revision)
{
files.addElement(new ChangeLogFile(file, revision));
}
/**
* @return a string representation of the entry
*/
public String toString()
{
return author + "\n" + date + "\n" + files + "\n" + comment;
}
/**
* Provide the changelog entry as an XML snippet.
*
* @task make sure comment doesn't contain CDATA tags - MAVEN114
* @return a changelog-entry in xml format
*/
public String toXML()
{
StringBuffer buffer = new StringBuffer();
buffer.append("\t<changelog-entry>\n")
.append("\t\t<date>")
.append(getDateFormatted())
.append("</date>\n")
.append("\t\t<time>")
.append(getTimeFormatted())
.append("</time>\n")
.append("\t\t<author><![CDATA[")
.append(author)
.append("]]></author>\n");
for (Enumeration e = files.elements(); e.hasMoreElements();)
{
ChangeLogFile file = (ChangeLogFile) e.nextElement();
buffer.append("\t\t<file>\n")
.append("\t\t\t<name>")
.append(file.getName())
.append("</name>\n")
.append("\t\t\t<revision>")
.append(file.getRevision())
.append("</revision>\n");
buffer.append("\t\t</file>\n");
}
buffer.append("\t\t<msg><![CDATA[")
.append(comment)
.append("]]></msg>\n");
buffer.append("\t</changelog-entry>\n");
return buffer.toString();
}
/**
* Getter for property author.
* @return Value of property author.
*/
public String getAuthor()
{
return author;
}
/**
* Setter for property author.
* @param author New value of property author.
*/
public void setAuthor(String author)
{
this.author = author;
}
/**
* Getter for property comment.
* @return Value of property comment.
*/
public String getComment()
{
return comment;
}
/**
* Setter for property comment.
* @param comment New value of property comment.
*/
public void setComment(String comment)
{
this.comment = comment;
}
/**
* Getter for property date.
* @return Value of property date.
*/
public Date getDate()
{
return (Date) date.clone();
}
/**
* Setter for property date.
* @param date New value of property date.
*/
public void setDate(Date date)
{
this.date = new Date(date.getTime());
}
/**
* Setter for property date that takes a string and parses it
* @param date - a string in yyyy/MM/dd HH:mm:ss format
*/
public void setDate(String date)
{
try
{
this.date = CVS_TIMESTAMP_FORMAT.parse(date);
}
catch (ParseException e)
{
throw new IllegalArgumentException("I don't understand this date: "
+ date);
}
}
/**
* @return date in yyyy-mm-dd format
*/
public String getDateFormatted()
{
return DATE_FORMAT.format(getDate());
}
/**
* @return time in HH:mm:ss format
*/
public String getTimeFormatted()
{
return TIME_FORMAT.format(getDate());
}
}

View File

@ -0,0 +1,83 @@
package org.apache.maven.changelog;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
/**
* An AbstractFactory interface for creating the required ChangeLogGenerator
* and ChangeLogParser pairs.
*
* @author Glenn McAllister
* @version $Id: ChangeLogFactory.java,v 1.1 2003/01/24 03:44:51 jvanzyl Exp $
*/
public interface ChangeLogFactory
{
/**
* Create the ChangeLogGenerator that extracts data from an SCM to be
* parsed by an associated ChangeLogParser.
*
* @return The ChangeLogGenerator for a particular SCM.
*/
ChangeLogGenerator createGenerator();
/**
* Create the ChangeLogParser that consumes the output from the
* ChangeLogGenerator to produce the set of ChangeLogEntry objects.
*
* @return The ChangeLogParser for a particular SCM.
*/
ChangeLogParser createParser();
}

Some files were not shown because too many files have changed in this diff Show More