| <!-- |
| 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="tags/jspwiki_2_8_4" /> |
| |
| <!-- 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} "${install.src}""/> |
| </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="<!-- REMOVE ME TO ENABLE JDBC DATABASE" value="" /> |
| <replace file="${webtests.build}/web.xml.custom" |
| token="REMOVE ME TO ENABLE JDBC DATABASE -->" 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="<!-- REMOVE ME TO ENABLE CONTAINER-MANAGED AUTH" value="" /> |
| <replace file="${webtests.build}/web.xml.container" |
| token="REMOVE ME TO ENABLE CONTAINER-MANAGED AUTH -->" 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="<!--" endtoken="-->"> |
| <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='<!DOCTYPE differences SYSTEM "http://depfind.sourceforge.net/dtd/differences.dtd">' |
| value=""/> |
| <!-- Just to be safe, replace raw ampersands with something bogus --> |
| <replace file="${tests.reports}/API-changes.xml" |
| token="&" value="(ampersand)"/> |
| <xslt in="${tests.reports}/API-changes.xml" |
| out="${tests.reports}/API-changes.html" |
| style="${dependencyfinder.dir}/etc/DiffToHTML.xsl"> |
| </xslt> |
| </target> |
| |
| </project> |