Bug 19006 - Better support of the 'path' element, in particular in the 'fileset' element'
Summary: Better support of the 'path' element, in particular in the 'fileset' element'
Status: RESOLVED FIXED
Alias: None
Product: Ant
Classification: Unclassified
Component: Core tasks (show other bugs)
Version: 1.5.3
Hardware: All All
: P3 enhancement (vote)
Target Milestone: 1.7.0
Assignee: Ant Notifications List
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2003-04-14 17:14 UTC by Christophe FOUQUE
Modified: 2008-02-22 12:18 UTC (History)
0 users



Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Christophe FOUQUE 2003-04-14 17:14:36 UTC
By now, most ANT tasks, elements and attributes (for example 'fileset' and 
'webxml') are used easily only if all files to process are in the same 
'WorkArea'.

But for big projects, the fact that each developper has all files in its own 
'WorkArea' has drawbacks :
-  Each WorkArea contains too many files (several thousands) to be correcly 
managed by a human being.
-  Whenever a developper modifies the interface of a low level API, he has to 
deliver it to all other developpers, and this manual delivery process NEVER 
works correctly.

So we use following concepts and methods :
-  At one time, the project manager creates a 'Baseline', which is a 'WorkArea' 
corresponding to a project version, containing a coherent set of versions of all 
files, builds it with classpath=Baseline, the publishes it read-only for all 
developpers.
-  Each developper then creates his own 'WorkArea' pointing to the common 
'Baseline' :
   -  At the beginning, the WorkArea contains only empty folders, but NO file.
   -  The developper puts in his WorkArea only NEW and MODIFIED files.
   -  For compilation, the classpath is 'WorkArea;Baseline'.
-  That permits all developpers to easily handle a sparse WorkArea with a 
limited number of files, and automatically use the SAME low level APIs delived 
in the Baseline.

When needed, the project manager can also create an 'Incremental Baseline' by 
building it as a WorkArea pointing to an existing 'Baseline', then publishing it 
read-only.
Each developer can then create his own new WorkArea pointing to the incremental 
Baseline, and the classpath is then 'WorkArea;Incremental Baseline;Full 
Baseline'.

We also sometimes use more than 3 levels.

So, the (class)path to search for files can be any one of these ones:
1)  'WorkArea'
2)  'WorkArea:Full Baseline'
3)  'WorkArea;Incremental Baseline;Full Baseline
4)  ...

In my wrapper script (written in perl), I follow the 'WorkArea' to 'Baseline' 
links to get the full PATH, and I call ant with the corresponding options :
1)  '-Dbasedir=WorkArea'
2)  '-Dbasedir=WorkArea'  '-Dsp1=Full Baseline'
3)  '-Dbasedir=WorkArea'  '-Dsp1=Incremental Baseline'  '-Dsp2=Full Baseline'
4)  ...

So ANT is aware of the full PATH.

But this is NOT easily handled in the 'build.xml' file, mainly because the 
'fileset' element requires an EXISTING 'dir' attribute.

So, if I want to manage n levels of WorkArea, I have to n-plicate each task, 
with 'if' and 'unless' attributes (see example with 3 levels at the bottom).


Below are my enhancement requests, that I hope can be implemented in ANT 1.6 :

A)  fileset
-----------
My main enhancement request is that the 'fileset' element accepts the 'path' and 
'pathref' attributes similar respectively to the 'classpath' and 'classpathref' 
attributes of the 'javac' task.

B)  war
-------
Similarly, the 'war' task should accept the 'webxmlpath' and 'webxmlpathref' 
attributes to search for the file specified by the 'webxml' attribute.

C)  property
------------
Similarly, when the 'location' attribute is specified and the value of 
'location' is NOT an absolute path, the 'property' element should accept the 
'path' and 'pathref' attributes to search for the file specified by the 
'location' attribute there, and NOT in the project's 'basedir'.

D)  fileset
-----------
When the 'dir' attribute is specified, the 'fileset' element should accept the 
'mandatory' attribute, with default value 'true'.  When its value is 'false', 
the task should NOT fail, but the 'fileset' element should be simply ignored.



<?xml version="1.0" encoding="UTF-8"?>


