antoine 2003/04/18 15:02:59
Modified: docs/manual conceptstypeslist.html docs/manual/CoreTasks zip.html src/main/org/apache/tools/ant/taskdefs Zip.java src/main/org/apache/tools/ant/types ZipFileSet.java defaults.properties Added: src/testcases/org/apache/tools/ant/types ZipFileSetTest.java docs/manual/CoreTypes zipfileset.html Log: allow to define ZipFileSet(s) outside of Zip task bugrep 17007 Revision Changes Path 1.1 ant/src/testcases/org/apache/tools/ant/types/ZipFileSetTest.java Index: ZipFileSetTest.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. 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. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "Ant" and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS 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. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.tools.ant.types; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import junit.framework.TestCase; import junit.framework.AssertionFailedError; import java.io.File; /** * JUnit 3 testcases for org.apache.tools.ant.types.ZipFileSet. * * <p>This doesn't actually test much, mainly reference handling. * * @author Antoine Levy-Lambert */ public class ZipFileSetTest extends AbstractFileSetTest { public ZipFileSetTest(String name) { super(name); } protected AbstractFileSet getInstance() { return new ZipFileSet(); } public final void testAttributes() { ZipFileSet f = (ZipFileSet)getInstance(); //check that dir and src are incompatible f.setSrc(new File("example.zip")); try { f.setDir(new File("examples")); fail("can add dir to " + f.getDataTypeName() + " when a src is already present"); } catch (BuildException be) { assertEquals("Cannot set both dir and src attributes",be.getMessage()); } f = (ZipFileSet)getInstance(); //check that dir and src are incompatible f.setDir(new File("examples")); try { f.setSrc(new File("example.zip")); fail("can add src to " + f.getDataTypeName() + " when a dir is already present"); } catch (BuildException be) { assertEquals("Cannot set both dir and src attributes",be.getMessage()); } //check that fullpath and prefix are incompatible f = (ZipFileSet)getInstance(); f.setSrc(new File("example.zip")); f.setPrefix("/examples"); try { f.setFullpath("/doc/manual/index.html"); fail("Can add fullpath to " + f.getDataTypeName() + " when a prefix is already present"); } catch (BuildException be) { assertEquals("Cannot set both fullpath and prefix attributes", be.getMessage()); } f = (ZipFileSet)getInstance(); f.setSrc(new File("example.zip")); f.setFullpath("/doc/manual/index.html"); try { f.setPrefix("/examples"); fail("Can add prefix to " + f.getDataTypeName() + " when a fullpath is already present"); } catch (BuildException be) { assertEquals("Cannot set both fullpath and prefix attributes", be.getMessage()); } // check that reference zipfilesets cannot have specific attributes f = (ZipFileSet)getInstance(); f.setRefid(new Reference("test")); try { f.setSrc(new File("example.zip")); fail("Can add src to " + f.getDataTypeName() + " when a refid is already present"); } catch (BuildException be) { assertEquals("You must not specify more than one " + "attribute when using refid", be.getMessage()); } // check that a reference zipfileset gets the same attributes as the original f = (ZipFileSet)getInstance(); f.setSrc(new File("example.zip")); f.setPrefix("/examples"); f.setFileMode("600"); f.setDirMode("530"); getProject().addReference("test",f); ZipFileSet zid=(ZipFileSet)getInstance(); zid.setRefid(new Reference("test")); assertTrue("src attribute copied by copy constructor",zid.getSrc(getProject()).equals(f.getSrc(getProject()))); assertTrue("prefix attribute copied by copy constructor",f.getPrefix(getProject()).equals(zid.getPrefix(getProject()))); assertTrue("file mode attribute copied by copy constructor",f.getFileMode(getProject())==zid.getFileMode(getProject())); assertTrue("dir mode attribute copied by copy constructor",f.getDirMode(getProject())==zid.getDirMode(getProject())); } } 1.1 ant/docs/manual/CoreTypes/zipfileset.html Index: zipfileset.html =================================================================== <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Language" content="en-us"> <title>ZipFileSet Type</title> </head> <body> <h2><a name="fileset">ZipFileSet</a></h2> <p>A <code><zipfileset></code> is a special form of a <code><<a href="fileset.html">fileset</a>></code> which can behave in 2 different ways : <br> </p> <ul> <li>When the <span style="font-style: italic;">src</span> attribute is used, the zipfileset is populated with zip entries found in the file <span style="font-style: italic;">src</span>.<br> </li> <li>When the <span style="font-style: italic;">dir</span> attribute is used, the zipfileset is populated with filesystem files found under <span style="font-style: italic;">dir</span>.<br> </li> </ul> <p><code><zipfileset></code> supports all attributes of <code><<a href="file:///C:/dev/gnu/ant/docs/manual/CoreTypes/fileset.html">fileset</a>></code> in addition to those listed below.<br> </p> <p>Since Ant 1.6, a zipfileset can be defined with the <span style="font-style: italic;">id </span>attribute and referred to with the <span style="font-style: italic;">refid</span> attribute.<br> </p> <h3>Parameters</h3> <table border="1" cellpadding="2" cellspacing="0"> <tbody> <tr> <td valign="top"><b>Attribute</b></td> <td valign="top"><b>Description</b></td> <td valign="top" align="center"><b>Required</b></td> </tr> <tr> <td valign="top">prefix</td> <td valign="top">all files in the fileset are prefixed with that path in the archive.</td> <td align="center" valign="top">No</td> </tr> <tr> <td valign="top">fullpath</td> <td valign="top">the file described by the fileset is placed at that exact location in the archive.</td> <td align="center" valign="top">No</td> </tr> <tr> <td valign="top">src</td> <td valign="top">may be used in place of the <i>dir</i> attribute to specify a zip file whose contents will be extracted and included in the archive.</td> <td align="center" valign="top">No</td> </tr> <tr> <td valign="top">filemode</td> <td valign="top">A 3 digit octal string, specify the user, group and other modes in the standard Unix fashion. Only applies to plain files. Default is 644. <em>since Ant 1.5.2</em>.</td> <td align="center" valign="top">No</td> </tr> <tr> <td valign="top">dirmode</td> <td valign="top">A 3 digit octal string, specify the user, group and other modes in the standard Unix fashion. Only applies to directories. Default is 755. <em>since Ant 1.5.2</em>.</td> <td align="center" valign="top">No</td> </tr> </tbody> </table> <p>The <i>fullpath</i> attribute can only be set for filesets that represent a single file. The <i>prefix</i> and <i>fullpath</i> attributes cannot both be set on the same fileset.</p> <p>When using the <i>src</i> attribute, include and exclude patterns may be used to specify a subset of the zip file for inclusion in the archive as with the <i>dir</i> attribute.</p> <h4>Examples</h4> <blockquote> <pre> <zip destfile="${dist}/manual.zip"><br> <zipfileset dir="htdocs/manual" prefix="docs/user-guide"/><br> <zipfileset dir="." includes="ChangeLog27.txt" fullpath="docs/ChangeLog.txt"/><br> <zipfileset src="examples.zip" includes="**/*.html" prefix="docs/examples"/><br> </zip><br></pre> <p>zips all files in the <code>htdocs/manual</code> directory into the <code>docs/user-guide</code> directory in the archive, adds the file <code>ChangeLog27.txt</code> in the current directory as <code>docs/ChangeLog.txt</code>, and includes all the html files in <code>examples.zip</code> under <code>docs/examples</code>. The archive might end up containing the files:</p> <code> docs/user-guide/html/index.html<br> docs/ChangeLog.txt<br> docs/examples/index.html<br> </code></blockquote> <hr> <p align="center">Copyright © 2003 Apache Software Foundation. All rights Reserved.</p> </body> </html> 1.9 +1 -0 ant/docs/manual/conceptstypeslist.html Index: conceptstypeslist.html =================================================================== RCS file: /home/cvs/ant/docs/manual/conceptstypeslist.html,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- conceptstypeslist.html 19 Mar 2003 08:20:13 -0000 1.8 +++ conceptstypeslist.html 18 Apr 2003 22:02:58 -0000 1.9 @@ -27,6 +27,7 @@ <a href="using.html#path">Path-like Structures</a><br> <a href="CoreTypes/selectors.html">Selectors</a><br> <a href="CoreTypes/xmlcatalog.html">XMLCatalog</a><br> +<a href="CoreTypes/zipfileset.html">ZipFileSet</a><br> <h3>Optional Types</h3> <a href="OptionalTypes/classfileset.html">Class Fileset</a><br> 1.20 +5 -56 ant/docs/manual/CoreTasks/zip.html Index: zip.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/zip.html,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- zip.html 17 Apr 2003 13:09:18 -0000 1.19 +++ zip.html 18 Apr 2003 22:02:58 -0000 1.20 @@ -60,7 +60,7 @@ <p>Starting with Ant 1.5.2, <zip> can store Unix permissions inside the archive (see description of the filemode and dirmode -attributes for <a href="#zipfileset"><zipfileset></a>). +attributes for <a href="../CoreTypes/zipfileset.html"><zipfileset></a>). Unfortunately there is no portable way to store these permissions. Ant uses the algorithm used by <a href="http://www.info-zip.org">Info-Zip's</a> implementation of the zip and unzip commands - these are the default @@ -158,62 +158,11 @@ href="../CoreTypes/fileset.html"><code><fileset></code></a> elements to specify the files to be included in the archive.</p> -<h4><a name="zipfileset">zipfileset</a></h4> +<h4>zipfileset</h4> -<p>A <code><zipfileset></code> is a special form of a -<code><fileset></code> that adds some extra functionality. It -supports all attributes of <code><fileset></code> in addition to -those listed below.</p> - -<h3>Parameters</h3> -<table border="1" cellpadding="2" cellspacing="0"> - <tr> - <td valign="top"><b>Attribute</b></td> - <td valign="top"><b>Description</b></td> - <td valign="top" align="center"><b>Required</b></td> - </tr> - <tr> - <td valign="top">prefix</td> - <td valign="top">all files in the fileset are prefixed with that - path in the archive.</td> - <td align="center" valign="top">No</td> - </tr> - <tr> - <td valign="top">fullpath</td> - <td valign="top">the file described by the fileset is placed at - that exact location in the archive.</td> - <td align="center" valign="top">No</td> - </tr> - <tr> - <td valign="top">src</td> - <td valign="top">may be used in place of the <i>dir</i> attribute - to specify a zip file whose contents will be extracted and - included in the archive.</td> - <td align="center" valign="top">No</td> - </tr> - <tr> - <td valign="top">filemode</td> - <td valign="top">A 3 digit octal string, specify the user, group - and other modes in the standard Unix fashion. Only applies to - plain files. Default is 644. <em>since Ant 1.5.2</em>.</td> - <td align="center" valign="top">No</td> - </tr> - <tr> - <td valign="top">dirmode</td> - <td valign="top">A 3 digit octal string, specify the user, group - and other modes in the standard Unix fashion. Only applies to - directories. Default is 755. <em>since Ant 1.5.2</em>.</td> - <td align="center" valign="top">No</td> - </tr> -</table> - -<p>The <i>fullpath</i> attribute can only be set for filesets that -represent a single file. The <i>prefix</i> and <i>fullpath</i> -attributes cannot both be set on the same fileset.</p> - -<p>When using the <i>src</i> attribute, include and exclude patterns -may be used to specify a subset of the zip file for inclusion in the -archive as with the <i>dir</i> attribute.</p> +<p>The zip task supports any number of nested <a +href="../CoreTypes/zipfileset.html"><code><zipfileset></code></a> elements to specify +the files to be included in the archive.</p> <h4>zipgroupfileset</h4> <p>A <code><zipgroupfileset></code> allows for multiple zip files to be 1.104 +14 -15 ant/src/main/org/apache/tools/ant/taskdefs/Zip.java Index: Zip.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Zip.java,v retrieving revision 1.103 retrieving revision 1.104 diff -u -r1.103 -r1.104 --- Zip.java 27 Mar 2003 10:02:04 -0000 1.103 +++ Zip.java 18 Apr 2003 22:02:58 -0000 1.104 @@ -67,7 +67,6 @@ import java.util.Vector; import java.util.zip.CRC32; import java.util.zip.ZipFile; -import java.util.zip.ZipInputStream; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; @@ -541,10 +540,10 @@ ZipFileSet zfs = null; if (fileset instanceof ZipFileSet) { zfs = (ZipFileSet) fileset; - prefix = zfs.getPrefix(); - fullpath = zfs.getFullpath(); - dirMode = zfs.getDirMode(); - fileMode = zfs.getFileMode(); + prefix = zfs.getPrefix(getProject()); + fullpath = zfs.getFullpath(getProject()); + dirMode = zfs.getDirMode(getProject()); + fileMode = zfs.getFileMode(getProject()); } if (prefix.length() > 0 && fullpath.length() > 0) { @@ -570,11 +569,11 @@ boolean dealingWithFiles = false; File base = null; - if (zfs == null || zfs.getSrc() == null) { + if (zfs == null || zfs.getSrc(getProject()) == null) { dealingWithFiles = true; base = fileset.getDir(getProject()); } else { - zf = new ZipFile(zfs.getSrc()); + zf = new ZipFile(zfs.getSrc(getProject())); } for (int i = 0; i < resources.length; i++) { @@ -604,7 +603,7 @@ zf.getEntry(resources[i].getName()); if (ze != null) { zipFile(zf.getInputStream(ze), zOut, prefix + name, - ze.getTime(), zfs.getSrc(), fileMode); + ze.getTime(), zfs.getSrc(getProject()), fileMode); } } } @@ -763,7 +762,7 @@ for (int i = 0; i < filesets.length; i++) { if (!(fileset instanceof ZipFileSet) - || ((ZipFileSet) fileset).getSrc() == null) { + || ((ZipFileSet) fileset).getSrc(getProject()) == null) { File base = filesets[i].getDir(getProject()); for (int j = 0; j < initialResources[i].length; j++) { @@ -787,20 +786,20 @@ FileNameMapper myMapper = new IdentityMapper(); if (filesets[i] instanceof ZipFileSet) { ZipFileSet zfs = (ZipFileSet) filesets[i]; - if (zfs.getFullpath() != null - && !zfs.getFullpath().equals("") ) { + if (zfs.getFullpath(getProject()) != null + && !zfs.getFullpath(getProject()).equals("") ) { // in this case all files from origin map to // the fullPath attribute of the zipfileset at // destination MergingMapper fm = new MergingMapper(); - fm.setTo(zfs.getFullpath()); + fm.setTo(zfs.getFullpath(getProject())); myMapper = fm; - } else if (zfs.getPrefix() != null - && !zfs.getPrefix().equals("")) { + } else if (zfs.getPrefix(getProject()) != null + && !zfs.getPrefix(getProject()).equals("")) { GlobPatternMapper gm=new GlobPatternMapper(); gm.setFrom("*"); - String prefix = zfs.getPrefix(); + String prefix = zfs.getPrefix(getProject()); if (!prefix.endsWith("/") && !prefix.endsWith("\\")) { prefix += "/"; } 1.16 +65 -20 ant/src/main/org/apache/tools/ant/types/ZipFileSet.java Index: ZipFileSet.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/types/ZipFileSet.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- ZipFileSet.java 19 Feb 2003 07:57:29 -0000 1.15 +++ ZipFileSet.java 18 Apr 2003 22:02:59 -0000 1.16 @@ -68,15 +68,10 @@ * entries of a Zip file for inclusion in another Zip file. It also includes * a prefix attribute which is prepended to each entry in the output Zip file. * - * At present, ZipFileSets are not surfaced in the public API. FileSets - * nested in a Zip task are instantiated as ZipFileSets, and their attributes - * are only recognized in the context of the the Zip task. - * It is not possible to define a ZipFileSet outside of the Zip task and - * refer to it via a refid. However a standard FileSet may be included by - * reference in the Zip task, and attributes in the refering ZipFileSet - * can augment FileSet definition. + * Since ant 1.6 ZipFileSet can be defined with an id and referenced in packaging tasks * * @author Don Ferguson <a href="mailto:[EMAIL PROTECTED]">[EMAIL PROTECTED]</a> + * @author <a href="mailto:[EMAIL PROTECTED]">Antoine Levy-Lambert</a> */ public class ZipFileSet extends FileSet { @@ -126,6 +121,9 @@ * from being specified. */ public void setDir(File dir) throws BuildException { + if (isReference()) { + throw tooManyAttributes(); + } if (srcFile != null) { throw new BuildException("Cannot set both dir and src attributes"); } else { @@ -141,6 +139,9 @@ * @param srcFile The zip file from which to extract entries. */ public void setSrc(File srcFile) { + if (isReference()) { + throw tooManyAttributes(); + } if (hasDir) { throw new BuildException("Cannot set both dir and src attributes"); } @@ -152,41 +153,62 @@ * References are not followed, since it is not possible * to have a reference to a ZipFileSet, only to a FileSet. */ - public File getSrc() { + public File getSrc(Project p) { + if (isReference()) { + return ((ZipFileSet)getRef(p)).getSrc(p); + } return srcFile; } /** * Prepend this prefix to the path for each zip entry. - * Does not perform reference test; the referenced file set - * can be augmented with a prefix. + * Prevents both prefix and fullpath from being specified * * @param prefix The prefix to prepend to entries in the zip file. */ public void setPrefix(String prefix) { + if (isReference()) { + throw tooManyAttributes(); + } + if (!fullpath.equals("")) { + throw new BuildException("Cannot set both fullpath and prefix attributes"); + } this.prefix = prefix; } /** * Return the prefix prepended to entries in the zip file. */ - public String getPrefix() { + public String getPrefix(Project p) { + if (isReference()) { + return ((ZipFileSet)getRef(p)).getPrefix(p); + } return prefix; } /** * Set the full pathname of the single entry in this fileset. + * Prevents both prefix and fullpath from being specified * * @param fullpath the full pathname of the single entry in this fileset. */ public void setFullpath(String fullpath) { + if (isReference()) { + throw tooManyAttributes(); + } + if (!prefix.equals("")) { + throw new BuildException("Cannot set both fullpath and prefix attributes"); + } this.fullpath = fullpath; } /** * Return the full pathname of the single entry in this fileset. */ - public String getFullpath() { + public String getFullpath(Project p) { + if (isReference()) { + return ((ZipFileSet)getRef(p)).getFullpath(p); + } return fullpath; } @@ -219,14 +241,20 @@ * @since Ant 1.5.2 */ public void setFileMode(String octalString) { - this.fileMode = + if (isReference()) { + throw tooManyAttributes(); + } + this.fileMode = UnixStat.FILE_FLAG | Integer.parseInt(octalString, 8); } /** * @since Ant 1.5.2 */ - public int getFileMode() { + public int getFileMode(Project p) { + if (isReference()) { + return ((ZipFileSet)getRef(p)).getFileMode(p); + } return fileMode; } @@ -238,20 +266,25 @@ * @since Ant 1.6 */ public void setDirMode(String octalString) { - this.dirMode = + if (isReference()) { + throw tooManyAttributes(); + } + this.dirMode = UnixStat.DIR_FLAG | Integer.parseInt(octalString, 8); } /** * @since Ant 1.6 */ - public int getDirMode() { + public int getDirMode(Project p) { + if (isReference()) { + return ((ZipFileSet)getRef(p)).getDirMode(p); + } return dirMode; } /** - * A ZipFileset can accept any fileset as a reference as it just uses the - * standard directory scanner. + * A ZipFileset accepts only another ZipFileSet as reference */ protected AbstractFileSet getRef(Project p) { if (!isChecked()) { @@ -261,11 +294,23 @@ } Object o = getRefid().getReferencedObject(p); - if (!(o instanceof FileSet)) { - String msg = getRefid().getRefId() + " doesn\'t denote a fileset"; + if (!(o instanceof ZipFileSet)) { + String msg = getRefid().getRefId() + " doesn\'t denote a zipfileset"; throw new BuildException(msg); } else { return (AbstractFileSet) o; + } + } + /** + * Return a ZipFileSet that has the same properties + * as this one. + * @since Ant 1.6 + */ + public Object clone() { + if (isReference()) { + return new ZipFileSet((ZipFileSet) getRef(getProject())); + } else { + return new ZipFileSet(this); } } } 1.17 +1 -1 ant/src/main/org/apache/tools/ant/types/defaults.properties Index: defaults.properties =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/types/defaults.properties,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- defaults.properties 14 Apr 2003 18:02:24 -0000 1.16 +++ defaults.properties 18 Apr 2003 22:02:59 -0000 1.17 @@ -16,5 +16,5 @@ extension=org.apache.tools.ant.taskdefs.optional.extension.ExtensionAdapter libfileset=org.apache.tools.ant.taskdefs.optional.extension.LibFileSet selector=org.apache.tools.ant.types.selectors.SelectSelector +zipfileset=org.apache.tools.ant.types.ZipFileSet scriptfilter=org.apache.tools.ant.types.optional.ScriptFilter -