bodewig 2003/07/03 08:43:09 Modified: src/main/org/apache/tools/ant/taskdefs Zip.java src/main/org/apache/tools/ant/types ZipFileSet.java ZipScanner.java Log: Base <zip> and <zipfileset> on new ZipFile code. This happens mainly for two reasons: * preserve stored permissions unless the user explicitly overrides them (PR 2130). This is now fixed for stored files, but not for directories. * deal with filename encoding of existing archives. Supposed to work properly now. Revision Changes Path 1.108 +14 -6 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.107 retrieving revision 1.108 diff -u -r1.107 -r1.108 --- Zip.java 25 Jun 2003 11:52:46 -0000 1.107 +++ Zip.java 3 Jul 2003 15:43:09 -0000 1.108 @@ -66,7 +66,6 @@ import java.util.Stack; import java.util.Vector; import java.util.zip.CRC32; -import java.util.zip.ZipFile; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; @@ -85,6 +84,7 @@ import org.apache.tools.ant.util.MergingMapper; import org.apache.tools.ant.util.ResourceUtils; import org.apache.tools.zip.ZipEntry; +import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; /** @@ -362,6 +362,7 @@ log("Adding file " + files[j] + " to fileset", Project.MSG_VERBOSE); ZipFileSet zf = new ZipFileSet(); + zf.setProject(getProject()); zf.setSrc(new File(basedir, files[j])); filesets.addElement(zf); filesetsFromGroupfilesets.addElement(zf); @@ -439,6 +440,7 @@ if (doUpdate) { addingNewFiles = false; ZipFileSet oldFiles = new ZipFileSet(); + oldFiles.setProject(getProject()); oldFiles.setSrc(renamedFile); for (int i = 0; i < addedFiles.size(); i++) { @@ -447,6 +449,7 @@ } DirectoryScanner ds = oldFiles.getDirectoryScanner(getProject()); + ((ZipScanner) ds).setEncoding(encoding); String[] f = ds.getIncludedFiles(); Resource[] r = new Resource[f.length]; for (int i = 0; i < f.length; i++) { @@ -575,7 +578,7 @@ dealingWithFiles = true; base = fileset.getDir(getProject()); } else { - zf = new ZipFile(zfs.getSrc(getProject())); + zf = new ZipFile(zfs.getSrc(getProject()), encoding); } for (int i = 0; i < resources.length; i++) { @@ -595,17 +598,18 @@ } addParentDirs(base, name, zOut, prefix, dirMode); - + if (!resources[i].isDirectory() && dealingWithFiles) { File f = fileUtils.resolveFile(base, resources[i].getName()); zipFile(f, zOut, prefix + name, fileMode); } else if (!resources[i].isDirectory()) { - java.util.zip.ZipEntry ze = - zf.getEntry(resources[i].getName()); + ZipEntry ze = zf.getEntry(resources[i].getName()); if (ze != null) { zipFile(zf.getInputStream(ze), zOut, prefix + name, - ze.getTime(), zfs.getSrc(getProject()), fileMode); + ze.getTime(), zfs.getSrc(getProject()), + zfs.hasFileModeBeenSet() ? fileMode + : ze.getUnixMode()); } } } @@ -673,6 +677,7 @@ private synchronized ZipScanner getZipScanner() { if (zs == null) { zs = new ZipScanner(); + zs.setEncoding(encoding); zs.setSrc(zipFile); } return zs; @@ -849,6 +854,9 @@ for (int i = 0; i < filesets.length; i++) { DirectoryScanner rs = filesets[i].getDirectoryScanner(getProject()); + if (rs instanceof ZipScanner) { + ((ZipScanner) rs).setEncoding(encoding); + } Vector resources = new Vector(); String[] directories = rs.getIncludedDirectories(); for (int j = 0; j < directories.length; j++) { 1.21 +35 -4 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.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- ZipFileSet.java 27 May 2003 09:30:17 -0000 1.20 +++ ZipFileSet.java 3 Jul 2003 15:43:09 -0000 1.21 @@ -98,6 +98,9 @@ private int fileMode = DEFAULT_FILE_MODE; private int dirMode = DEFAULT_DIR_MODE; + private boolean fileModeHasBeenSet = false; + private boolean dirModeHasBeenSet = false; + public ZipFileSet() { super(); } @@ -114,6 +117,8 @@ hasDir = fileset.hasDir; fileMode = fileset.fileMode; dirMode = fileset.dirMode; + fileModeHasBeenSet = fileset.fileModeHasBeenSet; + dirModeHasBeenSet = fileset.dirModeHasBeenSet; } /** @@ -243,7 +248,8 @@ public void setFileMode(String octalString) { if (isReference()) { throw tooManyAttributes(); - } + } + fileModeHasBeenSet = true; this.fileMode = UnixStat.FILE_FLAG | Integer.parseInt(octalString, 8); } @@ -259,28 +265,53 @@ } /** + * Whether the user has specified the mode explicitly. + * + * @since Ant 1.6 + */ + public boolean hasFileModeBeenSet() { + if (isReference()) { + return ((ZipFileSet)getRef(getProject())).hasFileModeBeenSet(); + } + return fileModeHasBeenSet; + } + + /** * A 3 digit octal string, specify the user, group and * other modes in the standard Unix fashion; * optional, default=0755 * - * @since Ant 1.6 + * @since Ant 1.5.2 */ public void setDirMode(String octalString) { if (isReference()) { throw tooManyAttributes(); - } + } + dirModeHasBeenSet = true; this.dirMode = UnixStat.DIR_FLAG | Integer.parseInt(octalString, 8); } /** - * @since Ant 1.6 + * @since Ant 1.5.2 */ public int getDirMode(Project p) { if (isReference()) { return ((ZipFileSet)getRef(p)).getDirMode(p); } return dirMode; + } + + /** + * Whether the user has specified the mode explicitly. + * + * @since Ant 1.6 + */ + public boolean hasDirModeBeenSet() { + if (isReference()) { + return ((ZipFileSet)getRef(getProject())).hasDirModeBeenSet(); + } + return dirModeHasBeenSet; } /** 1.19 +31 -23 ant/src/main/org/apache/tools/ant/types/ZipScanner.java Index: ZipScanner.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/types/ZipScanner.java,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- ZipScanner.java 18 Apr 2003 23:40:28 -0000 1.18 +++ ZipScanner.java 3 Jul 2003 15:43:09 -0000 1.19 @@ -60,12 +60,12 @@ import java.util.Vector; import java.util.Hashtable; import java.util.Enumeration; -import java.util.zip.ZipInputStream; -import java.util.zip.ZipEntry; import java.util.zip.ZipException; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; +import org.apache.tools.zip.ZipEntry; +import org.apache.tools.zip.ZipFile; /** * ZipScanner accesses the pattern matching algorithm in DirectoryScanner, @@ -93,6 +93,13 @@ private Hashtable myentries; /** + * encoding of file names. + * + * @since Ant 1.6 + */ + private String encoding; + + /** * Sets the srcFile for scanning. This is the jar or zip file that * is scanned for matching entries. * @@ -103,6 +110,15 @@ } /** + * Sets encoding of file names. + * + * @since Ant 1.6 + */ + public void setEncoding(String encoding) { + this.encoding = encoding; + } + + /** * Returns the names of the files which matched at least one of the * include patterns and none of the exclude patterns. * The names are relative to the base directory. @@ -230,37 +246,29 @@ } ZipEntry entry = null; - ZipInputStream in = null; + ZipFile zf = null; myentries = new Hashtable(); try { try { - in = new ZipInputStream(new FileInputStream(srcFile)); + zf = new ZipFile(srcFile, encoding); + } catch (ZipException ex) { + throw new BuildException("problem reading " + srcFile, ex); } catch (IOException ex) { throw new BuildException("problem opening " + srcFile, ex); } - while (true) { - try { - entry = in.getNextEntry(); - if (entry == null) { - break; - } - myentries.put(new String(entry.getName()), - new Resource(entry.getName(), true, - entry.getTime(), - entry.isDirectory())); - } catch (ZipException ex) { - throw new BuildException("problem reading " + srcFile, - ex); - } catch (IOException e) { - throw new BuildException("problem reading zip entry from " - + srcFile, e); - } + Enumeration enum = zf.getEntries(); + while (enum.hasMoreElements()) { + entry = (ZipEntry) enum.nextElement(); + myentries.put(new String(entry.getName()), + new Resource(entry.getName(), true, + entry.getTime(), + entry.isDirectory())); } } finally { - if (in != null) { + if (zf != null) { try { - in.close(); + zf.close(); } catch (IOException ex) { // swallow }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]