<project  name="exampleWar"  default="exampleWar">
  
  
  <description>ANT build file for example.war</description>
  
  
  <!--
      Verify that the destination folder exists.
      Define the destination file.
   -->
  <target  name="init">     
    
    <echo  level="verbose"  message="Project Name = ${ant.project.name}"/>
  
    <!-- Create the time stamp -->
    <tstamp/>
  
    <property   name="webapps"        value="tomcat/webapps"/>
    <available  property="webappsOK"  type="dir"  file="${webapps}"/>
    <fail  unless="webappsOK"
           message=" *****  Folder  '${webapps}'  NOT found  *****"/>
    <echo  level="verbose"  message="webapps      = ${webapps}"/>
    <property   name="destfile"    location="${webapps}/example.war"/>
    <echo  level="verbose"  message="destfile     = ${destfile}"/>
    
  </target>
  
  
  <!--
      -  Verify that the source folders of the WorkArea exist.
      -  Each path includes only a folder of the Workarea.
   -->
  <target  name="pathBasedir"  depends="init"  if="basedir">
    
    <property       name="config"    location="config"/>
    <available  property="configOK"  type="dir"  file="${config}"/>
    <fail  unless="configOK"
           message=" *****  Folder  '${config}'  NOT found  *****"/>
    <echo  level="verbose"  message="config     = ${config}"/>
    
    <property       name="appli"    location="${webapps}/myAppli"/>
    <available  property="appliOK"  type="dir"  file="${appli}"/>
    <fail  unless="appliOK"
           message=" *****  Folder  '${appli}'  NOT found  *****"/>
    <echo  level="verbose"  message="appli      = ${appli}"/>
    
    <path  id="configPath">
      <pathelement  location="${config}"/>
    </path>       
    
  </target>
  
  
  <!--
      Search 'WEB-INF/web.xml' in the Workarea.
   -->
  <target  name="webXmlBasedir"  if="basedir"
           depends="pathBasedir">
    
    <available  property="web.xml"  type="file"
                    file="${appli}/WEB-INF/web.xml"
                   value="${appli}/WEB-INF/web.xml"/>
    
  </target>
  
  
  <!--
      If the WorkArea points to a Baseline :
      -  Verify that the source folders of the Baseline exist.
      -  Each path includes a folder of the Workarea and the corresponding
         folder of the Baseline.
   -->
  <target  name="pathSp1"  depends="init"  if="sp1">
       
    <property       name="config1"    location="${sp1}/config"/>
    <available  property="config1OK"  type="dir"  file="${config1}"/>
    <fail  unless="config1OK"
           message=" *****  Folder  '${config1}'  NOT found  *****"/>
    <echo  level="verbose"  message="config1     = ${config1}"/>
    
    <property       name="appli1"  location="${sp1}/${webapps}/myAppli"/>
    <available  property="appli1OK"  type="dir"  file="${appli1}"/>
    <fail  unless="appli1OK"
           message=" *****  Folder  '${appli1}'  NOT found  *****"/>
    <echo  level="verbose"  message="appli1      = ${appli1}"/>
    
    <path  id="configPath">
      <pathelement  location="${config}"/>
      <pathelement  location="${config1}"/>
    </path>       
    
  </target>
  
  
  <!--
      If the WorkArea points to a Baseline and 'WEB-INF/web.xml'
      was NOT found in the WorkArea, search it in the Baseline.
   -->
  <target  name="webXmlSp1"  if="sp1"  unless="web.xml"
           depends="webXmlBasedir,pathSp1">
    
    <available  property="web.xml"  type="file"
                    file="${appli1}/WEB-INF/web.xml"
                   value="${appli1}/WEB-INF/web.xml"/>
    
  </target>
  
  
  <!--
      If the pointed Baseline points to another Baseline :
      -  Verify that the source folders of the other Baseline exist.
      -  Each path includes a folder of the Workarea and the corresponding
         folder of both Baselines.
   -->
  <target  name="pathSp2"  depends="init"  if="sp2">
       
    <property       name="config2"    location="${sp2}/config"/>
    <available  property="config2OK"  type="dir"  file="${config2}"/>
    <fail  unless="config2OK"
           message=" *****  Folder  '${config2}'  NOT found  *****"/>
    <echo  level="verbose"  message="config2     = ${config2}"/>
    
    <property       name="appli2"  location="${sp2}/${webapps}/myAppli"/>
    <available  property="appli2OK"  type="dir"  file="${appli2}"/>
    <fail  unless="appli2OK"
           message=" *****  Folder  '${appli2}'  NOT found  *****"/>
    <echo  level="verbose"  message="appli2      = ${appli2}"/>
    
    <path  id="configPath">
      <pathelement  location="${config}"/>
      <pathelement  location="${config1}"/>
      <pathelement  location="${config2}"/>
    </path>       
    
  </target>
  
  
  <!--
      If the pointed Baseline points to another Baseline and
      'WEB-INF/web.xml' was NOT found in the WorkArea or in the
      Baseline, search it in the other Baseline.
   -->
  <target  name="webXmlSp2"  if="sp2"  unless="web.xml"
           depends="webXmlBasedir,webXmlSp1,pathSp2">
    
    <available  property="web.xml"  type="file"
                 file="${appli2}/WEB-INF/web.xml"
                value="${appli2}/WEB-INF/web.xml"/>
    
  </target>
  
  
  <!--
      Verify that 'WEB-INF/web.xml', each required Java library and
      properties file exists in its precise folder
   -->
  <target  name="verifyFiles"
           depends="  pathBasedir,   pathSp1,   pathSp2,
                    webXmlBasedir, webXmlSp1, webXmlSp2">
    
    <fail  unless="web.xml"
           message=" *****  'web.xml' not found  *****"/>
    <echo  level="verbose"  message="web.xml = ${web.xml}"/>
    
    <available  property="client.properties"  file="client.properties">
      <filepath refid="configPath"/>
    </available>
    <fail  unless="client.properties"
           message=" *****  'client.properties' not found  *****"/>
    
  </target>
  
  
  <!--
      If the WorkArea does NOT point to a Baseline :
      Generation of the 'war' file from the WorkArea only
   -->
  <target  name="exampleBaseDir"  unless="sp1"
           depends="verifyFiles">
    
    <war  destfile="${destfile}"  duplicate="preserve"
          webxml="${web.xml}">
      <zipfileset  filemode="644"  prefix="WEB-INF"  dir="${config}">
        <include  name="client.properties"/>
      </zipfileset>
    </war>
    
  </target>
  
  
  <!--
      If the WorkArea points to a Baseline :
      Generation of the 'war' file from the WorkArea and the pointed Baseline
   -->
  <target  name="exampleSp1"  if="sp1"  unless="sp2"
           depends="verifyFiles">
    
    <war  destfile="${destfile}"  duplicate="preserve"
          webxml="${web.xml}">
      <zipfileset  filemode="644"  prefix="WEB-INF"  dir="${config}">
        <include  name="client.properties"/>
      </zipfileset>
      <zipfileset  filemode="644"  prefix="WEB-INF"  dir="${config1}">
        <include  name="client.properties"/>
      </zipfileset>
    </war>
    
  </target>
  
  
  <!--
      If the pointed Baseline points to another Baseline :
      Generation of the 'war' file from the WorkArea and both Baselines
   -->
  <target  name="exampleSp2"  if="sp2"
           depends="verifyFiles">
    
    <war  destfile="${destfile}"  duplicate="preserve"
          webxml="${web.xml}">
      
      <zipfileset  prefix="WEB-INF"  dir="${config}">
        <include  name="client.properties"/>
      </zipfileset>
      <zipfileset  prefix="WEB-INF"  dir="${config1}">
        <include  name="client.properties"/>
      </zipfileset>
      <zipfileset  prefix="WEB-INF"  dir="${config2}">
        <include  name="client.properties"/>
      </zipfileset>
    </war>
    
  </target>
  
  
  <!--
      Generation of the 'war' file
   -->
  <target  name="exampleWar"  depends="exampleBaseDir,
                                       exampleSp1,
                                       exampleSp2"/>
  
  
  <!--
      Deletion of the 'war' file
   -->
  <target  name="clean">
    <delete  file="${destfile}"/>
  </target>
  
  
</project>
Comment 1 Matt Benson 2005-05-26 19:20:55 UTC
ping, I have a feeling noone ever really understood this bug.  Perhaps your
outlook has changed in such a way as to more concisely explain the problem, or
this has become a non-issue with some workaround?

Thanks
Comment 2 Matt Benson 2006-06-27 21:17:12 UTC
Hmm, maybe I do understand what this bug was after:  fileset to contain paths. 
That runs counter to fileset's intent, but with 1.7 resource collection support
paths can be used pretty much anywhere filesets can (in core anyway).  So I will
call this fixed considering that this bug has stayed in NEEDINFO for a year plus.