You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bo...@apache.org on 2009/07/15 10:26:38 UTC

svn commit: r794177 - /ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java

Author: bodewig
Date: Wed Jul 15 08:26:37 2009
New Revision: 794177

URL: http://svn.apache.org/viewvc?rev=794177&view=rev
Log:
refactor zip archive creation logic into smaller chunks

Modified:
    ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java

Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java?rev=794177&r1=794176&r2=794177&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/Zip.java Wed Jul 15 08:26:37 2009
@@ -894,83 +894,33 @@
                 if ("".equals(name)) {
                     continue;
                 }
-                if (resources[i].isDirectory() && !name.endsWith("/")) {
-                    name = name + "/";
-                }
 
-                if (!doFilesonly && !dealingWithFiles
-                    && resources[i].isDirectory()
-                    && !zfs.hasDirModeBeenSet()) {
-                    int nextToLastSlash = name.lastIndexOf("/",
-                                                           name.length() - 2);
-                    if (nextToLastSlash != -1) {
-                        addParentDirs(base, name.substring(0,
-                                                           nextToLastSlash + 1),
-                                      zOut, prefix, dirMode);
-                    }
-                    if (zf != null) {
-                        ZipEntry ze = zf.getEntry(resources[i].getName());
-                        int unixMode = ze.getUnixMode();
-                        if ((unixMode == 0 || unixMode == UnixStat.DIR_FLAG)
-                            && !preserve0Permissions) {
-                            unixMode = dirMode;
-                        }
-                        addParentDirs(base, name, zOut, prefix,
-                                      unixMode);
-                    } else {
-                        ArchiveResource tr = (ArchiveResource) resources[i];
-                        addParentDirs(base, name, zOut, prefix,
-                                      tr.getMode());
+                if (resources[i].isDirectory()) {
+                    if (doFilesonly) {
+                        continue;
                     }
+                    int thisDirMode = zfs != null && zfs.hasDirModeBeenSet()
+                        ? dirMode : getUnixMode(resources[i], zf, dirMode);
+                    addDirectoryResource(resources[i], name, prefix,
+                                         base, zOut,
+                                         dirMode, thisDirMode);
+
+                } else { // !isDirectory
 
-                } else {
                     addParentDirs(base, name, zOut, prefix, dirMode);
-                }
 
-                if (!resources[i].isDirectory() && dealingWithFiles) {
-                    File f = FILE_UTILS.resolveFile(base,
-                                                   resources[i].getName());
-                    zipFile(f, zOut, prefix + name, fileMode);
-                } else if (!resources[i].isDirectory()) {
-                    if (zf != null) {
-                    ZipEntry ze = zf.getEntry(resources[i].getName());
-
-                    if (ze != null) {
-                        boolean oldCompress = doCompress;
-                        if (keepCompression) {
-                            doCompress = (ze.getMethod() == ZipEntry.DEFLATED);
-                        }
-                        InputStream is = null;
-                        try {
-                            is = zf.getInputStream(ze);
-                            int unixMode = ze.getUnixMode();
-                            if (zfs.hasFileModeBeenSet()
-                                || ((unixMode == 0
-                                     || unixMode == UnixStat.FILE_FLAG)
-                                    && !preserve0Permissions)) {
-                                unixMode = fileMode;
-                            }
-                            zipFile(is, zOut, prefix + name,
-                                    ze.getTime(), zfs.getSrc(getProject()),
-                                    unixMode);
-                        } finally {
-                            doCompress = oldCompress;
-                            FileUtils.close(is);
-                        }
-                    }
+                    if (dealingWithFiles) {
+                        File f = FILE_UTILS.resolveFile(base,
+                                                        resources[i].getName());
+                        zipFile(f, zOut, prefix + name, fileMode);
                     } else {
-                        ArchiveResource tr = (ArchiveResource) resources[i];
-                        InputStream is = null;
-                        try {
-                            is = tr.getInputStream();
-                            zipFile(is, zOut, prefix + name,
-                                    resources[i].getLastModified(),
-                                    zfs.getSrc(getProject()),
-                                    zfs.hasFileModeBeenSet() ? fileMode
-                                    : tr.getMode());
-                        } finally {
-                            FileUtils.close(is);
-                        }
+                        int thisFileMode =
+                            zfs != null && zfs.hasFileModeBeenSet()
+                            ? fileMode : getUnixMode(resources[i], zf,
+                                                     fileMode);
+                        addResource(resources[i], name, prefix,
+                                    zOut, thisFileMode,
+                                    zf, zfs.getSrc(getProject()));
                     }
                 }
             }
@@ -982,6 +932,87 @@
     }
 
     /**
+     * Add a directory entry to the archive using a specified
+     * Unix-mode and the default mode for its parent directories (if
+     * necessary).
+     */
+    private void addDirectoryResource(Resource r, String name, String prefix,
+                                      File base, ZipOutputStream zOut,
+                                      int defaultDirMode, int thisDirMode)
+        throws IOException {
+
+        if (!name.endsWith("/")) {
+            name = name + "/";
+        }
+
+        int nextToLastSlash = name.lastIndexOf("/", name.length() - 2);
+        if (nextToLastSlash != -1) {
+            addParentDirs(base, name.substring(0, nextToLastSlash + 1),
+                          zOut, prefix, defaultDirMode);
+        }
+        addParentDirs(base, name, zOut, prefix, thisDirMode);
+    }
+
+    /**
+     * Determine a Resource's Unix mode or return the given default
+     * value if not available.
+     */
+    private int getUnixMode(Resource r, ZipFile zf, int defaultMode)
+        throws IOException {
+
+        int unixMode = defaultMode;
+        if (zf != null) {
+            ZipEntry ze = zf.getEntry(r.getName());
+            unixMode = ze.getUnixMode();
+            if ((unixMode == 0 || unixMode == UnixStat.DIR_FLAG)
+                && !preserve0Permissions) {
+                unixMode = defaultMode;
+            }
+        } else if (r instanceof ArchiveResource) {
+            unixMode = ((ArchiveResource) r).getMode();
+        }
+        return unixMode;
+    }
+
+    /**
+     * Add a file entry.
+     */
+    private void addResource(Resource r, String name, String prefix,
+                             ZipOutputStream zOut, int mode,
+                             ZipFile zf, File sourceArchive)
+        throws IOException {
+
+        if (zf != null) {
+            ZipEntry ze = zf.getEntry(r.getName());
+
+            if (ze != null) {
+                boolean oldCompress = doCompress;
+                if (keepCompression) {
+                    doCompress = (ze.getMethod() == ZipEntry.DEFLATED);
+                }
+                InputStream is = null;
+                try {
+                    is = zf.getInputStream(ze);
+                    zipFile(is, zOut, prefix + name, ze.getTime(),
+                            sourceArchive, mode);
+                } finally {
+                    doCompress = oldCompress;
+                    FileUtils.close(is);
+                }
+            }
+        } else {
+            InputStream is = null;
+            try {
+                is = r.getInputStream();
+                zipFile(is, zOut, prefix + name, r.getLastModified(),
+                        sourceArchive, mode);
+            } finally {
+                FileUtils.close(is);
+            }
+        }
+    }
+
+    /**
      * Add the given resources.
      *
      * @param rc may give additional information like fullpath or
@@ -1014,29 +1045,23 @@
             if (fp != null) {
                 base = ResourceUtils.asFileResource(fp).getBaseDir();
             }
+
             if (resources[i].isDirectory()) {
-                if (!name.endsWith("/")) {
-                    name = name + "/";
-                }
-            }
+                addDirectoryResource(resources[i], name, "", base, zOut,
+                                     ArchiveFileSet.DEFAULT_DIR_MODE,
+                                     ArchiveFileSet.DEFAULT_DIR_MODE);
 
-            addParentDirs(base, name, zOut, "",
-                          ArchiveFileSet.DEFAULT_DIR_MODE);
+            } else {
+                addParentDirs(base, name, zOut, "",
+                              ArchiveFileSet.DEFAULT_DIR_MODE);
 
-            if (!resources[i].isDirectory()) {
                 if (fp != null) {
                     File f = (fp).getFile();
                     zipFile(f, zOut, name, ArchiveFileSet.DEFAULT_FILE_MODE);
                 } else {
-                    InputStream is = null;
-                    try {
-                        is = resources[i].getInputStream();
-                        zipFile(is, zOut, name,
-                                resources[i].getLastModified(),
-                                null, ArchiveFileSet.DEFAULT_FILE_MODE);
-                    } finally {
-                        FileUtils.close(is);
-                    }
+                    addResource(resources[i], name, "", zOut,
+                                ArchiveFileSet.DEFAULT_FILE_MODE,
+                                null, null);
                 }
             }
         }