4bd0f7ab9170958dbc22e18873a6ec4233c52aa6
[java-idp.git] / custom / extension-build.xml
1 <!-- 
2   This file is imported in to the main Shibboleth build.xml file and 
3   contains all targets used for building IdP and SP extensions.  These
4   targets are not designed to be called by anything other than the main
5   Shibboleth build file.
6   
7   Chad La Joie
8   July 25, 2005
9 -->
10 <project name="Shibboleth-Extensions" default="ext-invoke" basedir=".">
11
12     <path id="ext.path">
13         <!-- Shibboleth Libraries -->
14         <path refid="build.path" />
15
16         <!-- Shibboleth Classes -->
17         <pathelement location="${build}" />
18
19         <!-- Extension libraries -->
20         <fileset dir="${ext.lib}">
21             <include name="**/*.jar" />
22         </fileset>
23
24         <!-- Extension classes -->
25         <pathelement location="${ext.classes}" />
26         
27         <!-- Extension test classes -->
28         <pathelement location="${ext.test.classes}" />
29     </path>
30
31     <!-- Loops through all the extension directories and executes a particular operation on them -->
32     <target name="ext-invoke" description="Invoke operation extensions">
33         <for keepgoing="true" param="module-path">
34             <dirset dir="${exts.dir}">
35                 <include name="*" />
36                 <exclude name="lib" />
37                 <exclude name="web" />
38             </dirset>
39             <sequential>
40                 <antcall target="${ext.build.function}">
41                     <param name="ext.root" value="@{module-path}" />
42                 </antcall>
43             </sequential>
44         </for>
45     </target>
46
47     <!-- Builds a single extension -->
48     <target name="ext-build" depends="ext-build-init" description="Builds the extension">
49         <echo message="--- Starting to build module ${ext.name} in ${ext.root}" />
50
51         <!-- Compile the source -->
52         <antcall target="ext-compile" />
53
54         <!-- Generate Javadocs -->
55         <antcall target="ext-gen-docs" />
56
57         <!-- Copy over non-source files -->
58         <antcall target="ext-copy-src-conf" />
59
60         <!-- Run unit tests if we're supposed to -->
61         <antcall target="ext-test" />
62
63         <!-- Put the libraries where the IdP and SP packaging can pick them up -->
64         <antcall target="ext-copy-libs" />
65
66         <!-- Put the webpages where the IdP and SP packaging can pick them up -->
67         <antcall target="ext-copy-webpages" />
68
69         <echo message="--- Extension ${ext.name} built" />
70     </target>
71
72     <target name="ext-load-properties" description="Loads property files needed by build process">
73         <!-- Load extension specific properties. -->
74         <if>
75             <not>
76                 <available file="${ext.root}/build.properties" />
77             </not>
78             <then>
79                 <fail message="No build.properties file found for extension in ${ext.root}; this file is required." />
80             </then>
81         </if>
82         <property file="${ext.root}/build.properties" />
83
84         <!-- Load default properties -->
85         <property file="${exts.dir}/extension-build.properties" />
86
87         <fail unless="ext.name" message="The extension ${ext.root} does not contain the required (ext.name) property in its build.properties file." />
88     </target>
89
90     <!-- Initialize everything we need. -->
91     <!-- The properties loaded here are scoped to this particular extension build -->
92     <target name="ext-build-init" depends="ext-load-properties" description="Sets up everything to prepare for the build">
93
94         <!-- Create needed directories -->
95         <mkdir dir="${ext.dist}" />
96         <mkdir dir="${ext.build}" />
97         <mkdir dir="${ext.classes}" />
98         <mkdir dir="${ext.test.classes}" />
99         <mkdir dir="${ext.docs}" />
100     </target>
101
102     <!-- Compiles the extension -->
103     <target name="ext-compile" description="Compiles an extension">
104         <!-- Compile any source that might be out there -->
105         <if>
106             <available file="${ext.src}" />
107             <then>
108                 <echo message="Compiling extension source" />
109                 <javac srcdir="${ext.src}"
110                        destdir="${ext.classes}"
111                        classpathref="ext.path"
112                        includes="**/*.java"
113                        debug="on"
114                        source="1.4"
115                        deprecation="true"/>
116             </then>
117         </if>
118     </target>
119
120     <!-- Copies files from etc directory to dist directory to be bundled with extension jar -->
121     <target name="ext-copy-src-conf" description="Copys non-source files to place where they will be added to jar">
122         <!-- Copy any extra stuff that needs to be on the classpath -->
123         <if>
124             <available file="${ext.src.conf}" />
125             <then>
126                 <echo message="Detected files in the extensions 'src-conf' directory, ensuring they are bundled with the extension's jar." />
127                 <copy todir="${ext.classes}">
128                     <fileset dir="${ext.src.conf}">
129                         <include name="**" />
130                     </fileset>
131                 </copy>
132             </then>
133         </if>
134     </target>
135
136     <!-- Move third party libraries to be picked up by the war -->
137     <target name="ext-copy-libs" description="Moves third party libraries to be picked up by the war">
138         <if>
139             <available file="${ext.lib}" />
140             <then>
141                 <copy todir="${exts.dir}/lib">
142                     <fileset dir="${ext.lib}" includes="*.jar" />
143                 </copy>
144             </then>
145         </if>
146     </target>
147
148     <!-- Move web resources to be picked up by the war -->
149     <target name="ext-copy-webpages" description="Moves web resources to be picked up by the war">
150         <if>
151             <available file="${ext.webpages}" />
152             <then>
153                 <copy todir="${exts.dir}/web">
154                     <fileset dir="${ext.webpages}" />
155                 </copy>
156             </then>
157         </if>
158     </target>
159
160
161     <!-- Run any unit tests for the extension -->
162     <target name="ext-test" description="Runs extension unit test">
163         <if>
164             <equals arg1="${test.ext}" arg2="true" />
165             <then>
166                 <if>
167                     <available file="${ext.test.src}" />
168                     <then>
169                         <echo message="Compiling extension test source" />
170                         <javac srcdir="${ext.test.src}"
171                                destdir="${ext.test.classes}"
172                                classpathref="ext.path"
173                                includes="**/*.java"
174                                debug="on"
175                                source="1.4"
176                                deprecation="true"/>
177
178                         <echo message="Running tests cases for extension ${ext.name}" />
179                         <junit printsummary="no" fork="yes" haltonerror="true" haltonfailure="true" dir="${ext.root}">
180                             <jvmarg value="-Djava.endorsed.dirs=${endorsed}" />
181                             <classpath refid="ext.path"/>
182                             <formatter type="plain" />
183                             <batchtest todir="${ext.root}">
184                                 <fileset dir="${ext.test.classes}" />
185                             </batchtest>
186                         </junit>
187                     </then>
188                 </if>
189             </then>
190         </if>
191     </target>
192
193     <!-- Generates the Javadocs for the extension -->
194     <target name="ext-gen-docs" description="Generates Javadocs for extension">
195         <if>
196             <equals arg1="${gen.ext.docs}" arg2="true" />
197             <then>
198                 <if>
199                     <available file="${ext.src}" />
200                     <then>
201                         <echo message="Generating javadocs for extension ${ext.name}" />
202                         <javadoc sourcepath="${ext.src}" destdir="${ext.docs}" packagenames="*" author="true" version="true" windowtitle="${ext.name} Shibboleth Extension Java API" doctitle="${ext.name} Shibboleth Extension Java API" failonerror="false">
203                             <classpath refid="build.path" />
204                             <link href="http://java.sun.com/j2se/1.5.0/docs/api/" />
205                         </javadoc>
206                     </then>
207                 </if>
208             </then>
209         </if>
210     </target>
211
212     <!-- Jars up the extension -->
213     <!-- 
214         Required parameters
215             exts.dir - the root directory of the extensions (contains all the individual extension directories)
216             ext.filesystem.home - the path on the filesystem that the extension will be installed
217                 expected subdirectories are 'bin, 'etc', and 'lib'
218             ext.home.token - the token, in config files, to replace with the path to the IdP/SP home
219     -->
220     <target name="ext-package" depends="ext-load-properties" description="Packages up the extension">
221         <if>
222             <available file="${ext.classes}" />
223             <then>
224                 <replace dir="${ext.classes}" token="${ext.home.token}" value="${ext.filesystem.home}" excludes="*.class" />
225                 <replace dir="${ext.classes}" token="$EXTENSION_NAME$" value="${ext.name}" excludes="*.class" />
226                 <jar jarfile="${ext.dist}/${ext.name}.jar" basedir="${ext.classes}" update="false" />
227                 <copy file="${ext.dist}/${ext.name}.jar" todir="${exts.dir}/lib" />
228                 <delete dir="${ext.classes}" />
229             </then>
230         </if>
231     </target>
232
233     <!-- Install extension files (configuration, scripts, etc) on to the filesystem -->
234     <!--
235         Required Paramter
236             ext.filesystem.home - the path on the filesystem that the extension will be installed
237                 expected subdirectories are 'bin, 'etc', and 'lib'
238             ext.home.token - the token that represents the extensions installation point within
239                 the various configuration files (those in the extensions 'etc' and 'src-conf' directories)
240     -->
241     <target name="ext-install-filesystem" depends="ext-build-init" description="Installs extension files on to the filesystem">
242         <echo message="Installing extension ${ext.name} to ${ext.filesystem.home}" />
243
244         <!-- Copy anything in the etc directory to the extension's installation point etc directory -->
245         <if>
246             <available file="${ext.etc}" />
247             <then>
248                 <if>
249                     <available file="${ext.filesystem.home}/etc/${ext.name}" />
250                     <then>
251                         <echo>--------------------------------------------------------------------------------------</echo>
252                         <echo>---</echo>
253                         <echo>---   NOTE:  Existing Shibboleth extension module configuration at ${line.separator}---   ${ext.filesystem.home}/etc/${ext.name} will not be overwritten.</echo>
254                         <echo>---</echo>
255                         <echo>--------------------------------------------------------------------------------------</echo>
256                     </then>
257                     <else>
258                         <mkdir dir="${ext.filesystem.home}/etc/${ext.name}" />
259                         <copy todir="${ext.filesystem.home}/etc/${ext.name}">
260                             <fileset dir="${ext.etc}">
261                                 <include name="**" />
262                             </fileset>
263                         </copy>
264                         <replace dir="${ext.filesystem.home}/etc/${ext.name}" token="${ext.home.token}" value="${ext.filesystem.home}" />
265                         <replace dir="${ext.filesystem.home}/etc/${ext.name}" token="$EXTENSION_NAME$" value="${ext.name}" />
266                     </else>
267                 </if>
268             </then>
269         </if>
270
271         <!-- Copy anything in the bin directory to the extension's installation point bin directory -->
272         <if>
273             <available file="${ext.bin}" />
274             <then>
275                 <copy todir="${ext.filesystem.home}/bin">
276                     <fileset dir="${ext.bin}">
277                         <include name="*" />
278                     </fileset>
279                 </copy>
280                 <chmod dir="${ext.filesystem.home}/bin" perm="ug+rx" includes="**/*" />
281             </then>
282         </if>
283
284         <!-- Copy anything in the lib directory to the extension's installation point lib directory -->
285         <if>
286             <available file="${ext.lib}" />
287             <then>
288                 <copy todir="${ext.filesystem.home}/lib">
289                     <fileset dir="${ext.lib}">
290                         <include name="*" />
291                     </fileset>
292                 </copy>
293             </then>
294         </if>
295
296         <!-- Copy the extension jar to the extension's installation point lib directory -->
297         <if>
298             <available file="${ext.dist}/${ext.name}.jar" />
299             <then>
300                 <copy file="${ext.dist}/${ext.name}.jar" todir="${ext.filesystem.home}/lib" />
301             </then>
302         </if>
303     </target>
304
305     <!-- Cleans up classes files -->
306     <target name="ext-clean-build" depends="ext-load-properties" description="Cleans up any build created resources">
307         <delete dir="${ext.build}" failonerror="false" />
308     </target>
309
310     <!-- Cleans up java docs -->
311     <target name="ext-clean-javadocs" depends="ext-load-properties" description="Deletes generated javadocs">
312         <delete dir="${ext.docs}" failonerror="false" />
313     </target>
314
315     <!-- Cleans up distribution files -->
316     <target name="ext-clean-dist" depends="ext-load-properties" description="Deletes distribution generated files">
317         <delete dir="${ext.dist}" failonerror="false" />
318     </target>
319 </project>