Browse files

- Initial commit

  • Loading branch information...
0 parents commit 5039dfcc26e9aef36454274737b2abfcc85cddbf Pedro Alves committed Dec 10, 2012
8 .gitignore
@@ -0,0 +1,8 @@
+/bin/
+/lib/
+/test-lib/
+build/
+dist/
+nbproject/private/
+.DS_Store
+*~
103 README.md
@@ -0,0 +1,103 @@
+Multiple Authentication Providers in Pentaho
+============================================
+
+Objective
+-------
+
+The goal of this project is to add support for multiple authentication in
+[Pentaho](http://www.pentaho.com). Currently, there are several providers that
+can be used, like LDAP, hibernate and jdbc, but it's not possible to use
+several at the same time.
+
+This project allows for that by implementing a bean that will cycle through all
+the desired providers
+
+
+How to use
+----------
+
+Following this steps should get you going:
+
+### Compile the project
+
+Just run *ant* and you shuold be all set
+
+
+### Deploy the jar in Pentaho
+
+Copy the resulting file to pentaho's lib dir, (eg:
+*/opt/pentaho/server/webapps/pentaho/WEB-INF/lib/*).
+
+
+### Copy the muiltiple provider spring config files to *solution/system*
+
+Copy the following files from *resources/* to *pentaho-solutions/system/*:
+
+* applicationContext-pentaho-security-multiple.xml
+* applicationContext-spring-security-multiple.xml
+
+
+### Change *pentaho-spring-beans.xml* to load the new files
+
+Instead of loading one of the individual files (defaults to hibernate authentication),
+tell pentaho to instead load the new configuration files.
+
+*pentaho-spring-beans.xml* should then look something like:
+
+ <beans>
+ <import resource="pentahosystemconfig.xml" />
+ <import resource="adminplugins.xml" />
+ <import resource="systemlisteners.xml" />
+ <import resource="sessionstartupactions.xml" />
+ <import resource="applicationcontext-spring-security.xml" />
+ <import resource="applicationcontext-common-authorization.xml" />
+ <import resource="applicationcontext-spring-security-multiple.xml" />
+ <import resource="applicationcontext-pentaho-security-multiple.xml" />
+ <import resource="pentahoobjects.spring.xml" />
+ </beans>
+
+
+*Note: This snippet is taken from pentaho 4.8, different versions may have files
+with different content*
+
+
+### Change the list of providers in *applicationContext-spring-security.xml*
+
+In *applicationContext-spring-security.xml*, look for a bean named
+*authenticationManager*, and add the providers you want. If you're using the
+sample file *applicationContext-spring-security-multiple.xml*, the 2 referenced
+beans are called *daoAuthenticationProvider* and *daoAuthenticationProvider2*.
+You're not limited to just 2 providers.
+
+
+### Edit *applicationContext-spring-security-multiple.xml* and
+*applicationContext-pentaho-security-multiple.xml* for your case
+
+This is the part where you configure the types of authentication you want. Even
+if it seems complicated at first, you'll notice that the 2 configuration files
+for multiple authentication are simply a concatenations of the individual files
+provided by pentaho, making sure the bean names don't colide.
+
+On this example case we have hibernate and memory authentication joined together.
+
+
+### Launch the bi-server
+
+Launch the BI server and *hopefully* you're all set.
+
+
+### Troubleshooting
+
+Of course this won't work out of the box. Pay close attention to the logs. One
+of the most common errors is bean id collision, which is reported in the
+pentaho logs.
+
+One other option is setting the *spring* logs to debug in *log4j.xml*
+
+
+### Questions / doubts
+
+For any additional questions, feel free to get in touch: ctools _at_ webdetails.pt
+
+
+
1,963 build-res/subfloor.xml
@@ -0,0 +1,1963 @@
+<!--===========================================================================
+Copyright (c) 2008-2009, Pentaho Engineering Team
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the Pentaho Corporation nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY Pentaho Engineering Team ''AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+============================================================================-->
+<!--===========================================================================
+ == SUBFLOOR ==
+
+ $Rev: 113 $
+ $Date: 2010-09-03 15:02:57 -0400 (Fri, 03 Sep 2010) $
+ Project Home: http://code.google.com/p/subfloor/
+
+ This file contains the default implementation of the ant tasks to
+ perform a build. This file should be included by the build.xml file
+ for your particular project. That build file should redefine any task
+ that is defined in subfloor.xml IF AND ONLY IF the function of the
+ task needs to be customized.
+
+ FORMATTING:
+ ALIGNMENT: indent=2 spaces and wrap lines longer than 120 chars
+ NAMING: targets intended for execution by a user are named single-word
+ or hyphenated. Internal targets use '.' notation.
+
+ TO GET STARTED with your project, you will need this file in
+ your project's root directory along with three additional files:
+ 1. build.xml
+ 2. build.properties
+ 3. ivy_settings.xml
+ 4. ivy.xml
+
+ Below are some templates:
+
+ === build.xml
+ <project name="MyProject" basedir="." default="jar" xmlns:ivy="antlib:org.apache.ivy.ant" >
+ <description>
+ This build file is used to create the MyProject project and works with the subfloor.xml file.
+ </description>
+
+ <import file="subfloor.xml"/>
+ </project>
+
+ === build.properties
+ project.revision=1.0-SNAPSHOT #the version of your project. This will appear in jar META-INF, dist artifact filenames and IVY revision metadata.
+ ivy.artifact.id=my-project #IVY metadata describing the name of the artifact
+ impl.title=My Project #English language version of your project name
+
+============================================================================-->
+
+
+<project name="subfloor" basedir="." default="default" xmlns:ivy="antlib:org.apache.ivy.ant">
+ <description>
+-------------------------------------------------------------------------------
+ subfloor.xml provides tasks needed to perform a project build.
+ It is typically not used directly but imported by each project's build.xml
+ file. The build.xml file can override tasks when customization is required.
+
+MAIN TARGETS
+============
+ * clean / clean-all :
+ remove all artifacts of the build, clean-all adds the removal
+ of any library or jar dependencies downloaded as part of the build
+
+ * resolve :
+ download/refresh library or jar dependencies needed for the build (uses Apache IVY)
+
+ * compile :
+ run javac on the project's source
+
+ * jar :
+ creates a jar file
+
+ * dist :
+ creates all project distributables
+
+ * test :
+ runs JUnit tests from your project's test source
+
+SPECIAL TARGETS
+============
+ * publish-local :
+ builds a jar for your project and registers it with the local artifact repository isolated
+ to your machine at $HOME/.ivy2/local. Further executions of the the resolve target by this
+ or other projects will find your published jar.
+
+ * ivy-clean* :
+ this family of targets helps reset your IVY environment in the event that you are having
+ difficulty resolving dependencies
+
+TYPICAL TARGET SEQUENCE
+============
+ * clean-all resolve dist :
+ a good start to build all project distributables from scratch. Note that jar dependencies
+ will not be downloaded unless you explicitly run the resolve target. We made the resolution
+ and retrieval completely discretionary since there are many situations in which
+ you will not want to get or refresh dependencies, e.g. if you are offline with no Internet
+ access. In such case, you could just run "dist" if the set of jars you already have are
+ sufficient.
+
+ </description>
+
+ <!-- Load the properties files in the proper order -->
+ <property file="override.properties"
+ description="Properties customized for your development environment belong in this file. This file will never be checked into the SCM." />
+ <property file="build.properties"
+ description="Properties customized for your particular project belong in this file." />
+
+ <!-- =================================================================================
+ Property Defaults
+ Any of these properties can be overridden in either build.properties or override.properties
+ =================================================================================-->
+
+ <!-- Project meta properties -->
+ <property name="impl.vendor" value="Pentaho Corporation" description="Jar file metadata describing the jar's vendor" />
+ <property name="impl.productID"
+ value=""
+ description="Jar file metadata indicating the product ID (this is not the revision)" />
+
+ <!-- Compile properties -->
+ <property name="src.dir" value="${basedir}/src" description="Project source code directory" />
+ <property name="bin.dir" value="${basedir}/bin" description="Base directory for all non-dist build output" />
+ <property name="classes.dir"
+ value="${bin.dir}/classes"
+ description="Classes compiled from project source code are placed here" />
+ <property name="lib.dir"
+ value="${basedir}/lib"
+ description="Directory that hosts Jar files required to compile project source. (IVY will populate this directory with required jars)" />
+ <property name="devlib.dir"
+ value="${basedir}/dev-lib"
+ description="Directory for developer to place development Jar files (not affected by clean targets)" />
+
+ <!-- Compiler properties (passed directly to javac ant target) -->
+ <property name="javac.debug"
+ value="true"
+ description="Indicates whether source should be compiled with debug information (passed to javac ant task)." />
+ <property name="javac.deprecation"
+ value="true"
+ description="Indicates whether source should be compiled with deprecation information" />
+ <property name="javac.source" value="1.5" description="Provide source compatibility with specified release" />
+ <property name="javac.target" value="1.5" description="Generate class files for specific VM version" />
+ <property name="javac.maxmemory" value="256M" description="Max memory alloted to java compile" />
+
+ <!-- Third party Ant tasks and tools properties -->
+ <property name="subfloor.resources.dir"
+ value="${user.home}/.subfloor"
+ description="Base dir for runtime jars that are required exclusively by the build process" />
+ <property name="subfloor.tmp.dir"
+ value="${subfloor.resources.dir}/tmp"
+ description="Temporary space where files are prepared for installation" />
+ <property name="antcontrib.build.cache.dir"
+ value="${subfloor.resources.dir}/ant-contrib"
+ description="Directory where the Ant-Contrib jar (and dependencies) is placed after it is auto-downloaded by the build" />
+ <property name="svnant.use-javahl"
+ value="false"
+ description="Prefer JNI JavaHL binding over the command line client for native svn support" />
+ <property name="svnant.use-svnkit"
+ value="true"
+ description="Prefer SVNKit binding over the command line client for native svn support (defaults to true)" />
+ <property name="ivy.url"
+ value="http://repo2.maven.org/maven2/org/apache/ivy/ivy/2.2.0/ivy-2.2.0.jar"
+ description="The URL to the current release of Apache IVY" />
+
+ <!-- Test properties -->
+ <property name="testsrc.dir" value="${basedir}/test-src" description="Directory that hosts the test source files" />
+ <property name="testlib.dir"
+ value="${basedir}/test-lib"
+ description="Directory for jar files needed during unit testing" />
+ <property name="testbin.dir"
+ value="${bin.dir}/test"
+ description="Base directory for all compiler generated test output" />
+ <property name="testclasses.dir"
+ value="${testbin.dir}/classes"
+ description="Classes compiled from project test code are placed here" />
+ <property name="testreports.dir"
+ value="${bin.dir}/reports/test"
+ description="Base directory that holds all unit test report files" />
+ <property name="testreports.xml.dir"
+ value="${testreports.dir}/xml"
+ description="Unit test xml reports are placed here" />
+ <property name="testreports.html.dir"
+ value="${testreports.dir}/html"
+ description="Unit test html reports are placed here" />
+ <property name="junit.haltonfailure" value="no" description="Fail the build if a test fails" />
+ <property name="junit.maxmemory" value="256M" description="Heap size when Junit is run in fork mode" />
+ <property name="headless.unittest" value="true" description="Runs the unit tests in headless mode" />
+
+ <!-- Code Coverage properties -->
+ <property name="instrumented.classes.dir"
+ value="${testbin.dir}/instrumented-classes"
+ description="Directory where instrumented project classes are placed for use by code coverage utility" />
+ <property name="cobertura.data.dir"
+ value="${testbin.dir}/cobertura-bin"
+ description="Temporary data directory used by Cobertura" />
+ <property name="coberturareports.dir"
+ value="${bin.dir}/reports/cobertura"
+ description="Base directory for all generated Cobertura code coverage reports" />
+ <property name="coberturareports.xml.dir"
+ value="${coberturareports.dir}/xml"
+ description="Cobertura xml reports are placed here" />
+ <property name="coberturareports.html.dir"
+ value="${coberturareports.dir}/html"
+ description="Cobertura html reports are placed here" />
+
+ <!-- Javadoc properties -->
+ <property name="javadoc.dir"
+ value="${bin.dir}/javadoc"
+ description="Directory where generated javadoc will be placed" />
+ <property name="javadoc.packagenames"
+ value="org.mypackagename.*"
+ description="This property is passed to the packagenames property of the javadoc ant task. You should customize this for your project." />
+ <property name="javadoc.zip.filename" value="${ivy.artifact.id}-${project.revision}-javadoc.zip" />
+ <property name="javadoc.tar.filename" value="${ivy.artifact.id}-${project.revision}-javadoc.tar.gz" />
+
+ <!-- Distribution and Assembly properties -->
+ <property name="dist.dir"
+ value="${basedir}/dist"
+ description="Base directory for all project artifacts (jar, zip, tar.gz, etc...)" />
+ <property name="license.dir"
+ value="${basedir}"
+ description="Base directory where this project's license files reside" />
+ <property name="res.dir"
+ value="${basedir}/res"
+ description="Directory that holds resources not included in the source tree" />
+ <property name="source.zip.filename" value="${ivy.artifact.id}-${project.revision}-sources.zip" />
+ <property name="source.tar.filename" value="${ivy.artifact.id}-${project.revision}-sources.tar.gz" />
+ <property name="source.publish" value="true" />
+
+ <!-- Ivy properties -->
+ <property name="ivy.settingsurl"
+ value="file:${basedir}/ivysettings.xml"
+ description="URL to the (common) ivysettings.xml. This file is required by the build to configure IVY. Note you must escape the ':' if this property exists in a .properties file" />
+ <property name="ivyfile"
+ value="ivy.xml"
+ description="The name of the IVY xml file defining your project's dependencies" />
+ <property name="ivy.artifact.group"
+ value="mycompanyname"
+ description="IVY metadata describing the originating company or organization" />
+ <property name="ivy.artifact.pomfile"
+ value="${dist.dir}/pom.xml"
+ description="The path to the Maven pom file to deploy with the artifact" />
+ <property name="ivy.artifact.ivyfilename"
+ value="ivy.xml"
+ description="The name of the IVY xml file to deploy with the artifact" />
+ <property name="ivy.artifact.ivypathname"
+ value="${dist.dir}/ivy.xml"
+ description="The full path to the IVY xml file to deploy with the artifact" />
+ <property name="ivy.reports.dir"
+ value="${bin.dir}/reports/ivy"
+ description="Base directory that holds all IVY dependency report files" />
+ <property name="ivy.configs" value="*" description="Set of configs used for IVY reporting and checking operations" />
+ <property name="ivy.use.symlinks" value="true" description="Flag indicating if Ivy should create symlinks when retrieving artifacts."/>
+
+ <!-- Tattletale properties -->
+ <property name="tattletale.url"
+ value="http://repo.pentaho.org/artifactory/repo/jboss/tattletale/1.1.2.Final/tattletale-1.1.2.Final.zip"
+ description="The URL from which to download tattletale" />
+ <property name="tattletale.classname"
+ value="org.jboss.tattletale.ant.ReportTask"
+ description="The name of the class which will run the tattletale reports" />
+ <property name="tattletale.reports.dir"
+ value="${bin.dir}/reports/tattletale"
+ description="Base directory that holds the output of the tattletale reports" />
+ <property name="tattletale.configfile"
+ value=""
+ description="The configuration file for the tattletale report" />
+
+ <!-- Sonar properties -->
+ <property name="sonar.url"
+ value="http://repo1.maven.org/maven2/org/codehaus/sonar-plugins/sonar-ant-task/1.2/sonar-ant-task-1.2.jar"/>
+ <property name="sonar.classname"
+ value="org.sonar.ant.SonarTask"/>
+
+ <!-- Load the manifest file (if any) as a properties file -->
+ <property name="dist.manifest.file"
+ value="${dist.dir}/MANIFEST.MF"
+ description="The manifest file that will be generated as part of the build" />
+ <property name="manifest.file"
+ value="${res.dir}/META-INF/MANIFEST.MF"
+ description="The location of the MANIFEST.MF file for this application." />
+ <property file="${manifest.file}"
+ description="Loads the manifest information from the manifest file as a properties file." />
+
+ <!-- Set the project revision number to the value in the manifest file (if it has not
+ been specified in the properties file -->
+ <property name="project.revision"
+ value="${Implementation-Version}"
+ description="Sets the version number of the project based on the Implementation-Version found in the manifest file (if one is supplied and nothing is specified in the build.properties)" />
+ <fail message="A project revision number has not been determined!">
+ <condition>
+ <matches string="${project.revision}" pattern="\$\{.*\}" />
+ </condition>
+ </fail>
+
+ <!-- Set the project title to the value in the manifest file (if it has not
+ been specified in the properties file -->
+ <property name="impl.title"
+ value="${Implementation-Title}"
+ description="Sets the title of the project based on the Implementation-Title found in the manifest file (if one is supplied and nothing is specified in the build.properties)" />
+ <fail message="A project title has not been determined!">
+ <condition>
+ <matches string="${impl.title}" pattern="\$\{.*\}" />
+ </condition>
+ </fail>
+
+ <!-- Build Mode properties -->
+ <property name="release" value="false" description="Set this to true if you want to generate a release artifact" />
+
+ <!-- Ivy should only use symlinks if we're not in release mode -->
+ <condition property="ivy.use.symlinks.internal">
+ <and>
+ <isfalse value="${release}"/>
+ <istrue value="${ivy.use.symlinks}"/>
+ </and>
+ </condition>
+
+ <!-- Set the os property -->
+ <condition property="isLinux">
+ <os family="unix" />
+ </condition>
+ <condition property="isWindows">
+ <os family="windows" />
+ </condition>
+ <condition property="isMac">
+ <os family="mac" />
+ </condition>
+
+ <condition property="os.classifier" value="win">
+ <os family="windows" />
+ </condition>
+ <condition property="os.classifier" value="mac">
+ <os family="mac" />
+ </condition>
+ <condition property="os.classifier" value="linux">
+ <os family="unix" />
+ </condition>
+ <property name="os.classifier" value="unsupported" />
+
+ <!-- Setup the compile classpath -->
+ <path id="classpath">
+ <fileset dir="${devlib.dir}">
+ <include name="**/*.jar" />
+ </fileset>
+ <fileset dir="${lib.dir}">
+ <include name="**/*.jar" />
+ </fileset>
+ </path>
+
+ <!-- Setup the classpath used for testing -->
+ <path id="test.classpath">
+ <fileset dir="${devlib.dir}">
+ <include name="**/*.jar" />
+ </fileset>
+ <fileset dir="${lib.dir}">
+ <include name="**/*.jar" />
+ </fileset>
+ <fileset dir="${testlib.dir}">
+ <include name="**/*.jar" />
+ </fileset>
+ <pathelement path="${testclasses.dir}" />
+ <pathelement path="${classes.dir}" />
+ </path>
+
+
+ <!--=======================================================================
+ default
+
+ The target that is run if no target is given
+ ====================================================================-->
+ <target name="default" depends="build" />
+
+
+ <!--=======================================================================
+ build
+
+ Runs a typical build process to create the project locally
+ ====================================================================-->
+ <target name="build" depends="clean-all,resolve,cobertura,dist-source,dist" />
+
+
+ <!--=======================================================================
+ build-testless
+
+ Runs a typical build process to create the project locally (no testing)
+ ====================================================================-->
+ <target name="build-testless" depends="clean-all,resolve,dist-source,dist" />
+
+
+ <!--=======================================================================
+ continuous
+
+ Runs a typical continuous integration build including project dist,
+ test, and coverage artifacts
+ ====================================================================-->
+ <target name="continuous" depends="build,publish" />
+
+
+ <!--=======================================================================
+ continuous-testless
+
+ Runs a typical continuous integration build including project dist,
+ and coverage artifacts
+ ====================================================================-->
+ <target name="continuous-testless" depends="build-testless,publish" />
+
+
+ <!--=======================================================================
+ install-antcontrib
+
+ (Fetches and) installs ant-contrib tasks.
+ ====================================================================-->
+ <target name="install-antcontrib" depends="antcontrib.download-check">
+ <taskdef resource="net/sf/antcontrib/antlib.xml">
+ <classpath>
+ <fileset dir="${antcontrib.build.cache.dir}">
+ <include name="*.jar" />
+ </fileset>
+ </classpath>
+ </taskdef>
+ </target>
+
+
+ <!--=======================================================================
+ antcontrib.download-check
+
+ Fetches ant-contrib from sourceforge if it is not already present
+ ====================================================================-->
+ <target name="antcontrib.download-check">
+ <condition property="antcontrib.available">
+ <and>
+ <available file="${antcontrib.build.cache.dir}" />
+ <available classname="net.sf.antcontrib.logic.IfTask">
+ <classpath>
+ <fileset dir="${antcontrib.build.cache.dir}">
+ <include name="*.jar" />
+ </fileset>
+ </classpath>
+ </available>
+ </and>
+ </condition>
+ <antcall target="antcontrib.download" />
+ </target>
+
+
+ <!--=======================================================================
+ antcontrib.download
+
+ Fetches ant-contrib from sourceforge
+ ====================================================================-->
+ <target name="antcontrib.download" unless="antcontrib.available">
+ <mkdir dir="${subfloor.tmp.dir}" />
+ <get src="http://downloads.sourceforge.net/ant-contrib/ant-contrib-1.0b3-bin.zip"
+ dest="${subfloor.tmp.dir}/antcontrib.zip"
+ usetimestamp="true" />
+ <unzip src="${subfloor.tmp.dir}/antcontrib.zip" dest="${subfloor.tmp.dir}">
+ <patternset>
+ <include name="**/*.jar" />
+ </patternset>
+ </unzip>
+ <copy todir="${antcontrib.build.cache.dir}">
+ <fileset dir="${subfloor.tmp.dir}/ant-contrib">
+ <include name="**/*.jar" />
+ </fileset>
+ </copy>
+ </target>
+
+
+ <!--=======================================================================
+ init
+
+ Ensures that all the required directories exist before processing
+ a build.
+ ====================================================================-->
+ <target name="init">
+ <mkdir dir="${classes.dir}" />
+ <mkdir dir="${dist.dir}" />
+ <mkdir dir="${lib.dir}" />
+ <mkdir dir="${devlib.dir}" />
+ <mkdir dir="${testlib.dir}" />
+ </target>
+
+
+ <!--=======================================================================
+ install-svnant
+
+ (Fetches and) installs the SVN ANT for use by this ant script
+ ====================================================================-->
+ <target name="install-svnant" depends="install-ivy">
+ <if>
+ <istrue value="${svnant.isinstalled}" />
+ <then>
+ <echo message="Skipping SVN ANT install. SVN ANT has already been configured by the build" />
+ </then>
+ <else>
+ <taskdef-with-ivy organisation="tigris"
+ module="svnant"
+ revision="1.3.0"
+ resource="org/tigris/subversion/svnant/svnantlib.xml"
+ classname="org.tigris.subversion.svnant.SvnTask" />
+ <property name="svnant.isinstalled" value="true" />
+ </else>
+ </if>
+ </target>
+
+
+ <!--=======================================================================
+ test-svnant
+
+ Tests SVN by printing out the repository
+ ====================================================================-->
+ <target name="test-svnant" depends="install-svnant">
+ <svn javahl="${svnant.use-javahl}" svnkit="${svnant.use-svnkit}">
+ <wcVersion path="." />
+ </svn>
+ <echo message="Subversion repository url: ${repository.url}" />
+ </target>
+
+
+ <!--=======================================================================
+ svn-revision
+
+ Prints and sets the SVN revision for the repository at the current dir (if svn.revision is not set)
+ ====================================================================-->
+ <target name="svn-revision" depends="install-svnant">
+
+ <svn javahl="${svnant.use-javahl}" svnkit="${svnant.use-svnkit}">
+ <status path="." revisionProperty="svn.revision" />
+ </svn>
+ <echo message="Subversion repository revision: ${svn.revision}" />
+ </target>
+
+
+ <!--=======================================================================
+ set-build.id
+
+ Sets a property build.id to the either "development" or the svn revision
+ if in release mode
+ ====================================================================-->
+ <target name="set-build.id" unless="build.id" depends="install-antcontrib">
+ <if>
+ <istrue value="${release}" />
+ <then>
+ <antcallback target="svn-revision" return="svn.revision" />
+ <property name="build.id" value="${svn.revision}" />
+ </then>
+ <else>
+ <property name="build.id" value="development" />
+ </else>
+ </if>
+ </target>
+
+ <!--=================================================================================
+ version-properties: common Ant driven version file generation. Projects that produce
+ a package or packages should run this target. Projects that produce
+ jars only should NOT.
+ ===================================================================================-->
+ <target name="version-properties" depends="set-build.id">
+ <tstamp>
+ <format property="build.time" pattern="yyyy/MM/dd hh:mm aa" />
+ </tstamp>
+ <propertyfile file="version.properties" comment="Release Build version info">
+ <entry key="release.major.number" value="${release.major.number}" />
+ <entry key="release.minor.number" value="${release.minor.number}" />
+ <entry key="release.milestone.number" value="${release.milestone.number}" />
+ <entry key="release.candidate.token" value="${release.candidate.token}" />
+ <entry key="impl.vendor" value="${impl.vendor}" />
+ <entry key="impl.version"
+ value="${release.major.number}.${release.minor.number}.${release.milestone.number}.${build.id}" />
+ <entry key="impl.title" value="${impl.title}" />
+ <entry key="buildDate" value="${build.time}" />
+ <entry key="svn.revision" value="${build.id}" />
+ <entry key="release.build.number" default="0" type="int" operation="+" value="1" pattern="0000" />
+ </propertyfile>
+ <property file="${basedir}/version.properties" />
+ </target>
+
+
+ <!--=======================================================================
+ install-ivy
+
+ Fetches and installs IVY ant tasks if not already installed
+ ====================================================================-->
+ <target name="install-ivy" depends="install-antcontrib">
+ <if>
+ <istrue value="${ivy.isinstalled}" />
+ <then>
+ <echo message="Skipping IVY install. IVY has already been configured by the build" />
+ </then>
+ <else>
+ <download-antlib name="ivy" url="${ivy.url}" classname="org.apache.ivy.ant.IvyTask" extension="jar" />
+ <taskdef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant">
+ <classpath>
+ <fileset dir="${subfloor.resources.dir}/ivy">
+ <include name="*.jar" />
+ </fileset>
+ </classpath>
+ </taskdef>
+ <ivy:settings url="${ivy.settingsurl}" />
+ <property name="ivy.isinstalled" value="true" />
+ </else>
+ </if>
+ </target>
+
+
+ <!--=======================================================================
+ ivy.check-releasable
+
+ Verifies that there are no SNAPSHOT dependencies defined in the ivy xml.
+ If there are SNAPSHOTS, fail the release build.
+ ====================================================================-->
+ <target name="ivy.check-releasable" depends="install-ivy, install-antcontrib">
+ <if>
+ <istrue value="${release}" />
+ <then>
+ <sequential>
+ <ivy:artifactproperty conf="${ivy.configs}" name="dep.[module]/[artifact]-[revision]" value="[revision]" />
+
+ <propertyselector property="violators" match="dep\..*SNAPSHOT.*" select="\0" casesensitive="false" />
+
+ <fail if="violators"
+ message="Release not possible, you have dependencies on non-released artifacts: ${violators}" />
+ </sequential>
+ </then>
+ </if>
+ </target>
+
+
+ <!--=======================================================================
+ resolve
+
+ Using ivy and the dependencies for the project (defined in the ivy.xml
+ file), this task will retrieve the needed files and place them into
+ the defined directories.
+ ====================================================================-->
+ <target name="resolve"
+ depends="resolve-default, resolve-test, ivy.check-releasable"
+ description="Retrieves all the dependent libraries" />
+
+ <target name="resolve-init" unless="resolve-init.skip" depends="install-ivy">
+ <!-- If this is the 1st time through resolve-init, then we need to clean up the jars
+-->
+ <antcall target="clean-jars" />
+ <property name="resolve-init.skip" value="" />
+ </target>
+
+ <target name="resolve-default" depends="resolve-default.default,resolve-default.composite"/>
+
+ <!--
+ This target resolves the default IVY configuration as a composite of child configurations.
+ You should set ivy.default.sub-configs in your build.properties only if you want your default
+ configuration to be treated as a composite of two or more child configurations.
+ To turn this on, set ivy.default.sub-configs property in your build.properties, e.g.
+ ivy.default.sub-configs=external,internal
+ Note: the parent config "default" proper will not be resolved
+ -->
+ <target name="resolve-default.composite" depends="install-antcontrib,resolve-init" if="ivy.default.sub-configs">
+ <for list="${ivy.default.sub-configs}" param="conf">
+ <sequential>
+ <ivy:resolve file="${ivyfile}" conf="default_@{conf}" />
+ <ivy:retrieve conf="default_@{conf}" pattern="${lib.dir}/@{conf}/[module]-[revision](-[classifier]).[ext]" symlink="${ivy.use.symlinks.internal}" />
+ </sequential>
+ </for>
+ </target>
+
+ <target name="resolve-default.default" depends="resolve-init" unless="ivy.default.sub-configs">
+ <ivy:resolve file="${ivyfile}" conf="default" />
+ <ivy:retrieve conf="default" pattern="${lib.dir}/[module]-[revision](-[classifier]).[ext]" symlink="${ivy.use.symlinks.internal}" />
+ </target>
+
+ <target name="resolve-test" depends="resolve-init">
+ <ivy:resolve file="${ivyfile}" conf="test" />
+ <ivy:retrieve conf="test" pattern="${testlib.dir}/[module]-[revision](-[classifier]).[ext]" symlink="${ivy.use.symlinks.internal}" />
+ </target>
+
+ <target name="resolve-codegen" depends="resolve-init">
+ <ivy:resolve file="${ivyfile}" conf="codegen" />
+ <ivy:retrieve conf="codegen" pattern="${lib.dir}/[module]-[revision](-[classifier]).[ext]" symlink="${ivy.use.symlinks.internal}" />
+ </target>
+
+ <target name="resolve-runtime" depends="resolve-init">
+ <ivy:resolve file="${ivyfile}" conf="runtime" />
+ <ivy:retrieve conf="runtime" pattern="${lib.dir}/[module]-[revision](-[classifier]).[ext]" symlink="${ivy.use.symlinks.internal}" />
+ </target>
+
+
+ <!--=======================================================================
+ ivy-clean-cache
+
+ Cleans the IVY cache. You are erasing IVY's memory. Run this if you
+ want to force IVY to go fetch all your project dependencies from scratch.
+ WARNING: this will affect all IVY projects, not just the current workspace
+ ====================================================================-->
+ <target name="ivy-clean-cache" depends="install-ivy">
+ <ivy:cleancache />
+ </target>
+
+
+ <!--=======================================================================
+ ivy-clean-local
+
+ Completely cleans your local repository of any files published locally
+ by way of publish-local.
+ WARNING: this is a global action and will affect other IVY projects
+ currently referencing a locally published dependency
+ ====================================================================-->
+ <target name="ivy-clean-local" depends="install-ivy">
+ <delete dir="${ivy.local.default.root}/" />
+ </target>
+
+
+ <!--=======================================================================
+ ivy-clean-by-name
+
+ Cleans your IVY cache and local repository of specific files.
+ WARNING: this is a global action and will affect other IVY projects
+ currently referencing a locally published dependency
+ ====================================================================-->
+ <target name="ivy-clean-pentaho" depends="install-ivy">
+ <mkdir dir="${ivy.local.default.root}" />
+ <!-- just in case it doesn't exist -->
+ <for param="dir">
+ <path>
+ <dirset dir="${ivy.local.default.root}" includes="*${ivy.clean.pattern}*" />
+ <dirset dir="${ivy.default.ivy.user.dir}/cache" includes="*${ivy.clean.pattern}*" />
+ </path>
+ <sequential>
+ <delete dir="@{dir}" includeemptydirs="true" />
+ </sequential>
+ </for>
+ <for param="file">
+ <path>
+ <fileset dir="${ivy.local.default.root}" includes="*${ivy.clean.pattern}*" />
+ <fileset dir="${ivy.default.ivy.user.dir}/cache" includes="*${ivy.clean.pattern}*" />
+ </path>
+ <sequential>
+ <delete file="@{file}" />
+ </sequential>
+ </for>
+ </target>
+
+
+ <!--=======================================================================
+ ivy-report
+
+ Generates an IVY dependency report for this project.
+ ====================================================================-->
+ <target name="ivy-report" depends="install-ivy">
+ <ivy:resolve file="${ivyfile}" conf="${ivy.configs}" />
+ <ivy:report xml="true" todir="${ivy.reports.dir}" />
+ </target>
+
+
+ <!--=======================================================================
+ publish-local-nojar
+
+ Publishes the jar file for this project to the user's local repository
+ for download by other projects currently being executed on the user's
+ system.
+ ====================================================================-->
+ <target name="publish-local-nojar" depends="install-ivy,publish-local-nojar.internal">
+ <if>
+ <equals arg1="${tests.publish}" arg2="true" />
+ <then>
+ <antcall target="publish-local-nojar.internal">
+ <param name="ivy.artifact.id" value="${ivy.artifact.id}-test"/>
+ </antcall>
+ </then>
+ </if>
+ <antcall target="publish-local-nojar.post"/>
+ </target>
+
+ <!--=======================================================================
+ publish-local-nojar.post this target is invoked after the normal set of publish-local-nojar
+ is completed, override this to perform additional publishing in extensions of subfloor, etc
+ ====================================================================-->
+ <target name="publish-local-nojar.post">
+ </target>
+
+ <target name="publish-local-nojar.internal" depends="install-ivy">
+ <ivy:resolve file="${ivy.artifact.ivyfilename}" />
+ <ivy:publish resolver="local" pubrevision="${project.revision}" overwrite="true" forcedeliver="true" warnonmissing="yes" haltonmissing="no">
+ <artifacts pattern="${dist.dir}/[artifact]-[revision](-[classifier]).[ext]" />
+ </ivy:publish>
+ </target>
+
+ <!--=======================================================================
+ publish-local
+
+ Builds and publishes the jar file for this project to the user's
+ local repository for download by other projects currently being
+ executed on the user's system.
+ ====================================================================-->
+ <target name="publish-local"
+ depends="dist, dist-source, publish-local-nojar"
+ description="Builds and publishes the jar file to the local repository" />
+
+
+ <!--=======================================================================
+ publish
+
+ Creates and publishes the jar file for this project to a Maven2
+ repository.
+ ====================================================================-->
+ <target name="publish" depends="dist, dist-source, publish-nojar">
+ </target>
+
+
+ <!--=======================================================================
+ publish-nojar
+
+ Publishes the jar file for this project to a Maven2 repository.
+ ====================================================================-->
+ <target name="publish-nojar" depends="install-antcontrib,create-pom,ivy.deliver,publish-nojar.internal">
+ <if>
+ <equals arg1="${tests.publish}" arg2="true" />
+ <then>
+ <antcall target="publish-nojar.internal">
+ <param name="ivy.artifact.id" value="${ivy.artifact.id}-test"/>
+ </antcall>
+ </then>
+ </if>
+ </target>
+
+ <target name="publish-nojar.internal" depends="install-antcontrib,create-pom,ivy.deliver">
+ <antcall target="maven-publish-dependencies">
+ <param name="publish.groupId" value="${ivy.artifact.group}" />
+ <param name="publish.artifactId" value="${ivy.artifact.id}" />
+ <param name="publish.version" value="${project.revision}" />
+ <param name="publish.file" value="${ivy.artifact.ivypathname}" />
+ </antcall>
+
+ <if>
+ <equals arg1="${source.publish}" arg2="true" />
+ <then>
+ <antcall target="maven-publish-sources">
+ <param name="publish.groupId" value="${ivy.artifact.group}" />
+ <param name="publish.artifactId" value="${ivy.artifact.id}" />
+ <param name="publish.version" value="${project.revision}" />
+ <param name="publish.file" value="${dist.dir}/${ivy.artifact.id}-${project.revision}-sources.jar" />
+ </antcall>
+ </then>
+ </if>
+
+ <antcall target="maven-publish-artifact">
+ <param name="publish.pomFile" value="${ivy.artifact.pomfile}" />
+ <param name="publish.file" value="${dist.dir}/${ivy.artifact.id}-${project.revision}.jar" />
+ </antcall>
+
+ <antcall target="maven-publish.post"/>
+
+ </target>
+
+ <!-- Override this if anything is needed to be done after the standard parts of publish are completed -->
+ <!-- Such as: publishing non-standard/extended artifacts, etc -->
+ <target name="maven-publish.post"/>
+
+ <!--=======================================================================
+ ivy.deliver
+
+ Creates a publishable version of the ivy dependencies file, ivy.xml
+ ====================================================================-->
+ <target name="ivy.deliver" depends="resolve">
+ <ivy:deliver conf="*(public)" deliverpattern="${dist.dir}/ivy.xml" />
+ </target>
+
+
+ <!--=======================================================================
+ maven-publish-dependencies
+
+ A function that deploys an ivy.xml file to a maven repository
+ ====================================================================-->
+ <target name="maven-publish-dependencies" depends="install-antcontrib">
+ <sequential>
+ <fail message="No file found at: ${publish.file}">
+ <condition>
+ <not>
+ <available file="${publish.file}" />
+ </not>
+ </condition>
+ </fail>
+ <echo message="Publishing ${publish.file} to ${ivy.repository.publish}..." />
+ <if>
+ <isset property="isWindows" />
+ <then>
+ <exec executable="cmd" failonerror="true">
+ <arg value="/c" />
+ <arg value="mvn.bat" />
+ <arg value="deploy:deploy-file" />
+ <arg value="-DrepositoryId=${ivy.repository.id}" />
+ <arg value="-Durl=${ivy.repository.publish}" />
+ <arg value="-DgroupId=${publish.groupId}" />
+ <arg value="-DartifactId=${publish.artifactId}" />
+ <arg value="-Dversion=${publish.version}" />
+ <arg value="-Dpackaging=ivy.xml" />
+ <arg value="-Dfile=${publish.file}" />
+ </exec>
+ </then>
+ <else>
+ <exec executable="mvn" failonerror="true">
+ <arg value="deploy:deploy-file" />
+ <arg value="-DrepositoryId=${ivy.repository.id}" />
+ <arg value="-Durl=${ivy.repository.publish}" />
+ <arg value="-DgroupId=${publish.groupId}" />
+ <arg value="-DartifactId=${publish.artifactId}" />
+ <arg value="-Dversion=${publish.version}" />
+ <arg value="-Dpackaging=ivy.xml" />
+ <arg value="-Dfile=${publish.file}" />
+ <arg value="-e" />
+ </exec>
+ </else>
+ </if>
+ </sequential>
+ </target>
+
+
+ <!--=======================================================================
+ maven-publish-artifact
+
+ A function that deploys an artifact to a maven repository
+ ====================================================================-->
+ <target name="maven-publish-artifact" depends="install-antcontrib">
+ <sequential>
+ <fail message="No file found at: ${publish.file}">
+ <condition>
+ <not>
+ <available file="${publish.file}" />
+ </not>
+ </condition>
+ </fail>
+ <echo message="Publishing ${publish.file} to ${ivy.repository.publish}..." />
+ <if>
+ <isset property="isWindows" />
+ <then>
+ <exec executable="cmd" failonerror="true">
+ <arg value="/c" />
+ <arg value="mvn.bat" />
+ <arg value="deploy:deploy-file" />
+ <arg value="-DrepositoryId=${ivy.repository.id}" />
+ <arg value="-Durl=${ivy.repository.publish}" />
+ <arg value="-DpomFile=${publish.pomFile}" />
+ <arg value="-Dfile=${publish.file}" />
+ </exec>
+ </then>
+ <else>
+ <exec executable="mvn" failonerror="true">
+ <arg value="deploy:deploy-file" />
+ <arg value="-DrepositoryId=${ivy.repository.id}" />
+ <arg value="-Durl=${ivy.repository.publish}" />
+ <arg value="-DpomFile=${publish.pomFile}" />
+ <arg value="-Dfile=${publish.file}" />
+ </exec>
+ </else>
+ </if>
+ </sequential>
+ </target>
+
+
+ <!--=======================================================================
+ maven-publish-sources
+
+ A function that deploys a java-sources artifact to a maven repository
+ ====================================================================-->
+ <target name="maven-publish-sources" depends="install-antcontrib">
+ <sequential>
+ <fail message="No file found at: ${publish.file}">
+ <condition>
+ <not>
+ <available file="${publish.file}" />
+ </not>
+ </condition>
+ </fail>
+ <echo message="Publishing ${publish.file} to ${ivy.repository.publish}..." />
+ <if>
+ <isset property="isWindows" />
+ <then>
+ <exec executable="cmd" failonerror="true">
+ <arg value="/c" />
+ <arg value="mvn.bat" />
+ <arg value="deploy:deploy-file" />
+ <arg value="-DrepositoryId=${ivy.repository.id}" />
+ <arg value="-Durl=${ivy.repository.publish}" />
+ <arg value="-DgroupId=${publish.groupId}" />
+ <arg value="-DartifactId=${publish.artifactId}" />
+ <arg value="-Dversion=${publish.version}" />
+ <arg value="-DgeneratePom=true" />
+ <arg value="-Dpackaging=java-source" />
+ <arg value="-Dfile=${publish.file}" />
+ </exec>
+ </then>
+ <else>
+ <exec executable="mvn" failonerror="true">
+ <arg value="deploy:deploy-file" />
+ <arg value="-DrepositoryId=${ivy.repository.id}" />
+ <arg value="-Durl=${ivy.repository.publish}" />
+ <arg value="-DgroupId=${publish.groupId}" />
+ <arg value="-DartifactId=${publish.artifactId}" />
+ <arg value="-Dversion=${publish.version}" />
+ <arg value="-DgeneratePom=true" />
+ <arg value="-Dpackaging=java-source" />
+ <arg value="-Dfile=${publish.file}" />
+ </exec>
+ </else>
+ </if>
+ </sequential>
+ </target>
+
+
+ <!--=======================================================================
+ create-pom
+
+ Creates the POM file for publishing the jar file to a Maven2 repository.
+ ====================================================================-->
+ <target name="create-pom" depends="install-ivy">
+ <ivy:makepom ivyfile="${ivyfile}" pomfile="${dist.dir}/pom.xml">
+ <mapping conf="default" scope="compile" />
+ <mapping conf="runtime" scope="runtime" />
+ </ivy:makepom>
+ </target>
+
+
+ <!--=======================================================================
+ clean-jars
+
+ Removes all the libraries that have been downloaded for this project
+ using the ivy dependencies.
+ ====================================================================-->
+ <target name="clean-jars">
+ <delete dir="${lib.dir}" />
+ <delete dir="${testlib.dir}" />
+ </target>
+
+
+ <!--=======================================================================
+ clean
+
+ Removes all the files generated from the build process.
+ ====================================================================-->
+ <target name="clean"
+ description="Cleans all the files generated from a build with the exception of IVY-downloaded jars (see clean-all)"
+ depends="clean-tests, clean-cobertura, clean-sonar, clean-javadoc, clean-dist">
+ <delete dir="${classes.dir}" />
+ <delete dir="${bin.dir}" />
+ </target>
+
+
+ <!--=======================================================================
+ clean-dist
+
+ Removes all dist artifacts
+ ====================================================================-->
+ <target name="clean-dist">
+ <delete dir="${dist.dir}" />
+ </target>
+
+
+ <!--=======================================================================
+ clean-all
+
+ Removes all the libraries that have been downloaded for this project
+ in the workspace's lib dirs as well as all the files
+ generated from the build process.
+ ====================================================================-->
+ <target name="clean-all" depends="clean,clean-jars" description="Cleans all the generated and dependency files" />
+
+
+ <!--=======================================================================
+ copy-license-lgpl
+
+ Copies the LGPL license file into the binary directory.
+ ====================================================================-->
+ <target name="copy-license-lgpl" if="lgpl-license-avail">
+ <copy todir="${classes.dir}/META-INF">
+ <fileset dir="${license.dir}" includes="lgpl-2.1.txt" />
+ </copy>
+ </target>
+
+
+ <!--=======================================================================
+ copy-license-gpl-parent
+
+ Copies the GPL license file from the parent directory into the
+ binary directory.
+ ====================================================================-->
+ <target name="copy-license-gpl" if="gpl-license-avail">
+ <copy todir="${classes.dir}/META-INF">
+ <fileset dir="${license.dir}" includes="gpl-2.0.txt" />
+ </copy>
+ </target>
+
+
+ <!--=======================================================================
+ compile
+
+ Compiles the source code (using the specified options) into the
+ binary directory.
+
+ NOTE: This contains multiple sub-tasks which will occur in the
+ following order (this is provided for easier overriding by
+ the build.xml which will include this file)...
+ - compile.pre : anything needed to prep for compile
+ - compile.compile : the actual compilation step
+ - compile.src_copy : copying the source into the bin directory
+ - compile.res_copy : copying the resources into the bin directory
+ - compile.lic_copy : copying the license information into the bin directory
+ - compile.post : anything needed after the compile is done
+ ====================================================================-->
+ <target name="compile"
+ depends="init, compile.pre, compile.compile, compile.src_copy, compile.res_copy, compile.lic_copy, compile.post"
+ description="Performs all the steps to prepare the bin directory with a complete compilation" />
+
+
+ <!--=======================================================================
+ compile.pre
+
+ Prepares to perform the compile.
+ ====================================================================-->
+ <target name="compile.pre" />
+
+
+ <!--=======================================================================
+ compile.compile
+
+ Performs the actual compile
+ ====================================================================-->
+ <target name="compile.compile" depends="init">
+ <javac destdir="${classes.dir}"
+ debug="${javac.debug}"
+ deprecation="${javac.deprecation}"
+ fork="true"
+ memorymaximumsize="${javac.maxmemory}"
+ source="${javac.source}"
+ target="${javac.target}">
+ <classpath>
+ <path refid="classpath" />
+ </classpath>
+ <src path="${src.dir}" />
+ </javac>
+ </target>
+
+
+ <!--=======================================================================
+ compile.res_copy
+
+ Copies any needed resources into the classes directory. Will not
+ duplicate copying of resources from src tree (handled by compile.src_copy
+ if jar.include.source is set.
+ ====================================================================-->
+ <target name="compile.res_copy" depends="install-antcontrib">
+ <if>
+ <available file="${res.dir}" />
+ <then>
+ <copy todir="${classes.dir}">
+ <fileset dir="${res.dir}" />
+ </copy>
+ </then>
+ </if>
+
+ <if>
+ <not>
+ <isset property="jar.include.source" />
+ </not>
+ <then>
+ <copy todir="${classes.dir}" flatten="false">
+ <fileset dir="${src.dir}" excludes="**/*.java" />
+ </copy>
+ </then>
+ </if>
+ </target>
+
+
+ <!--=======================================================================
+ compile.src_copy
+
+ Copies the source files to the bin directory
+ NOTE: if the dont.copy.source variable exists, this step will be
+ skipped!
+ ====================================================================-->
+ <target name="compile.src_copy" depends="init" if="jar.include.source">
+ <copy todir="${classes.dir}" flatten="false">
+ <fileset dir="${src.dir}" />
+ </copy>
+ </target>
+
+
+ <!--=======================================================================
+ compile.lic_copy
+
+ Copies the license file(s) into the bin directory
+ ====================================================================-->
+ <target name="compile.lic_copy" depends="init">
+ <condition property="lgpl-license-avail">
+ <available file="${license.dir}/lgpl-2.1.txt" />
+ </condition>
+ <antcall target="copy-license-lgpl" />
+ <condition property="gpl-license-avail">
+ <available file="${license.dir}/gpl-2.0.txt" />
+ </condition>
+ <antcall target="copy-license-gpl" />
+ </target>
+
+
+ <!--=======================================================================
+ compile.post
+
+ Performs any needed post-compile tasks
+ ====================================================================-->
+ <target name="compile.post" />
+
+
+ <!--=======================================================================
+ jar
+
+ Creates a jar file from the bin directory
+ ====================================================================-->
+ <target name="jar"
+ depends="jar.main,jar.test"
+ description="Jars up the bin directory after a compile">
+ </target>
+
+ <!-- jar the tests ONLY IF tests.publish it true -->
+ <!-- if the compile-tests target is in the dependency list for this target, -->
+ <!-- it will get executed no matter what the value of tests.publish is -->
+ <target name="jar.test"
+ if="tests.publish">
+ <antcall target="compile-tests" />
+ <jar destfile="${dist.dir}/${ivy.artifact.id}-test-${project.revision}.jar" manifest="${dist.manifest.file}">
+ <fileset dir="${testclasses.dir}"/>
+ </jar>
+ </target>
+
+ <target name="jar.main"
+ depends="compile,set-build.id,generate.manifest">
+ <jar destfile="${dist.dir}/${ivy.artifact.id}-${project.revision}.jar" manifest="${dist.manifest.file}">
+ <fileset dir="${classes.dir}" />
+ </jar>
+ </target>
+
+ <!--=======================================================================
+ generate.manifest
+
+ Creates a new manifest file if one is not specified, or updates
+ an existing manifest file if one is specified.
+ ====================================================================-->
+ <target name="generate.manifest" depends="init,set-build.id">
+ <delete file="${dist.manifest.file}" />
+ <touch file="${dist.manifest.file}" />
+ <copy file="${manifest.file}" tofile="${dist.manifest.file}" overwrite="true" failonerror="false" />
+
+ <manifest file="${dist.manifest.file}" mode="update">
+ <attribute name="Implementation-Title" value="${impl.title}" />
+ <attribute name="Implementation-Version" value="${project.revision}.${build.id}" />
+ <attribute name="Implementation-Vendor" value="${impl.vendor}" />
+ <attribute name="Implementation-ProductID" value="${impl.productID}" />
+ </manifest>
+ </target>
+
+
+ <!--=======================================================================
+ dist-source
+
+ Generates zip and targz distributions of the javadoc
+ ====================================================================-->
+ <target name="dist-source" depends="source.jar, source.zip, source.targz" />
+
+
+ <!--=======================================================================
+ source.jar
+
+ Creates a jar of the project source for distribution
+ ====================================================================-->
+ <target name="source.jar" depends="init,install-antcontrib">
+ <jar jarfile="${dist.dir}/${ivy.artifact.id}-${project.revision}-sources.jar" basedir="${src.dir}" />
+ <if>
+ <equals arg1="${tests.publish}" arg2="true" />
+ <then>
+ <jar jarfile="${dist.dir}/${ivy.artifact.id}-test-${project.revision}-sources.jar" basedir="${src.dir}" />
+ </then>
+ </if>
+ </target>
+
+ <!--=======================================================================
+ source.zip
+
+ Creates a zip of the project source for distribution
+ ====================================================================-->
+ <target name="source.zip" depends="init">
+ <jar jarfile="${dist.dir}/${source.zip.filename}" basedir="${src.dir}" />
+ </target>
+
+ <!--=======================================================================
+ source.targz
+
+ Creates a gzipped tar of the project source for distribution
+ ====================================================================-->
+ <target name="source.targz" depends="init">
+ <tar compression="gzip" destfile="${dist.dir}/${source.tar.filename}" basedir="${src.dir}" />
+ </target>
+
+
+ <!--=======================================================================
+ clean-tests
+
+ Removes all files related to tests
+ ====================================================================-->
+ <target name="clean-tests">
+ <delete dir="${testbin.dir}" />
+ </target>
+
+
+ <!--=======================================================================
+ init-tests
+
+ Compiles project test source
+ ====================================================================-->
+ <target name="init-tests" depends="clean-tests">
+ <mkdir dir="${testclasses.dir}" />
+ <mkdir dir="${testsrc.dir}" />
+ </target>
+
+
+ <!--=======================================================================
+ compile-tests
+
+ Compiles project test source
+ ====================================================================-->
+ <target name="compile-tests" depends="init-tests">
+ <javac destdir="${testclasses.dir}"
+ debug="true"
+ optimize="false"
+ source="${javac.source}"
+ target="${javac.target}"
+ fork="true">
+ <src path="${testsrc.dir}" />
+ <classpath refid="test.classpath" />
+ </javac>
+
+ <!-- Copy the non-java files from the source directory to the test classes directory
+-->
+ <copy todir="${testclasses.dir}">
+ <fileset dir="${testsrc.dir}">
+ <exclude name="**/*.java" />
+ </fileset>
+ </copy>
+ </target>
+
+
+ <!--=======================================================================
+ test
+
+ Compiles and runs all the tests for the project
+ ====================================================================-->
+ <target name="test" depends="compile,compile-tests, init-test-reports" description="Compiles and runs unit tests">
+ <junit maxmemory="${junit.maxmemory}"
+ fork="yes"
+ failureProperty="test.failed"
+ haltonfailure="${junit.haltonfailure}"
+ printsummary="yes">
+ <sysproperty key="java.awt.headless" value="${headless.unittest}" />
+
+ <syspropertyset>
+ <propertyref prefix="junit.sysprop." />
+ <mapper type="glob" from="junit.sysprop.*" to="*"/>
+ </syspropertyset>
+
+ <classpath refid="test.classpath" />
+ <formatter type="xml" />
+ <test name="${testcase}" todir="${testreports.xml.dir}" if="testcase" />
+ <batchtest fork="yes" todir="${testreports.xml.dir}" unless="testcase">
+ <fileset dir="${testsrc.dir}" casesensitive="yes">
+ <include name="**/*Test.java" />
+ </fileset>
+ </batchtest>
+ </junit>
+
+ <junitreport todir="${testreports.html.dir}">
+ <fileset dir="${testreports.xml.dir}">
+ <include name="TEST-*.xml" />
+ </fileset>
+ <report format="frames" todir="${testreports.html.dir}" />
+ </junitreport>
+ </target>
+
+
+ <!--=======================================================================
+ clean-test-reports
+
+ Remove all xml and html JUnit test reports
+ ====================================================================-->
+ <target name="clean-test-reports">
+ <delete dir="${testreports.xml.dir}" />
+ <delete dir="${testreports.html.dir}" />
+ </target>
+
+
+ <!--=======================================================================
+ init-test-reports
+
+ Prepare directories for JUnit test reports
+ ====================================================================-->
+ <target name="init-test-reports" depends="clean-test-reports">
+ <mkdir dir="${testreports.xml.dir}" />
+ <mkdir dir="${testreports.html.dir}" />
+ </target>
+
+ <!--=======================================================================
+ dist
+
+ Creates a distribution of this project
+ ====================================================================-->
+ <target name="dist" depends="jar" description="Creates a distribution" />
+
+
+ <!--=======================================================================
+ dist-full
+
+ Creates a distribution of this project including all sources needed
+ to build as well as the resultant jar
+ ====================================================================-->
+ <target name="dist-full" depends="jar"
+ description="Creates all the distributable items for this project">
+ <!-- Create the required zip distribution which contains the entire project -->
+ <zip destfile="${dist.dir}/${ivy.artifact.id}-${project.revision}.zip">
+ <fileset dir="${basedir}">
+ <exclude name="bin/"/>
+ <exclude name="dist/"/>
+ <exclude name="eclipse-bin/"/>
+ </fileset>
+ <zipfileset dir="${dist.dir}" includes="**/*.jar"/>
+ </zip>
+ </target>
+
+
+ <!--=======================================================================
+ javadoc
+
+ Generates javadoc source documentation for this project
+ ====================================================================-->
+ <target name="javadoc" depends="javadoc.init, compile">
+ <javadoc destdir="${javadoc.dir}/docs/api"
+ access="public"
+ source="1.5"
+ use="true"
+ notree="false"
+ nonavbar="false"
+ noindex="false"
+ splitindex="true"
+ author="true"
+ version="true"
+ maxmemory="256M"
+ nodeprecatedlist="false"
+ nodeprecated="false"
+ packagenames="${javadoc.packagenames}"
+ sourcepath="${src.dir}"
+ doctitle="${impl.title} documentation">
+ <link href="http://java.sun.com/j2se/1.5.0/docs/api/" />
+ <classpath refid="classpath" />
+ </javadoc>
+ </target>
+
+
+ <!--=======================================================================
+ dist-javadoc
+
+ Generates zip and targz distributions of the javadoc
+ ====================================================================-->
+ <target name="dist-javadoc" depends="javadoc.zip, javadoc.targz" />
+
+
+ <!--=======================================================================
+ clean-javadoc
+
+ Removes generated javadoc files (note, this does not remove javadoc distributions.
+ Use clean-dist to remove artifacts from the dist.dir.
+ ====================================================================-->
+ <target name="clean-javadoc">
+ <delete dir="${javadoc.dir}" />
+ </target>
+
+
+ <!--=======================================================================
+ javadoc.init
+
+ Creates directories for javadoc process
+ ====================================================================-->
+ <target name="javadoc.init" depends="clean-javadoc">
+ <mkdir dir="${javadoc.dir}" />
+ </target>
+
+
+ <!--=======================================================================
+ javadoc.zip
+
+ Creates a zip of the javadoc for distribution
+ ====================================================================-->
+ <target name="javadoc.zip" depends="javadoc">
+ <jar jarfile="${dist.dir}/${javadoc.zip.filename}"
+ basedir="${javadoc.dir}"
+ includes="**/*"
+ excludes="**/Thumbs.db" />
+ </target>
+
+
+ <!--=======================================================================
+ javadoc.targz
+
+ Creates a gzipped tar of the javadoc for distribution
+ ====================================================================-->
+ <target name="javadoc.targz" depends="javadoc">
+ <tar compression="gzip"
+ destfile="${dist.dir}/${javadoc.tar.filename}"
+ basedir="${javadoc.dir}"
+ includes="**/*"
+ excludes="**/Thumbs.db" />
+ </target>
+
+
+ <!--=======================================================================
+ cobertura
+
+ Runs tests in an instrumented environment and produces Cobertura test coverage reports
+ ====================================================================-->
+ <target name="cobertura"
+ description="Runs tests in an instrumented environment and produces Cobertura test coverage reports"
+ depends="clean-cobertura,install-cobertura,compile,compile-tests,cobertura.instrument-classes,cobertura.test-instrumented,cobertura.xml-report,cobertura.html-report" />
+
+
+ <!--=======================================================================
+ cobertura.instrument-classes
+
+ Instruments the application classes used by Cobertura during cobertura.test-instrumented
+ ====================================================================-->
+ <target name="cobertura.instrument-classes" depends="cobertura.clean-instrumented-classes,install-cobertura,compile">
+ <cobertura-instrument todir="${instrumented.classes.dir}" datafile="${cobertura.data.dir}/cobertura.ser">
+ <ignore regex="org.apache.log4j.*" />
+ <fileset dir="${classes.dir}">
+ <!--
+ Instrument all the application classes, but
+ don't instrument the test classes.
+ -->
+ <include name="**/*.class" />
+ <exclude name="**/*Test.class" />
+ </fileset>
+
+ </cobertura-instrument>
+ </target>
+
+
+
+ <!--=======================================================================
+ install-cobertura
+
+ Downloads and installs Cobertura ant tasks
+ ====================================================================-->
+ <target name="install-cobertura" depends="install-ivy">
+ <taskdef-with-ivy organisation="net.sourceforge.cobertura" module="cobertura" revision="1.9.4.1" resource="tasks.properties" classname="net.sourceforge.cobertura.ant.InstrumentTask"/>
+ </target>
+
+
+ <!--=======================================================================
+ clean-cobertura
+
+ Removes all files created by Cobertura code coverage utility
+ ====================================================================-->
+ <target name="clean-cobertura" depends="cobertura.clean-instrumented-classes,cobertura.clean-coverage-reports">
+ <delete dir="${cobertura.data.dir}" />
+ </target>
+
+ <!--=======================================================================
+ clean-sonar
+
+ Removes the temporary file location for sonar files
+ ====================================================================-->
+ <target name="clean-sonar">
+ <delete dir="${basedir}/.sonar" />
+ </target>
+
+
+ <!--=======================================================================
+ cobertura.clean-instrumented-classes
+
+ Remove the instrumented classes used by Cobertura
+ ====================================================================-->
+ <target name="cobertura.clean-instrumented-classes">
+ <delete dir="${instrumented.classes.dir}" />
+ </target>
+
+
+ <!--=======================================================================
+ cobertura.clean-coverage-reports
+
+ Remove all xml and html Cobertura coverage reports
+ ====================================================================-->
+ <target name="cobertura.clean-coverage-reports">
+ <delete dir="${coberturareports.xml.dir}" />
+ <delete dir="${coberturareports.html.dir}" />
+ <delete dir="${coberturareports.dir}" />
+ </target>
+
+
+ <!--=======================================================================
+ cobertura.test-instrumented
+
+ Runs tests against instrumented classes and generates xml and html JUnit test reports
+ ====================================================================-->
+ <target name="cobertura.test-instrumented"
+ depends="init-test-reports,install-cobertura,compile,compile-tests,cobertura.instrument-classes">
+ <mkdir dir="${instrumented.classes.dir}" />
+ <path id="cobertura.classpath">
+ <fileset dir="${subfloor.resources.dir}/cobertura">
+ <include name="*.jar" />
+ </fileset>
+ </path>
+ <junit fork="yes"
+ maxmemory="${junit.maxmemory}"
+ failureProperty="test.failed"
+ haltonfailure="${junit.haltonfailure}">
+ <sysproperty key="java.awt.headless" value="${headless.unittest}" />
+
+ <!-- Specify the name of the coverage data file to use. -->
+ <sysproperty key="net.sourceforge.cobertura.datafile" file="${cobertura.data.dir}/cobertura.ser" />
+
+ <syspropertyset>
+ <propertyref prefix="junit.sysprop." />
+ <mapper type="glob" from="junit.sysprop.*" to="*"/>
+ </syspropertyset>
+
+ <!--
+ Note the classpath order: instrumented classes are before the
+ original (uninstrumented) classes. This is important.
+ -->
+ <classpath location="${instrumented.classes.dir}" />
+ <classpath location="${classes.dir}" />
+ <classpath location="${testclasses.dir}" />
+ <classpath refid="test.classpath" />
+ <classpath refid="cobertura.classpath" />
+
+ <formatter type="xml" />
+ <test name="${testcase}" todir="${testreports.xml.dir}" if="testcase" />
+ <batchtest todir="${testreports.xml.dir}" unless="testcase">
+ <fileset dir="${testsrc.dir}" casesensitive="yes">
+ <include name="**/*Test.java" />
+ </fileset>
+ </batchtest>
+ </junit>
+
+ <junitreport todir="${testreports.html.dir}">
+ <fileset dir="${testreports.xml.dir}">
+ <include name="TEST-*.xml" />
+ </fileset>
+ <report format="frames" todir="${testreports.html.dir}" />
+ </junitreport>
+ </target>
+
+
+ <!--=======================================================================
+ cobertura.xml-report
+
+ Produces machine-readable xml Cobertura coverage report from results of instrumented tests
+ ====================================================================-->
+ <target name="cobertura.xml-report" depends="cobertura.test-instrumented">
+ <cobertura-report destdir="${coberturareports.xml.dir}" datafile="${cobertura.data.dir}/cobertura.ser" format="xml">
+ <fileset dir="${src.dir}">
+ <include name="**/*.java" />
+ </fileset>
+ </cobertura-report>
+ </target>
+
+
+ <!--=======================================================================
+ cobertura.html-report
+
+ Produces human-readable html Cobertura coverage report from results of instrumented tests
+ ====================================================================-->
+ <target name="cobertura.html-report" depends="cobertura.test-instrumented">
+ <cobertura-report destdir="${coberturareports.html.dir}"
+ datafile="${cobertura.data.dir}/cobertura.ser"
+ format="html">
+ <fileset dir="${src.dir}">
+ <include name="**/*.java" />
+ </fileset>
+ </cobertura-report>
+ </target>
+
+ <!--=======================================================================
+ install-pentaho-ant-tasks
+
+ Fetches and installs Pentaho Ant tasks
+ ====================================================================-->
+ <target name="install-pentaho-ant-tasks" depends="install-ivy">
+ <taskdef-with-ivy task-name="dot-classpath" classname="org.pentaho.anttasks.DotClasspath" organisation="pentaho" module="pentaho-ant-tasks" revision="1.1" />
+ </target>
+
+ <!--=======================================================================
+ create-dot-classpath
+
+ Creates the Eclipse .classpath file from the resolved
+ classpath from Ant.
+ ====================================================================-->
+ <target name="create-dot-classpath" depends="install-pentaho-ant-tasks,init">
+ <dot-classpath>
+ <!-- Include all lib dirs -->
+ <classpath>
+ <fileset dir="${lib.dir}">
+ <include name="*.jar" />
+ </fileset>
+ <fileset dir="${devlib.dir}">
+ <include name="*.jar" />
+ </fileset>
+ <fileset dir="${testlib.dir}">
+ <include name="*.jar" />
+ </fileset>
+ </classpath>
+ </dot-classpath>
+ </target>
+
+
+ <!--=======================================================================
+ MACRO: taskdef-with-ivy
+ Downloads (using IVY) and defines new Ant tasks
+
+ NOTE: any task using this macro must depend on "install-antcontrib"
+
+ parameters:
+ task-name - Name to give the new Ant task (only used if resource is not set)
+ organisation - Artifact organization (for artifact resolution with IVY)
+ module - Artifact module (for artifact resolution with IVY)
+ revision - Artifact revision (for artifact resolution with IVY)
+ classname - Classname for the Ant task. Used during taskdef and to check
+ if we already have the libraries
+ resource - (optional) Resource defining the Ant task. Used during taskdef
+ ====================================================================-->
+ <macrodef name="taskdef-with-ivy">
+ <attribute name="task-name"
+ description="Name to give the new Ant task (only used if resource is not set)"
+ default="unset" />
+ <attribute name="organisation" description="Artifact organization" />
+ <attribute name="module" description="Artifact module" />
+ <attribute name="revision" description="Artifact revision" />
+ <attribute name="classname"
+ description="Classname for the Ant task. Used during taskdef and to check if we already have the libraries." />
+ <attribute name="resource"
+ description="(optional) Resource defining the Ant task. Used during taskdef"
+ default="unset" />
+ <sequential>
+ <mkdir dir="${subfloor.resources.dir}/@{module}-@{revision}/" />
+ <!-- if the library does not exist, we must download it -->
+ <if>
+ <not>
+ <and>
+ <available file="${subfloor.resources.dir}/@{module}-@{revision}" />
+ <available classname="@{classname}">
+ <classpath>
+ <fileset dir="${subfloor.resources.dir}/@{module}-@{revision}">
+ <include name="*.jar" />
+ </fileset>
+ </classpath>
+ </available>
+ </and>
+ </not>
+ <then>
+ <ivy:retrieve inline="true"
+ conf="default"
+ organisation="@{organisation}"
+ module="@{module}"
+ revision="@{revision}"
+ pattern="${subfloor.resources.dir}/@{module}-@{revision}/[module]-__-[revision](-[classifier]).[ext]" />
+ <!-- in case the artifact pulls in an ant jar, remove it. they cause runtime conflicts -->
+ <delete>
+ <fileset dir="${subfloor.resources.dir}/@{module}-@{revision}">
+ <include name="ant-__-*.jar" />
+ <include name="ant-launcher-__-*.jar" />
+ </fileset>
+ </delete>
+ </then>
+ </if>
+ <path id="taskdef.classpath">
+ <fileset dir="${subfloor.resources.dir}/@{module}-@{revision}">
+ <include name="*.jar" />
+ </fileset>
+ </path>
+ <if>
+ <equals arg1="@{resource}" arg2="unset" />
+ <then>
+ <taskdef classpathref="taskdef.classpath" name="@{task-name}" classname="@{classname}" />
+ </then>
+ <else>
+ <taskdef classpathref="taskdef.classpath" resource="@{resource}" />
+ </else>
+ </if>
+ </sequential>
+ </macrodef>
+
+
+ <!--=======================================================================
+ Macro which will download the specified library.
+
+ NOTE: any task using this macro must depend on "install-antcontrib"
+
+ parameters:
+ name - The name of the library (the filename w/o extension)
+ url - The URL from which the library will be downloaded
+ resource - The name of the resource which should be loaded
+ as a task definition
+ classname - A class file name which can be used to detect if the
+ property library exists
+ extension - The extension of the library being downloaded
+ (defaults to zip)
+ ====================================================================-->
+ <macrodef name="download-antlib">
+ <attribute name="name" />
+ <attribute name="url" />
+ <attribute name="classname" />
+ <attribute name="extension" default="zip" />
+ <sequential>
+ <mkdir dir="${subfloor.resources.dir}/@{name}/" />
+ <!-- if the library does not exist, we must download it -->
+ <if>
+ <not>
+ <and>
+ <available file="${subfloor.resources.dir}/@{name}" />
+ <available classname="@{classname}">
+ <classpath>
+ <fileset dir="${subfloor.resources.dir}/@{name}">
+ <include name="**/*.jar" />
+ </fileset>
+ </classpath>
+ </available>
+ </and>
+ </not>
+ <then>
+ <!-- if it is a zip file, unzip it ... otherwise if a jar, just download it -->
+ <if>
+ <equals arg1="zip" arg2="@{extension}" />
+ <then>
+ <!-- download the source file to a temp directory -->
+ <echo message="downloading library @{name} [@{name}.@{extension} from @{url}]" />
+ <mkdir dir="${subfloor.tmp.dir}" />
+ <get src="@{url}" dest="${subfloor.tmp.dir}/@{name}.@{extension}" usetimestamp="true" />
+ <unzip src="${subfloor.tmp.dir}/@{name}.@{extension}"
+ dest="${subfloor.resources.dir}/@{name}"
+ overwrite="true" />
+ </then>
+ <else>
+ <get src="@{url}" dest="${subfloor.resources.dir}/@{name}/@{name}.@{extension}" usetimestamp="true" />
+ </else>
+ </if>
+ </then>
+ </if>
+ </sequential>
+ </macrodef>
+
+ <!--=======================================================================
+ install-tattletale
+
+ (Fetches and) installs TATTLETALE for use by this ant script
+ ====================================================================-->
+ <target name="install-tattletale" depends="install-antcontrib">
+ <if>
+ <istrue value="${tattletale.isinstalled}" />
+ <then>
+ <echo message="Skipping TATTLETALE install. TATTLETALE has already been configured by the build" />
+ </then>
+ <else>
+ <download-antlib name="tattletale"
+ url="${tattletale.url}"
+ classname="${tattletale.classname}"
+ extension="zip"/>
+
+ <taskdef name="tattletale.report" classname="${tattletale.classname}">
+ <classpath>
+ <fileset dir="${subfloor.resources.dir}/tattletale">
+ <include name="*.jar" />
+ </fileset>
+ </classpath>
+ </taskdef>
+
+ <property name="tattletale.isinstalled" value="true" />
+ </else>
+ </if>
+ </target>
+
+ <!--=======================================================================
+ tattletale-report
+
+ Generates a tattletale report for this project
+ ====================================================================-->
+ <target name="tattletale-report" depends="install-tattletale,jar">
+ <tattletale.report source="${basedir}" destination="${tattletale.reports.dir}"/>
+ </target>
+
+<!--=======================================================================
+ install-sonar
+
+ (Fetches and) installs SONAR ant plugin for use by this ant script
+ ====================================================================-->
+ <target name="install-sonar" depends="install-antcontrib">
+ <if>
+ <istrue value="${sonar.isinstalled}" />
+ <then>
+ <echo message="Skipping SONAR install. SONAR has already been configured by the build" />
+ </then>
+ <else>
+ <download-antlib name="sonar"
+ url="${sonar.url}"
+ classname="${sonar.classname}"
+ extension="jar"/>
+
+ <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
+ <classpath>
+ <fileset dir="${subfloor.resources.dir}/sonar">
+ <include name="*.jar" />
+ </fileset>
+ </classpath>
+ </taskdef>
+
+ <property name="sonar.isinstalled" value="true" />
+ </else>
+ </if>
+ </target>
+
+ <!--=======================================================================
+ sonar
+
+ Execute the sonar analysis and publish to a sonar server specified by:
+ sonar.jdbc.url
+ sonar.jdbc.driverClassName
+ sonar.jdbc.username
+ sonar.jdbc.password
+ sonar.host.url
+ ====================================================================-->
+ <target name="sonar" depends="install-sonar, compile, test, cobertura">
+ <property name="sonar.sources" value="${src.dir}" />
+ <property name="sonar.binaries" value="${classes.dir}" />
+ <property name="sonar.tests" value="${testsrc.dir}" />
+ <property name="sonar.libraries" value="${lib.dir}" />
+
+ <property name="sonar.dynamicAnalysis" value="reuseReports" />
+ <property name="sonar.cobertura.reportPath" value="${coberturareports.xml.dir}/coverage.xml" />
+ <property name="sonar.surefire.reportsPath" value="${testreports.xml.dir}" />
+
+ <sonar:sonar key="${ivy.artifact.group}:${ivy.artifact.id}" version="${project.revision}" xmlns:sonar="antlib:org.sonar.ant"/>
+ </target>
+
+</project>
7 build.properties
@@ -0,0 +1,7 @@
+project.revision=4.6-SNAPSHOT
+ivy.artifact.group=pentaho
+ivy.artifact.id=pentaho-bi-platform-engine-security-multipleuserrole
+impl.vendor=Webdetails
+impl.title=Pentaho Platform Engine Security MultipleUserRole bean
+impl.productID=POBS
+dependency.pentaho-connections.revision=TRUNK-SNAPSHOT
29 build.xml
@@ -0,0 +1,29 @@
+<!--===========================================================================
+ This is the build file for the Pentaho BI Platform Engine Secutiry project.
+
+ This build file will use the common_build.xml file as the default build
+ process and should only override the tasks that need to differ from
+ the common build file.
+
+ See common_build.xml for more details
+============================================================================-->
+<project name="Engine Security" basedir="." default="default"
+ xmlns:ivy="antlib:org.apache.ivy.ant" >
+
+ <description>
+ This build file is used to create the Engine Security project
+ and works with the common_build.xml file.
+ </description>
+
+ <!-- Import the common_build.xml file which contains all the default tasks -->
+ <import file="build-res/subfloor.xml"/>
+
+
+ <!--
+ AS STATED ABOVE, THE ONLY TASKS THAT SHOULD EXIST IN THIS BUILD FILE ARE
+ THE TASKS THAT NEED TO DIFFER FROM THE DEFAULT IMPLEMENTATION OF THE TASKS
+ FOUND IN common_build.xml.
+ -->
+
+
+</project>
339 gpl-2.0.txt
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+