blob: ebf50ba2de6a3eaa7c1235322b672a062baf1b66 [file] [log] [blame]
<!--
JSPWiki - a JSP-based WikiWiki clone.
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<!--
This is the Ant build file for the JSPWiki project.
The verbosity in this file is intentional - it is also
an example for those who don't know Ant yet that well
and would like to learn it.
The build file assumes the following directory structure:
JSPWiki
|___build.xml
|
|___etc
| |___[jspwiki.properties and web.xml]
|
|___src
| |___webdocs
| | |___[all .jsp files]
| |
| |___com
| |___[...and the rest of the source code files]
|
|___docs
|
|___lib
|
|___tests
|___com
|___[...and the rest of the test source code]
$Id: build.xml,v 1.97 2007-12-22 22:00:31 jalkanen Exp $
-->
<!--
First, we define the project. We assign it a name,
and the default action if no action is specified on the
command line. Also, all relative directory references
in the rest of the project file should be calculated from
the current directory.
-->
<project name="JSPWiki" default="compile" basedir=".">
<!-- This tells us which build.properties file lies. By default, we
use the SVN version (which is tuned to my environment), but you
will probably want to override this from the command line. -->
<property name="build.properties" value="build.properties" />
<property file="${build.properties}" />
<property name="debug" value="true" />
<property name="deprecation" value="false" />
<property name="optimize" value="false" />
<!-- This denotes the directory where the source code lies. -->
<property name="code.src" value="src" />
<!-- The class files are actually put in this directory. It is
a good habit to keep .class -files separate from the .java -files. -->
<property name="code.build" value ="build" />
<!-- The internationalization strings for the core JSPWiki classes -->
<property name="code.i18n" value="etc/i18n" />
<!-- The i18n location in which 18n templates are created -->
<property name="tmplt.i18n.dir" value="i18n_templates" />
<!-- The location for the JAR file for the core JSPWiki classes -->
<property name="jarfile" value="${code.build}/${ant.project.name}.jar" />
<!-- The location of the JAR file for the test classes -->
<property name="testjarfile" location="${code.build}/${ant.project.name}-test.jar" />
<!-- The location for the keystore used to sign the JAR; will be created if it doesn't exist. -->
<property name="jks.keystore" value="${basedir}/etc/jspwiki.jks" />
<!-- Define a temporary directory, based on the system temporary directory,
the user name, and the project name (defined above) -->
<property name="tmpdir" value="${basedir}/build/tmp" />
<!-- The following three properties define the location of the
test sources, the location of the test .class files and the
directory where the test results are written in. -->
<property name="tests.src" value="tests" />
<property name="tests.build" value="tests/build" />
<property name="tests.reports" value="tests/reports" />
<!-- Web unit test properties -->
<property name="webtests.browser" value="*firefox" />
<property name="webtests.reports" value="${basedir}/tests/reports/selenium" />
<property name="webtests.build" value="tests/build/webtests" />
<property name="webtests.port" value="10024" />
<property name="webtests.shutdown" value="19041" />
<property name="webtests.temp" value="${java.io.tmpdir}/webtests" />
<property name="selenium-rc.jar" value="tests/lib/selenium-server-1.0-beta1.jar" />
<!-- The place where the javadocs are created -->
<property name="docs.javadoc" value="doc/javadoc" />
<!-- The temporary installation directory where all war-files
are collected, for example -->
<property name="install.fulldir" value="${tmpdir}/install" />
<!-- The directory where the SVN sources are checked out. -->
<property name="install.src" value="${tmpdir}/svnsrc" />
<!-- Define the SVN properties. These are used when building the
source distribution. Normally, you shouldn't have to care about these.
-->
<property name="svn.repository" value="http://svn.apache.org/repos/asf/incubator/jspwiki" />
<property name="svn.tag" value="branches/JSPWIKI_2_8_BRANCH" />
<!-- And finally, the directory where the final .zip-file is put -->
<property name="release.dir" value="releases" />
<!-- PATH DEFINITIONS -->
<!-- The base path for compilation. We include, of course, the
already built files in the build-directory, and then we
add all the jar files in the "lib" -directory. -->
<path id="path.base">
<pathelement path="${code.build}" />
<fileset dir="lib">
<include name="*.jar" />
</fileset>
</path>
<!-- The path used for running tests. We add the tests/etc directory
to the base path defined above, since we put all the relevant
.properties-files in tests/etc. -->
<path id="path.tests">
<pathelement location="${jarfile}" />
<pathelement location="${testjarfile}" />
<pathelement location="${java.home}/../lib/tools.jar" />
<fileset dir="lib">
<include name="*.jar" />
</fileset>
<fileset dir="tests/lib">
<include name="*.jar" />
</fileset>
<pathelement path="${tests.src}/etc" />
</path>
<!-- The prefix to use when reading environment variables -->
<property environment="env" />
<!-- ============================================================== -->
<!-- Initialising, cleaning, etc. -->
<target name="init"
description="Initializes everything, creates directories, etc."
depends="mkpropertyfile">
<mkdir dir="${code.build}" />
<mkdir dir="${tests.build}" />
<mkdir dir="${tests.reports}" />
<mkdir dir="${@tests.pagedir@}" />
</target>
<target name="mkpropertyfile"
description="Builds the correct propertyfile from the build.properties">
<copy file="etc/jspwiki.properties.tmpl" tofile="etc/jspwiki.properties" />
<copy file="tests/etc/jspwiki.properties.tmpl" tofile="tests/etc/jspwiki.properties" />
<copy file="tests/etc/jspwiki_rcs.properties.tmpl" tofile="tests/etc/jspwiki_rcs.properties" />
<copy file="tests/etc/jspwiki_vers.properties.tmpl" tofile="tests/etc/jspwiki_vers.properties" />
<replace file="etc/jspwiki.properties"
replacefilterfile="${build.properties}" />
<replace file="tests/etc/jspwiki.properties"
replacefilterfile="${build.properties}" />
<replace file="tests/etc/jspwiki_rcs.properties"
replacefilterfile="${build.properties}" />
<replace file="tests/etc/jspwiki_vers.properties"
replacefilterfile="${build.properties}" />
</target>
<!-- Removes the build directory and the tests build directory -->
<target name="clean"
description="Cleans away all generated files.">
<delete dir="${tests.build}" />
<delete dir="${code.build}" />
<delete dir="${tests.reports}" />
<delete file="etc/jspwiki.properties" />
<delete file="tests/etc/jspwiki.properties" />
<delete file="tests/etc/jspwiki_rcs.properties" />
<delete file="tests/etc/jspwiki_vers.properties" />
<delete>
<fileset dir="." includes="**/*~" defaultexcludes="no"/>
<fileset dir="." includes="**/#*#" defaultexcludes="no"/>
</delete>
</target>
<!-- ============================================================== -->
<!-- Compilation targets -->
<!-- In English this means that the "init" -target must be executed
first. After this, the java compiler is invoked with options
that compile every .java file in ${code.src} into .class files
in directory ${code.build}. The is no debugging information
and the compiler is instructed to optimize the resulting code.
For the classpath we use the previously defined path called
"path.base" -->
<target name="compile" depends="init"
description="Builds the source code.">
<javac srcdir="${code.src}"
destdir="${code.build}"
debug="${debug}"
optimize="${optimize}"
deprecation="${deprecation}"
source="1.5"
target="1.5"
>
<classpath refid="path.base" />
<classpath refid="path.tests" />
</javac>
</target>
<!-- This is similar to above. We use this to compile the
tests. -->
<target name="compiletests" depends="init,compile"
description="Builds the test code.">
<javac srcdir="${tests.src}"
destdir="${tests.build}"
debug="true"
deprecation="${deprecation}"
source="1.5"
target="1.5"
>
<classpath refid="path.base" />
<classpath refid="path.tests" />
</javac>
</target>
<!-- Creates javadocs -->
<target name="javadoc"
description="Compiles the javadocs.">
<delete dir="${docs.javadoc}" quiet="true"/>
<mkdir dir="${docs.javadoc}" />
<javadoc destdir="${docs.javadoc}"
use="yes"
breakiterator="true"
windowtitle="${ant.project.name}">
<packageset dir="${code.src}">
<include name="com/ecyrd/**" />
</packageset>
<link href="http://java.sun.com/j2se/1.5.0/docs/api/"/>
<link href="http://java.sun.com/products/javamail/javadocs/"/>
<link href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/"/>
<link href="http://www.jdom.org/docs/apidocs/"/>
<classpath refid="path.base" />
<classpath refid="path.tests" />
</javadoc>
</target>
<!-- ============================================================== -->
<!-- Installation targets -->
<!-- This target makes sure all the necessary directories exist
for building the installation package. -->
<target name="installinit">
<mkdir dir="${install.fulldir}" />
<delete dir="${install.src}" />
<mkdir dir="${install.src}" />
<delete dir="${release.dir}" />
<mkdir dir="${release.dir}" />
</target>
<!-- Builds the jar of all compiled class files -->
<target name="jar" depends="compile">
<!-- This is unfortunately needed, since the default property files are not otherwise
used. FIXME: Figure out a better way to do this in the future. -->
<copy file="${code.i18n}/CoreResources.properties" tofile="${code.i18n}/CoreResources_en.properties"/>
<copy file="${code.i18n}/templates/default.properties" tofile="${code.i18n}/templates/default_en.properties"/>
<copy file="${code.i18n}/plugin/PluginResources.properties" tofile="${code.i18n}/plugin/PluginResources_en.properties"/>
<jar jarfile="${jarfile}">
<fileset dir="${code.build}" includes="**/*.class" />
<fileset dir="${code.src}" includes="com/**/*.properties" />
<fileset dir="${code.src}" includes="templates/**/*.properties" />
<fileset dir="${code.i18n}" />
<fileset dir="etc" includes="ini/*.xml ini/*.properties" />
</jar>
</target>
<target name="jartests" depends="compiletests">
<jar jarfile="${testjarfile}" update="false">
<fileset dir="${tests.build}">
<include name="**/*.class"/>
</fileset>
<fileset dir="${tests.src}">
<include name="com/**/*.properties"/>
</fileset>
</jar>
</target>
<!-- Signs the JSPWiki JAR file with a self-issued digital certificate.
This should only be needed when your JVM starts with a global security
policy. By this we mean a standard J2SE policy that is set at JVM startup
using the -Djava.security.policy=/some/policy/file VM argument. If this
global policy file contains references to JSPWiki permission classes
(PagePermission, GroupPermission, etc) **and** you set it before JSPWiki
is loaded, **then** you must do four things:
0) run this target (signjar)
1) through 3) see below
-->
<target name="signjar" depends="jar,sign-init" description="Signs jar: for use with global JVM security policies">
<sign-jar jar="${jarfile}" />
<echo>
Congratulations -- you just signed your JAR file. We assume
you did this because you want to create a global security
policy for your entire JVM. That's fine, but please make
sure you configure your JVM (and container) correctly.
Normally, this means you should:
1) Copy ${jarfile} to a place where its classes will be
read at startup. (Example: for Tomcat, this is
$CATALINA_HOME/common/lib)
2) Copy the keystore from ${jks.keystore} to the same
location as your global policy. (Example: Tomcat's
policy is in $CATALINA_HOME/conf/catalina.policy,
so you would copy it to $CATALINA_HOME/conf.)
3) Add a reference to the keystore as the *first* line of
the global policy. It should read
keystore "jspwiki.jks";
... or something similar.
If you have no idea what this is all about, we assume
that you ran this target just for fun. In that case, we
hope you enjoyed the experience.</echo>
</target>
<!-- Builds a Web Archive - basically a JAR file which
also contains all of the JSP pages and can be deployed
as-is.
The archive gets put in the ${install.fulldir}. The
reason for this is that this is just a temporary
step when building the entire distribution archive.
We include the following things:
1) All .jar -files in the lib-directory (except servlet-api.jar
and jsp-api.jar, since these are provided by the servlet
container anyway.
2) All .class-files from the build-directory
3) Everything from the src/webdocs -directory
4) Everything from the etc-directory go to the WEB-INF -directory
of the WAR-file.
-->
<target name="war" depends="installinit,jar,compressedjs"
description="Builds the WAR file for installation.">
<property name="warfile" value="build/${ant.project.name}.war" />
<delete file="${warfile}" />
<war warfile="${warfile}"
webxml="etc/web.xml">
<lib dir="lib" includes="*.jar" excludes="servlet-api.jar jsp-api.jar"/>
<lib file="${jarfile}" />
<lib file="tests/lib/stripes*.jar" />
<fileset dir="${code.src}/webdocs" includes="**" excludes="**/FCK/jsp" />
<webinf dir="etc">
<include name="dtd/**" />
<include name="jsp/**" />
<include name="commons-logging.properties" />
<include name="jspwiki.policy" />
<include name="jspwiki.properties" />
<include name="*.tld" />
<include name="userdatabase.xml" />
<include name="groupdatabase.xml" />
<include name="geronimo-web.xml" />
</webinf>
<classes dir="etc" includes="oscache.properties" />
</war>
<war warfile="${warfile}"
webxml="etc/web.xml" update="true">
<fileset dir="${tmpdir}/compress/webdocs/" includes="**/*.js" />
<fileset dir="${tmpdir}/compress/webdocs/" includes="**/*.css" />
</war>
</target>
<!-- Defines a compression macro for the JS/CSS bits we want to transform
into something that saves a bit of space. -->
<macrodef name="compressjs">
<attribute name="src"/>
<attribute name="args" default=""/>
<sequential>
<java jar="tests/lib/yuicompressor-2.4.2.jar"
output="${tmpdir}/compress/@{src}"
fork="true">
<arg line="'${code.src}/@{src}' @{args}" />
</java>
</sequential>
</macrodef>
<!-- We compress the Javascript using yahoo's yui compressor,
which compresses both javascript and css files.
If you don't want to use the compressed stuff, just copy the default
.js files from the distro on top of the compressed ones from the WAR.
-->
<target name="compressedjs">
<mkdir dir="${tmpdir}/compress/webdocs/scripts"/>
<compressjs src="webdocs/scripts/jspwiki-common.js"/>
<compressjs src="webdocs/scripts/jspwiki-edit.js"/>
<compressjs src="webdocs/scripts/jspwiki-prefs.js"/>
<compressjs src="webdocs/scripts/jspwiki-commonstyles.js"/>
<compressjs src="webdocs/scripts/prettify.js"/>
<mkdir dir="${tmpdir}/compress/webdocs/templates/default"/>
<compressjs src="webdocs/templates/default/jspwiki.css"
args="--line-break 0" />
<compressjs src="webdocs/templates/default/jspwiki_print.css"
args="--line-break 0" />
<mkdir dir="${tmpdir}/compress/webdocs/templates/default/skins/OrderedList"/>
<compressjs src="webdocs/templates/default/skins/OrderedList/skin.css"
args="--line-break 0" />
<mkdir dir="${tmpdir}/compress/webdocs/templates/default/skins/PlainVanilla"/>
<compressjs src="webdocs/templates/default/skins/PlainVanilla/skin.css"
args="--line-break 0" />
<mkdir dir="${tmpdir}/compress/webdocs/templates/default/skins/PlainVanilla 1024x768"/>
<compressjs src="webdocs/templates/default/skins/PlainVanilla 1024x768/skin.css"
args="--line-break 0" />
<mkdir dir="${tmpdir}/compress/webdocs/templates/default/skins/Smart"/>
<compressjs src="webdocs/templates/default/skins/Smart/skin.css"
args="--line-break 0" />
</target>
<target name="opened-war" depends="war"
description="Creates an opened JSPWiki war hierarchy into the build dir.">
<mkdir dir="${code.build}/${ant.project.name}" />
<unzip src="${warfile}"
dest="${code.build}/${ant.project.name}" />
</target>
<!--
Here goes some nice Ant magic... We build the source
code archive by directly exporting all code from the SVN
repository, and then zipping it to the temporary installation
directory.
NB: You must have the svn command line client available in
your path before you attempt to run this task.
-->
<target name="srczip" depends="installinit"
description="Builds source zip.">
<delete dir="${install.src}" />
<exec executable="svn">
<arg line="export ${svn.repository}/${svn.tag} &quot;${install.src}&quot;"/>
</exec>
<zip zipfile="${release.dir}/${ant.project.name}-src.zip">
<zipfileset dir="${install.src}" />
</zip>
</target>
<!-- Creates a zip of all the core pages. The file which determines
whether a page is a core page or not is found in src/wikipages/.corepages -->
<target name="corepageszip" depends="installinit">
<zip zipfile="${install.fulldir}/${ant.project.name}-corepages_en.zip"
basedir="src/wikipages/en" includesfile="src/wikipages/.corepages">
</zip>
<zip zipfile="${install.fulldir}/${ant.project.name}-corepages_fi.zip"
basedir="src/wikipages/fi" includesfile="src/wikipages/.corepages">
</zip>
<zip zipfile="${install.fulldir}/${ant.project.name}-corepages_de.zip"
basedir="src/wikipages/de">
</zip>
<zip zipfile="${install.fulldir}/${ant.project.name}-corepages_zh_CN.zip"
basedir="src/wikipages/zh_CN">
</zip>
<zip zipfile="${install.fulldir}/${ant.project.name}-corepages_es.zip"
basedir="src/wikipages/es" includesfile="src/wikipages/.corepages">
</zip>
<zip zipfile="${install.fulldir}/${ant.project.name}-corepages_nl.zip"
basedir="src/wikipages/nl">
</zip>
<zip zipfile="${install.fulldir}/${ant.project.name}-corepages_fr.zip"
basedir="src/wikipages/fr">
</zip>
<zip zipfile="${install.fulldir}/${ant.project.name}-corepages_it.zip"
basedir="src/wikipages/it">
</zip>
<zip zipfile="${install.fulldir}/${ant.project.name}-corepages_pt_BR.zip"
basedir="src/wikipages/pt_BR">
</zip>
<!-- Add other languages here -->
</target>
<!-- Creates a full ZIP file of all document files, ignoring any resources
which start with a dot. -->
<target name="documentzip" depends="installinit,javadoc"
description="Creates JSPWiki documentation zipfile">
<zip zipfile="${install.fulldir}/${ant.project.name}-doc.zip">
<zipfileset dir="doc" prefix="doc" />
<zipfileset dir="src/wikipages" prefix="doc/wikipages" excludes="**/.??*"/>
</zip>
</target>
<!-- Builds the entire distribution set.
We build both the WAR-file and the source zip, then
copy in some useful files and zip the whole thing
into the release directory.
-->
<target name="dist" depends="installinit,srczip,war,corepageszip,documentzip"
description="Builds the entire distribution archive.">
<copy file="README" todir="${install.fulldir}" />
<copy file="ChangeLog" todir="${install.fulldir}" />
<copy file="ReleaseNotes" todir="${install.fulldir}" />
<copy file="LICENSE" todir="${install.fulldir}" />
<copy file="${warfile}" todir="${install.fulldir}" />
<zip zipfile="${release.dir}/${ant.project.name}-bin.zip">
<zipfileset dir="${install.fulldir}" prefix="${ant.project.name}" />
</zip>
</target>
<!-- ============================================================== -->
<!-- Running tests -->
<target name="tests-init" depends="mkpropertyfile">
<!-- Build up the /etc directory for testing -->
<delete file="tests/etc/userdatabase.xml" />
<delete file="tests/etc/userdatabase.xml.old" />
<copy file="tests/etc/userdatabase.xml.tmpl" toFile="tests/etc/userdatabase.xml"/>
<delete file="tests/etc/groupdatabase.xml" />
<delete file="tests/etc/groupdatabase.xml.old" />
<copy file="tests/etc/groupdatabase.xml.tmpl" toFile="tests/etc/groupdatabase.xml"/>
<mkdir dir="tests/etc/WEB-INF" />
<!-- Create web.xml files for testing -->
<copy file="${basedir}/etc/web.xml" tofile="${webtests.build}/web.xml.custom" overwrite="true" />
<!-- For web unit tests, turn off SSL (self-signed certs b0rk
the tests) and enable JDBC refs -->
<replace file="${webtests.build}/web.xml.custom"
token="CONFIDENTIAL" value="NONE" />
<replace file="${webtests.build}/web.xml.custom"
token="&lt;!-- REMOVE ME TO ENABLE JDBC DATABASE" value="" />
<replace file="${webtests.build}/web.xml.custom"
token="REMOVE ME TO ENABLE JDBC DATABASE --&gt;" value="" />
<!-- For unit testing, turn on container auth -->
<copy file="${webtests.build}/web.xml.custom"
tofile="${webtests.build}/web.xml.container" overwrite="true" />
<replace file="${webtests.build}/web.xml.container"
token="&lt;!-- REMOVE ME TO ENABLE CONTAINER-MANAGED AUTH" value="" />
<replace file="${webtests.build}/web.xml.container"
token="REMOVE ME TO ENABLE CONTAINER-MANAGED AUTH --&gt;" value="" />
<copy file="${webtests.build}/web.xml.container"
tofile="tests/etc/WEB-INF/web.xml" overwrite="true" />
<!-- Copy the DTDs to the test WEB-INF -->
<mkdir dir="tests/etc/WEB-INF/dtd" />
<copy toDir="tests/etc/WEB-INF/dtd">
<fileset dir="${basedir}/etc/dtd/" />
</copy>
</target>
<!-- This target runs the JUnit tests that are available
under tests/. It generates the test result files
into the ${tests.reports} -directory, one file per
each tested class. The tests are generated in
plain text, but you can easily get XML format results
as well, just by setting the formatter, below.
Only tests that end with "*Test.java" are included.
This is because then you can also use a manual
"AllTests.java" in each directory, as per the JUnit
Cookbook.
This runs the tests in text mode. If you want the
pretty GUI you probably want to write a new target.
If this test fails with a "cannot find task 'junit'"
error, put the junit.jar in your CLASSPATH.
More info http://ant.apache.org/faq.html#delegating-classloader
-->
<target name="tests" depends="jar,tests-init,jartests,tests-db-init"
description="Runs the JUnit tests.">
<junit printsummary="yes" haltonfailure="no" fork="yes">
<classpath>
<path refid="path.tests" />
</classpath>
<sysproperty key="jspwiki.tests.auth" value="true" />
<formatter type="plain" />
<formatter type="xml" usefile="yes" />
<batchtest todir="${tests.reports}">
<fileset dir="${tests.src}">
<include name="**/*Test.java" />
<exclude name="**/AllTest*java" />
<include name="**/StressTestSpeed.java" if="tests.stress.enabled"/>
<exclude name="com/ecyrd/jspwiki/web/*.*" />
<exclude name="com/ecyrd/jspwiki/TranslatorReaderTest*" />
</fileset>
</batchtest>
</junit>
<junitreport todir="${tests.src}">
<fileset dir="${tests.reports}">
<include name="**/TEST-*.xml" />
</fileset>
<report format="noframes" todir="${tests.src}" />
</junitreport>
</target>
<target name="tests-auth" depends="jar,tests-init,jartests"
description="Runs the AuthorizationManager tests, with JDPA">
<junit printsummary="yes" haltonfailure="no" fork="yes">
<classpath>
<path refid="path.tests" />
</classpath>
<sysproperty key="jspwiki.tests.auth" value="true" />
<jvmarg value="-Xdebug" />
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y" />
<formatter type="plain" />
<formatter type="xml" usefile="yes" />
<batchtest todir="${tests.reports}">
<fileset dir="${tests.src}">
<include name="**/AuthorizationManagerTest.java" />
</fileset>
</batchtest>
</junit>
<junitreport todir="${tests.src}">
<fileset dir="${tests.reports}">
<include name="**/TEST-*.xml" />
</fileset>
<report format="noframes" todir="${tests.src}" />
</junitreport>
</target>
<target name="guitests" depends="jar,tests-init,jartests,tests-db-init"
description="Runs the tests in a pretty window.">
<java classname="junit.swingui.TestRunner" fork="yes" maxmemory="512m">
<classpath>
<path refid="path.tests" />
</classpath>
<sysproperty key="jspwiki.tests.auth" value="true" />
<arg value="com.ecyrd.jspwiki.AllTests" />
</java>
</target>
<!-- This target runs web unit tests using Selenium. These tests run
using an enbedded Jetty server running on a hard-coded high port.
The webapps deployed to Jetty contain 2 sample users:
- 'janne' with password 'myP@5sw0rd' and role of 'Authenticated'
- 'admin' with password 'myP@5sw0rd' and roles of 'Authenticated', 'Admin'
These are the same as the test users in tests/com.ecyrd.jspwiki.auth.Users.
-->
<target name="webtests" depends="jar,tests-init,jartests,tests-db-init,war">
<mkdir dir="${webtests.temp}" />
<mkdir dir="${webtests.build}" />
<!-- Create the master jspwiki.properties template for all webtests -->
<copy file="tests/etc/jspwiki.properties"
toFile="${webtests.build}/jspwiki.properties.tmpl" flatten="true" />
<propertyfile file="${webtests.build}/jspwiki.properties.tmpl">
<entry key="jspwiki.authorizer" value="com.ecyrd.jspwiki.auth.authorize.WebContainerAuthorizer" />
<entry key="jspwiki.userdatabase" value="com.ecyrd.jspwiki.auth.user.XMLUserDatabase" />
<entry key="jspwiki.groupdatabase" value="com.ecyrd.jspwiki.auth.authorize.XMLGroupDatabase" />
<entry key="jspwiki.referenceStyle" value="relative" />
<entry key="jspwiki.userdatabase.hashPrefix" value="false" />
<entry key="log4j.appender.TestContainerLog.File" value="${basedir}/${webtests.build}/testcontainer.log" />
<entry key="jspwiki-x.securityconfig.enable" value="true" />
<entry key="jspwiki.login.throttling" value="false" />
</propertyfile>
<!-- Build the custom auth WAR -->
<webtest-setup context="test-custom"
webxml="${webtests.build}/web.xml.custom"/>
<!-- Build the custom auth WAR (absolute URLs) -->
<webtest-setup context="test-custom-absolute"
webxml="${webtests.build}/web.xml.custom">
<propertyfile-entries>
<entry key="jspwiki.referenceStyle" value="absolute" />
<entry key="jspwiki.baseURL" value="http://localhost:${webtests.port}/test-custom-absolute/" />
</propertyfile-entries>
</webtest-setup>
<!-- Build the container auth WAR -->
<webtest-setup context="test-container"
webxml="${webtests.build}/web.xml.container" />
<!-- Build the custom auth WAR (JDBC database) -->
<webtest-setup context="test-custom-jdbc"
webxml="${webtests.build}/web.xml.custom">
<propertyfile-entries>
<entry key="jspwiki.userdatabase" value="com.ecyrd.jspwiki.auth.user.JDBCUserDatabase" />
<entry key="jspwiki.groupdatabase" value="com.ecyrd.jspwiki.auth.authorize.JDBCGroupDatabase" />
</propertyfile-entries>
</webtest-setup>
<!-- Build the container auth WAR (JDBC database) and test it -->
<webtest-setup context="test-container-jdbc"
webxml="${webtests.build}/web.xml.container">
<propertyfile-entries>
<entry key="jspwiki.userdatabase" value="com.ecyrd.jspwiki.auth.user.JDBCUserDatabase" />
<entry key="jspwiki.groupdatabase" value="com.ecyrd.jspwiki.auth.authorize.JDBCGroupDatabase" />
</propertyfile-entries>
</webtest-setup>
<!-- Run each test in succession -->
<mkdir dir="${webtests.reports}" />
<webtest-exec context="test-custom" />
<webtest-exec context="test-container" />
<webtest-exec context="test-custom-jdbc" />
<webtest-exec context="test-container-jdbc" />
<webtest-exec context="test-custom-absolute" />
<echo>The web unit tests have finished. You can find the test reports in ${webtests.reports}.
If all of the tests ran successfully, the reports will all be "green."</echo>
</target>
<macrodef name="webtest-setup">
<attribute name="context" />
<attribute name="webxml" />
<attribute name="context.dir" default="${webtests.build}/@{context}" />
<attribute name="context.path" default="${basedir}/${webtests.build}/@{context}" />
<element name="propertyfile-entries" implicit="no" optional="true" />
<sequential>
<echo message="===============================================================" />
<echo message=" Setting up web unit tests for '@{context}'" />
<echo message="- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" />
<echo message="" />
<echo message="Creating Selenium test scripts..."/>
<mkdir dir="@{context.dir}/selenium" />
<copy flatten="true" toDir="@{context.dir}/selenium">
<fileset dir="tests/etc/selenium/tests/all" />
<filterset>
<filter token="selenium.context" value="@{context}" />
</filterset>
</copy>
<echo message="Creating test page repositories..."/>
<!-- Create a wiki page directory and point jspwiki.properties to it -->
<mkdir dir="@{context.dir}/wikipages" />
<copy toDir="@{context.dir}/wikipages" flatten="true" >
<fileset dir="src/wikipages/en">
<include name="Main.*" />
<include name="LeftMenu*.*" />
<include name="About.*" />
<include name="RecentChanges.*" />
<include name="WikiEtiquette.*" />
<include name="UnusedPages.*" />
<include name="UndefinedPages.*" />
<include name="PageIndex.*" />
</fileset>
</copy>
<echo message="Creating test webapp..."/>
<mkdir dir="@{context.dir}/webapp/WEB-INF/classes" />
<mkdir dir="@{context.dir}/webapp/WEB-INF/lib" />
<!-- Copy the WEB-INF files -->
<copy toDir="@{context.dir}/webapp/WEB-INF">
<fileset dir="etc">
<include name="dtd/**" />
<include name="commons-logging.properties" />
<include name="jspwiki.policy" />
<include name="*.tld" />
</fileset>
<fileset dir="tests/etc" includes="userdatabase.xml groupdatabase.xml" />
</copy>
<copy toFile="@{context.dir}/webapp/WEB-INF/web.xml" file="@{webxml}" flatten="true" />
<!-- Create the jspwiki.properties file -->
<mkdir dir="@{context.dir}/workdir" />
<copy toFile="@{context.dir}/webapp/WEB-INF/jspwiki.properties"
file="${webtests.build}/jspwiki.properties.tmpl" flatten="true" />
<propertyfile file="@{context.dir}/webapp/WEB-INF/jspwiki.properties">
<entry key="jspwiki.baseURL" value="http://localhost:${webtests.port}/@{context}/" />
<entry key="jspwiki.workDir" value="@{context.path}/workdir" />
<entry key="jspwiki.fileSystemProvider.pageDir" value="@{context.path}/wikipages" />
<entry key="jspwiki.basicAttachmentProvider.storageDir" value="@{context.path}/wikipages" />
<entry key="jspwiki.xmlUserDatabaseFile" value="@{context.path}/webapp/WEB-INF/userdatabase.xml" />
<entry key="jspwiki.xmlGroupDatabaseFile" value="@{context.path}/webapp/WEB-INF/groupdatabase.xml" />
<entry key="log4j.appender.FileLog.File" value="@{context.path}/jspwiki.log" />
<propertyfile-entries/>
</propertyfile>
<!-- Copy the classes -->
<copy toDir="@{context.dir}/webapp/WEB-INF/classes">
<fileset dir="etc" includes="oscache.properties" />
</copy>
<!-- Copy the libraries -->
<copy toDir="@{context.dir}/webapp/WEB-INF/lib">
<fileset dir="lib" includes="*.jar" excludes="servlet-api.jar jsp-api.jar"/>
<fileset file="${jarfile}"/>
<fileset file="${jdbc.driver.jar}"/>
</copy>
<!-- Copy the JSPs -->
<copy toDir="@{context.dir}/webapp">
<fileset dir="${code.src}/webdocs" includes="**" />
</copy>
</sequential>
</macrodef>
<!-- ============================================================== -->
<!-- Selenium execution test task -->
<!-- This macro executes the Selenium test plans located in
tests/build/selenium/@context@/, based on templates stored
in tests/etc/selenium/tests. It expects your favorite servlet
container up & running on ${tomcat.protocol}://${tomcat.host}:${tomcat.port}
For this reason, these properties must be set up in your
build.properties file.
-->
<macrodef name="webtest-exec">
<attribute name="context"/>
<sequential>
<!-- If already running, shut down the embedded Jetty server by pinging the shutdown port -->
<echo message="Shutting down Jetty (if it is up)."/>
<get src="http://localhost:${webtests.shutdown}/" dest="${webtests.temp}/shutdown.log"
ignoreerrors="true" verbose="true" />
<sleep seconds="2"/>
<!-- Start Jetty with our test context -->
<echo message="Starting Jetty."/>
<java classname="com.ecyrd.jspwiki.web.TestContainer" fork="true" spawn="true">
<classpath>
<path refid="path.tests" />
</classpath>
<sysproperty key="java.io.tmpdir" value="${webtests.temp}" />
<!--
<jvmarg value="-Xdebug" />
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n" />
-->
<arg line="@{context}=${webtests.build}/@{context}/webapp" />
</java>
<!-- Start Selenium tests -->
<echo message="Running web unit tests for context '@{context}'."/>
<java jar="${selenium-rc.jar}" fork="true"
output="${webtests.build}/@{context}/selenium/selenium.log">
<!--
<arg line="-browserSessionReuse" />
<arg line="-log" />
<arg line="${webtests.reports}/@{context}.selenium.log" />
-->
<arg line="-htmlSuite" />
<arg line='"${webtests.browser}"' />
<arg line='"http://localhost:${webtests.port}"' />
<arg line="${basedir}/${webtests.build}/@{context}/selenium/TestSuite.html" />
<arg line="${webtests.reports}/@{context}.html" />
</java>
</sequential>
</macrodef>
<!-- ============================================================== -->
<!-- Tomcat war pre-compilation -->
<!-- This target builds a WAR file that is specially pre-compiled
for use with Tomcat. By generating and pre-compiling JSPs
ahead of time (instead of having Tomcat do it on-the-fly
at runtime), we provide a slight runtime speed bump. In
addition, in security-conscious environments this means
that we can eliminate the need for the Jasper JSP compiler,
and can run Tomcat using just a JRE instead of a full JDK.
Pre-compilation involves three steps:
1) Generating the .java files that correspond to JSPWiki's JSPs.
The generated classes are actually servlets.
2) Compiling the .java files and creating a jar.file,
which is added to the WAR's WEB-INF/lib directory
3) Injecting servlet mappings into the WEB-INF/web.xml
file so that requests for the JSPs are mapped to the
servlets generated in step 1.
All of these steps are performed automatically by the
target "war-tomcat."
To use Tomcat pre-compilation, you need to specify
where Tomcat lives on your machine. This can be done
two ways:
1. Export the environment variable CATALINA_HOME, or:
2. Set the property "tomcat.home" in build.properties to
Tomcat's installation directory (e.g., /usr/local/tomcat)
NOTE: The Jasper compiler on older versions of Tomcat
(earlier than ~June 2004) is known to have bugs
that prevent the Ant "jasper2" task from running
successfully. So, you should probably try to use
a relatively recent build.
In addition to pre-compiling the servlets, "war-tomcat"
executes a sub-target that generates a tarball containing
all of JSPWiki's static content. This is quite handy for
environments that use Tomcat in conjunction with a front-end
web server such as Apache (via mod_jk/jk2 or mod_proxy).
The target strips out the static content (images, css, etc)
and adds it to a separate tar file that can be unpacked
in one of Apache's content directories.
To generate static content, set the properties
"static.user" and "static.group" in build.properties.
These should be set to the Unix runtime user and group
that should own the static files, for example the
user "apache" and "daemon" group. If the "static.user"
property is not supplied, war-tomcat skips the static
content generation step.
-->
<target name="war-tomcat" depends="build-tomcat-war,staticzip"
description="Builds the WAR file for Tomcat (with pre-compiled JSPs)"/>
<target name="tomcat-init" depends="init">
<!-- Auto-detect whether Tomcat is available -->
<property name="war" value="${code.build}/${ant.project.name}" />
<property name="war.tomcat" value="${ant.project.name}-tomcat.war" />
<property name="tar.static" value="${ant.project.name}-static.tar.gz" />
<check-property prop="env.CATALINA_HOME" />
<property name="tomcat.home" value="${env.CATALINA_HOME}" />
<echo message="Detected Tomcat: ${tomcat.home}" />
<!-- Set classpath for pre-compilation and deployment tasks -->
<path id="tomcat.classpath">
<pathelement location="${java.home}/../lib/tools.jar" />
<fileset dir="${tomcat.home}">
<!-- For Tomcat 5.5 -->
<include name="bin/commons-logging-api.jar" />
<include name="common/lib/*.jar" />
<include name="server/lib/*.jar" />
<!-- For Tomcat 6.0 -->
<include name="bin/tomcat-juli.jar" />
<include name="lib/*.jar" />
</fileset>
</path>
</target>
<!-- Use Jasper to generate Java class files for the JSPs.
Then compile and jar 'em up. Note that Tomcat's
Jasper task creates a web.xml "fragment" containing
the JSP-to-servlet mappings. We need to copy this into
our existing web.xml, which we do using a file
copy with token substitution. -->
<target name="compile-tomcat" depends="tomcat-init,opened-war">
<mkdir dir="${code.build}/jsp-java" />
<mkdir dir="${code.build}/jsp-classes"/>
<taskdef classname="org.apache.jasper.JspC" name="jasper2">
<classpath>
<path refid="tomcat.classpath" />
<path refid="path.base" />
</classpath>
</taskdef>
<jasper2
validateXml="false"
uriroot="${war}"
outputDir="${code.build}/jsp-java"
poolingEnabled="false"
webXmlFragment="${code.build}/web-fragment.xml" />
<javac srcdir="${code.build}/jsp-java" destdir="${code.build}/jsp-classes">
<classpath>
<path refid="tomcat.classpath" />
<path id="war.classpath">
<fileset dir="${war}/WEB-INF/lib">
<include name="*.jar" />
</fileset>
</path>
</classpath>
</javac>
<jar jarfile="${code.build}/jsp.jar">
<fileset dir="${code.build}/jsp-classes" includes="**/*.class" />
</jar>
<echo message="Adding JSP servlet mappings to web.xml" />
<loadfile property="generated-web.xml" srcFile="${code.build}/web-fragment.xml"/>
<copy file="${war}/WEB-INF/web.xml" toFile="${code.build}/web-merged.xml" overwrite="true">
<filterset begintoken="&lt;!--" endtoken="--&gt;">
<filter token=" PLACEHOLDER FOR PRE-COMPILED JSP SERVLETS " value="${generated-web.xml}" />
</filterset>
</copy>
</target>
<!-- Create a new war file with the new JSP jar and amended web.xml -->
<target name="build-tomcat-war" depends="compile-tomcat">
<war warfile="${code.build}/${war.tomcat}" webxml="${code.build}/web-merged.xml" defaultexcludes="true">
<webinf dir="${war}/WEB-INF">
<exclude name="web.xml" />
<exclude name="lib/*" />
</webinf>
<lib dir="${war}/WEB-INF/lib" excludes="servlet-api.jar,j2ee.jar"/>
<lib dir="${code.build}" includes="jsp.jar" />
<fileset dir="${war}">
<exclude name="WEB-INF/**" />
<exclude name="**/*.jsp" />
</fileset>
</war>
</target>
<!-- Create a tarball containing the static content.
User must set at least ${static.user} and preferably ${static.group}.
If not present, the target is skipped.
File permissions are owner and group read (440),
and for directories, owner and group read
and execute (550). -->
<target name="staticzip" depends="build-tomcat-war" if="static.user">
<property name="static.group" value="${static.user}" />
<tar destfile="${code.build}/${tar.static}" longfile="fail" compression="gzip">
<tarfileset dir="${war}" defaultexcludes="yes"
username="${static.user}" group="${static.group}"
mode="440" dirmode="550">
<include name="**/*.css" />
<include name="**/*.gif" />
<include name="**/*.htm" />
<include name="**/*.html" />
<include name="**/*.jpg" />
<include name="**/*.js" />
<include name="**/*.png" />
</tarfileset>
</tar>
</target>
<!-- ============================================================== -->
<!-- Targets for signing JAR files -->
<!-- These targets collectively create a Java keystore for signing,
and automate the jar-signing process.
-->
<target name="sign-init" depends="installinit,jks-init,jks-create,jks-password" />
<target name="jks-init">
<property name="jks.alias" value="jspwiki" />
<available file="${jks.keystore}" property="jks.exists" />
</target>
<target name="jks-create" unless="jks.exists">
<echo>
JSPWiki needs a digital certificate for code signing its JAR files.
Since you don't appear to have one, we need to generate a new certificate.
Once generated, it will be used to sign the JSPWiki.jar file. To create
the certificate, we need to ask you for your name and a few other things.
The certificate file will be generated at: ${jks.keystore}.
You should copy this file to your container's configuration directory,
or wherever your jspwiki.policy file lives.
If something in this process goes wrong, you can simply delete
${jks.keystore} and execute this target again... no harm done.
To automate the JAR signing processs, you can add the property
'jks.password' to your build.properties file.
</echo>
<input message="Your name (example: Simon Bar Sinister):" addproperty="jks.cn" />
<input message="Your organization (example: ecyrd.com):" addproperty="jks.o" />
<input message="Your country (example: US, FI, AU):" addproperty="jks.c" />
<input message="Keystore password (>6 characters):" addproperty="jks.password" />
<exec dir="${basedir}" executable="keytool" failonerror="true">
<arg value="-genkey"/>
<arg value="-keysize"/>
<arg value="1024"/>
<arg value="-alias"/>
<arg value="${jks.alias}"/>
<arg value="-keystore"/>
<arg value="${jks.keystore}"/>
<arg value="-storepass"/>
<arg value="${jks.password}"/>
<arg value="-dname"/>
<arg value="cn=${jks.cn}, ou=JSPWiki Code Signing Division, o=${jks.o}, c=${jks.c}"/>
</exec>
</target>
<target name="jks-password" unless="jks.password">
<input message="Keystore password:" addproperty="jks.password" />
</target>
<macrodef name="sign-jar">
<attribute name="jar"/>
<sequential>
<echo message="Signing code with this certificate: ${jks.keystore}" />
<exec dir="${basedir}" executable="keytool" failonerror="true">
<arg value="-list"/>
<arg value="-v"/>
<arg value="-alias"/>
<arg value="${jks.alias}"/>
<arg value="-keystore"/>
<arg value="${jks.keystore}"/>
<arg value="-storepass"/>
<arg value="${jks.password}"/>
</exec>
<signjar jar="@{jar}" alias="jspwiki" keystore="${jks.keystore}"
storepass="${jks.password}" verbose="false"/>
</sequential>
</macrodef>
<!-- ============================================================== -->
<!-- JDBC Support -->
<!-- Starting with 2.3.33, JSPWiki supports JDBC DataSources for
storing user profiles. The DataSource can be any database that
your web container supports. In practice, most containers supply
a generic datatbase connection pooling package that can be configured
to use any JDBC driver.
RUNNING JDBC UNIT TESTS
=======================
If you don't enable JDBC support, the JDBC-related unit test classes
will compile fine, but will fail when the 'tests' Ant target executes.
Don't worry about that. The JDBC-related test classes, by the way,
are these:
com.ecyrd.jspwiki.auth.user.JDBCUserDatabaseTest
To run JDBC-related unit tests, you need to:
1) Set up an external database
2) Obtain a JDBC driver
3) Tell JSPWiki where to find the driver, and how to
connect to the database, via jdbc.* properties in
your build.properties file.
4) Provide table setup/teardown DDL scripts (executed by
the db-setup and db-teardown targets, below)
Step 1 is the hardest. Luckily for you, JSPWiki has built-in Ant
scripts to automatically start and stop the embedded Hypersonic 100%
Java database. It's small and fast, and is included
in the JSPWiki base distribution. You can, of course, use your own
JDBC-compliant database such as Postgresql.
Step 2: set up your database properties in build.properties, for example:
jdbc.driver.id=hsql
jdbc.driver.jar=tests/lib/hsqldb.jar
jdbc.driver.class=org.hsqldb.jdbcDriver
jdbc.driver.url=jdbc:hsqldb:hsql://localhost/jspwiki
jdbc.admin.id=SA
jdbc.admin.password=
jdbc.user.id=jspwiki
jdbc.user.password=password
The 'jdbc.driver.id' property is important. Its presence tells
the Ant scripts to do JDBC testing. It also points to
he subdirectory in etc/db that contains our setup/teardown
scripts, which *must* contain these files at a minumum:
userdb-setup.ddl
userdb-teardown.ddl
Sample scripts for Hypersonic and Postgresql are supplied.
If you want to use a different database, create a subdirectory in etc/db
(e.g., etc/db/oracle) and create the necessary DDL script files.
Note that the DDL scripts contain token substitution fields where
table and column names mappings can be plugged in. This is so you
can customize how JSPWiki stores its data. For example, the Hypersonic
teardown DDL looks like this:
DROP TABLE @jspwiki.userdatabase.table@ IF EXISTS;
The complete list of customizable table properties are found
in etc/jspwiki.properties.tmpl. If you don't customize them,
JSPWiki will use some sensible defaults. For unit testing purposes,
this script will always use the defaults from 'tests/etc/jspwiki.properties',
then apply any custom properties defined in your build.properties file.
All of this may sound complicated, but it really isn't. If you use Hypersonic,
the JDBC tests should Just Work. And if you specify an external database,
they should work just fine also.
RUNNING JSPWIKI WITH JDBC SUPPORT
=================================
All of the preceding tells you how to test JSPWiki with JDBC support.
Sounds great, but how do you *run* JSPWiki with it? Simple:
1) Configure the Jdbc.* properties in build.properties, as described
above
2) Configure table and column mappings in etc/jspwiki.properties.tmpl
3) Configure your web container to create a JDBC DataSource
(by default, the JNDI name is jdbc/UserDatabase)
4) Put the JDBC driver jar in a place where your web container will
find it, for example CATALINA_HOME/common/lib
5) Build JSPWiki, and start it up!
See the Javadoc for com.ecyrd.jspwiki.auth.user.JDBCUserDatabase
for details and examples.
-->
<target name="tests-db-init" depends="db-properties,hsql-init,db-setup"/>
<target name="db-properties" depends="init" if="jdbc.driver.id">
<!-- Load the JDBC props we need to do table maintenance -->
<check-property prop="jdbc.driver.jar" />
<check-property prop="jdbc.driver.class" />
<check-property prop="jdbc.driver.url" />
<check-property prop="jdbc.admin.id" />
<check-property prop="jdbc.admin.password" />
<!-- Here's a neat trick: import the JDBC runtime props from jspwiki.properties -->
<echo message="Getting JDBC runtime properties." />
<loadproperties srcFile="etc/jspwiki.properties">
<filterchain>
<linecontainsregexp>
<regexp pattern="^[jspwiki.userdatabase|jspwiki.groupdatabase]"/>
</linecontainsregexp>
</filterchain>
</loadproperties>
<check-property prop="jspwiki.userdatabase.datasource" />
<check-property prop="jspwiki.userdatabase.table" />
<check-property prop="jspwiki.userdatabase.email" />
<check-property prop="jspwiki.userdatabase.fullName" />
<check-property prop="jspwiki.userdatabase.loginName" />
<check-property prop="jspwiki.userdatabase.password" />
<check-property prop="jspwiki.userdatabase.wikiName" />
<check-property prop="jspwiki.userdatabase.created" />
<check-property prop="jspwiki.userdatabase.modified" />
<check-property prop="jspwiki.userdatabase.roleTable" />
<check-property prop="jspwiki.userdatabase.role" />
<check-property prop="jspwiki.groupdatabase.datasource" />
<check-property prop="jspwiki.groupdatabase.table" />
<check-property prop="jspwiki.groupdatabase.membertable" />
<check-property prop="jspwiki.groupdatabase.created" />
<check-property prop="jspwiki.groupdatabase.creator" />
<check-property prop="jspwiki.groupdatabase.name" />
<check-property prop="jspwiki.groupdatabase.member" />
<check-property prop="jspwiki.groupdatabase.modified" />
<check-property prop="jspwiki.groupdatabase.modifier" />
<!-- Check for the presence of the database driver & script dir -->
<check-file file="etc/db/${jdbc.driver.id}" prop="db.scripts" />
<check-file file="${jdbc.driver.jar}" prop="jdbc.jar.present" />
<!-- Bulk-copy the table setup/teardown scripts -->
<property name="tests.db.scripts" value="${tests.src}/etc/db/${jdbc.driver.id}" />
<mkdir dir="${tests.db.scripts}" />
<copy toDir="${tests.db.scripts}" overwrite="true">
<fileset dir="${db.scripts}" />
<filterset>
<filtersfile file="tests/etc/jspwiki.properties" />
<filtersfile file="build.properties" />
</filterset>
</copy>
<!-- Check if the customized database scripts exist -->
<check-file file="${tests.db.scripts}/userdb-setup.ddl" prop="userdb.setup" />
<check-file file="${tests.db.scripts}/userdb-teardown.ddl" prop="userdb.teardown" />
<!-- If it's the Hypersonic database, set a special flag -->
<condition property="hsql">
<equals arg1="${jdbc.driver.id}" arg2="hsql" />
</condition>
<!-- Set a flag that says all of our pre-conditions are met! -->
<property name="db.props.exist" value="true" />
<!-- Dump all of the JDBC properties where our test scripts can find them -->
<echoproperties prefix="jdbc." destfile="${tests.src}/etc/db/jdbc.properties" />
</target>
<target name="db-setup" depends="db-properties,hsql-init" if="db.props.exist">
<echo message="Setting up the database tables." />
<exec-sql file="${userdb.setup}" />
</target>
<target name="db-teardown" depends="db-properties,hsql-init" if="db.props.exist">
<echo message="Tearing down the database tables." />
<exec-sql file="${userdb.teardown}" />
</target>
<!-- Some convenience macrodefs -->
<macrodef name="check-property">
<attribute name="prop"/>
<sequential>
<fail unless="@{prop}" message="Property @{prop} is required." />
</sequential>
</macrodef>
<macrodef name="check-file">
<attribute name="file" />
<attribute name="prop" />
<sequential>
<available file="@{file}" property="@{prop}" value="@{file}" />
<fail unless="@{prop}" message="Couldn't find @{file}!" />
</sequential>
</macrodef>
<macrodef name="exec-sql">
<attribute name="file" />
<sequential>
<sql driver="${jdbc.driver.class}"
classpath="${jdbc.driver.jar}" url="${jdbc.driver.url}"
userid="${jdbc.admin.id}" password="${jdbc.admin.password}"
src="@{file}" onerror="continue" autocommit="true" />
</sequential>
</macrodef>
<!-- ============================================================== -->
<!-- Hypersonic embedded database startup/shutdown (for testing JDBC) -->
<!-- Special "init" target for Hypersonic -->
<target name="hsql-init" depends="hsql-check-start,hsql-start" />
<target name="hsql-check-start" depends="db-properties">
<echo message="Checking to see if Hypersonic JDBC server is running already." />
<property file="tests/etc/db/hsql/server.properties" prefix="hsql" />
<fail unless="hsql.server.port">Failed to load Hypersonic JDBC properties from tests/etc/db/hsql/server.properties</fail>
<condition property="hsql.up">
<socket server="localhost" port="${hsql.server.port}" />
</condition>
</target>
<target name="hsql-start" depends="hsql-check-start" unless="hsql.up"
description="Starts the Hypersonic database for testing.">
<echo message="Starting up Hypersonic JDBC server on localhost." />
<delete file="tests/etc/db/hsql/jspwiki.lck"/>
<java fork="yes" spawn="yes" classname="org.hsqldb.Server"
dir="tests/etc/db/hsql">
<classpath>
<pathelement location="${jdbc.driver.jar}" />
</classpath>
</java>
<sleep seconds="5" />
<available file="tests/etc/db/hsql/jspwiki.lck" property="hsql.up"/>
<fail unless="hsql.up">Hypersonic didn't appear to start up properly. You can start it manually from the command line as follows:
cd tests/etc/db/hsql
java -cp ${jdbc.driver.jar} org.hsqldb.Server
</fail>
<echo message="Done." />
</target>
<target name="hsql-stop" depends="hsql-check-start" if="hsql.up"
description="Shuts down the Hypersonic database, if it's up.">
<echo message="Shutting down Hypersonic JDBC server on localhost." />
<sql driver="${jdbc.driver.class}"
classpath="${jdbc.driver.jar}" url="${jdbc.driver.url}"
onerror="continue" autocommit="true"
userid="${jdbc.admin.id}" password="${jdbc.admin.password}">
SHUTDOWN
</sql>
<!-- The lock file should be deleted automatically, but just in case... -->
<delete file="tests/etc/db/hsql/jspwiki.lck" />
<echo message="Done." />
</target>
<!-- ============================================================== -->
<target name="i18n-create-template" description="Creates a given directory structure with all the needed files to make an i18n jar">
<input message="i18n template code to generate (ie: es_ES):" addproperty="i18n.template" />
<mkdir dir="${tmplt.i18n.dir}/${ant.project.name}_${i18n.template}/etc/i18n/templates" />
<mkdir dir="${tmplt.i18n.dir}/${ant.project.name}_${i18n.template}/etc/i18n/plugin" />
<copy file="etc/i18n/CoreResources.properties"
tofile="${tmplt.i18n.dir}/${ant.project.name}_${i18n.template}/etc/i18n/CoreResources_${i18n.template}.properties"
overwrite="true"/>
<copy file="etc/i18n/templates/default.properties"
tofile="${tmplt.i18n.dir}/${ant.project.name}_${i18n.template}/etc/i18n/templates/default_${i18n.template}.properties"
overwrite="true"/>
<copy file="etc/i18n/plugin/PluginResources.properties"
tofile="${tmplt.i18n.dir}/${ant.project.name}_${i18n.template}/etc/i18n/plugin/PluginResources_${i18n.template}.properties"
overwrite="true" />
<echo message="Now you can start translating at ${tmplt.i18n.dir}/${ant.project.name}_${i18n.template}." />
<echo message="When finished, execute i18n-jar-template target to jar it" />
</target>
<target name="i18n-jar-template" description="Jars a given i18n directory structure">
<input message="i18n template code to jar (ie: es_ES):" addproperty="i18n.template" />
<jar jarfile="${code.build}/${ant.project.name}_${i18n.template}.jar">
<fileset dir="${tmplt.i18n.dir}/${ant.project.name}_${i18n.template}" includes="**/*.properties" />
</jar>
<echo message="Created ${code.build}/${ant.project.name}_${i18n.template}.jar. Drop it on your web/WEB-INF/lib folder and that should do the i18n trick" />
<echo message="You can also upload the jar to http://jspwiki.org/wiki/ContributedLocalizations or to any page linked to it to make it available for everyone!" />
</target>
<target name="i18n-clean-templates" description="Deletes all i18n directory structures">
<delete dir="${tmplt.i18n.dir}" />
</target>
<target name="i18n-check" depends="compile,compiletests"
description="Run this target to check whether a translation is up to date.">
<input message="Please give the language you want to check translation for (e.g. fi, es, de)"
addproperty="check.language"/>
<java classname="TranslationsCheck">
<classpath path="${tests.build}"/>
<classpath path="${code.build}"/>
<arg line="${check.language}"/>
</java>
</target>
<target name="api-diff" description="Compares API in JSPWiki.jar with previous version"
depends="jar">
<!-- Assumes that the dependencyfinder.dir property points to the
dir containing the binary distribution of DependencyFinder -->
<check-property prop="dependencyfinder.dir" />
<check-property prop="jarfile.old" />
<mkdir dir="${tests.reports}" />
<java classname="com.jeantessier.dependencyfinder.cli.JarJarDiff"
output="${tests.reports}/API-changes.xml">
<classpath refid="path.tests" />
<classpath>
<pathelement location="${dependencyfinder.dir}/lib/DependencyFinder.jar" />
</classpath>
<arg value="-new" />
<arg value="${jarfile}" />
<arg value="-old" />
<arg value="${jarfile.old}" />
<arg value="-name" />
<arg value="JSPWiki Public API Changes" />
</java>
<!-- Filthy hack that suppresses DTD resolution -->
<replace file="${tests.reports}/API-changes.xml"
token='&lt;!DOCTYPE differences SYSTEM "http://depfind.sourceforge.net/dtd/differences.dtd"&gt;'
value=""/>
<!-- Just to be safe, replace raw ampersands with something bogus -->
<replace file="${tests.reports}/API-changes.xml"
token="&amp;" value="(ampersand)"/>
<xslt in="${tests.reports}/API-changes.xml"
out="${tests.reports}/API-changes.html"
style="${dependencyfinder.dir}/etc/DiffToHTML.xsl">
</xslt>
</target>
</project>