You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bo...@apache.org on 2009/03/17 13:53:23 UTC

svn commit: r755227 - in /commons/sandbox/compress/trunk/src: main/java/org/apache/commons/compress/archivers/tar/ test/java/org/apache/commons/compress/archivers/tar/

Author: bodewig
Date: Tue Mar 17 12:53:22 2009
New Revision: 755227

URL: http://svn.apache.org/viewvc?rev=755227&view=rev
Log:
deal with file system roots added as tar entries.  SANDBOX-284

Added:
    commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/tar/
    commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveEntryTest.java   (with props)
Modified:
    commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java

Modified: commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java
URL: http://svn.apache.org/viewvc/commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java?rev=755227&r1=755226&r2=755227&view=diff
==============================================================================
--- commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java (original)
+++ commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java Tue Mar 17 12:53:22 2009
@@ -158,6 +158,7 @@
     public TarArchiveEntry(String name) {
         this();
 
+        name = normalizeFileName(name);
         boolean isDir = name.endsWith("/");
 
         this.devMajor = 0;
@@ -199,42 +200,7 @@
 
         this.file = file;
 
-        String fileName = file.getPath();
-        String osname = System.getProperty("os.name").toLowerCase(Locale.US);
-
-        if (osname != null) {
-
-            // Strip off drive letters!
-            // REVIEW Would a better check be "(File.separator == '\')"?
-
-            if (osname.startsWith("windows")) {
-                if (fileName.length() > 2) {
-                    char ch1 = fileName.charAt(0);
-                    char ch2 = fileName.charAt(1);
-
-                    if (ch2 == ':'
-                        && ((ch1 >= 'a' && ch1 <= 'z')
-                            || (ch1 >= 'A' && ch1 <= 'Z'))) {
-                        fileName = fileName.substring(2);
-                    }
-                }
-            } else if (osname.indexOf("netware") > -1) {
-                int colon = fileName.indexOf(':');
-                if (colon != -1) {
-                    fileName = fileName.substring(colon + 1);
-                }
-            }
-        }
-
-        fileName = fileName.replace(File.separatorChar, '/');
-
-        // No absolute pathnames
-        // Windows (and Posix?) paths can start with "\\NetworkDrive\",
-        // so we loop on starting /'s.
-        while (fileName.startsWith("/")) {
-            fileName = fileName.substring(1);
-        }
-
+        String fileName = normalizeFileName(file.getPath());
         this.linkName = new StringBuffer("");
         this.name = new StringBuffer(fileName);
 
@@ -242,7 +208,8 @@
             this.mode = DEFAULT_DIR_MODE;
             this.linkFlag = LF_DIR;
 
-            if (this.name.charAt(this.name.length() - 1) != '/') {
+            int nameLength = name.length();
+            if (nameLength == 0 || name.charAt(nameLength - 1) != '/') {
                 this.name.append("/");
             }
         } else {
@@ -328,7 +295,7 @@
      * @param name This entry's new name.
      */
     public void setName(String name) {
-        this.name = new StringBuffer(name);
+        this.name = new StringBuffer(normalizeFileName(name));
     }
 
     /**
@@ -632,5 +599,47 @@
         offset += DEVLEN;
         devMinor = (int) TarUtils.parseOctal(header, offset, DEVLEN);
     }
+
+    /**
+     * Strips Windows' drive letter as well as any leading slashes,
+     * turns path separators into forward slahes.
+     */
+    private static String normalizeFileName(String fileName) {
+        String osname = System.getProperty("os.name").toLowerCase(Locale.US);
+
+        if (osname != null) {
+
+            // Strip off drive letters!
+            // REVIEW Would a better check be "(File.separator == '\')"?
+
+            if (osname.startsWith("windows")) {
+                if (fileName.length() > 2) {
+                    char ch1 = fileName.charAt(0);
+                    char ch2 = fileName.charAt(1);
+
+                    if (ch2 == ':'
+                        && ((ch1 >= 'a' && ch1 <= 'z')
+                            || (ch1 >= 'A' && ch1 <= 'Z'))) {
+                        fileName = fileName.substring(2);
+                    }
+                }
+            } else if (osname.indexOf("netware") > -1) {
+                int colon = fileName.indexOf(':');
+                if (colon != -1) {
+                    fileName = fileName.substring(colon + 1);
+                }
+            }
+        }
+
+        fileName = fileName.replace(File.separatorChar, '/');
+
+        // No absolute pathnames
+        // Windows (and Posix?) paths can start with "\\NetworkDrive\",
+        // so we loop on starting /'s.
+        while (fileName.startsWith("/")) {
+            fileName = fileName.substring(1);
+        }
+        return fileName;
+    }
 }
 

Added: commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveEntryTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveEntryTest.java?rev=755227&view=auto
==============================================================================
--- commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveEntryTest.java (added)
+++ commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveEntryTest.java Tue Mar 17 12:53:22 2009
@@ -0,0 +1,93 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.commons.compress.archivers.tar;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Locale;
+import junit.framework.TestCase;
+
+public class TarArchiveEntryTest extends TestCase {
+
+    private static final String OS =
+        System.getProperty("os.name").toLowerCase(Locale.US);
+    private static final String ROOT =
+        OS.startsWith("windows") || OS.startsWith("netware") ? "C:\\" : "/";
+
+    /**
+     * JIRA issue SANDBOX-284
+     *
+     * @see https://issues.apache.org/jira/browse/SANDBOX-284
+     */
+    public void testFileSystemRoot() {
+        TarArchiveEntry t = new TarArchiveEntry(new File(ROOT));
+        assertEquals("/", t.getName());
+    }
+
+    public void testTarFileWithFSRoot() throws IOException {
+        File f = File.createTempFile("taetest", ".tar");
+        f.deleteOnExit();
+        TarArchiveOutputStream tout = null;
+        TarArchiveInputStream tin = null;
+        try {
+            tout = new TarArchiveOutputStream(new FileOutputStream(f));
+            TarArchiveEntry t = new TarArchiveEntry(new File(ROOT));
+            tout.putNextEntry(t);
+            tout.closeEntry();
+            t = new TarArchiveEntry(new File(new File(ROOT), "foo.txt"));
+            t.setSize(6);
+            tout.putNextEntry(t);
+            tout.write(new byte[] {'h', 'e', 'l', 'l', 'o', ' '});
+            tout.closeEntry();
+            t = new TarArchiveEntry(new File(new File(ROOT), "bar.txt")
+                                    .getAbsolutePath());
+            t.setSize(5);
+            tout.putNextEntry(t);
+            tout.write(new byte[] {'w', 'o', 'r', 'l', 'd'});
+            tout.closeEntry();
+            t = new TarArchiveEntry("dummy");
+            t.setName(new File(new File(ROOT), "baz.txt").getAbsolutePath());
+            t.setSize(1);
+            tout.putNextEntry(t);
+            tout.write(new byte[] {'!'});
+            tout.closeEntry();
+            tout.close();
+            tout = null;
+
+            tin = new TarArchiveInputStream(new FileInputStream(f));
+            t = tin.getNextTarEntry();
+            assertEquals("/", t.getName());
+            t = tin.getNextTarEntry();
+            assertEquals("foo.txt", t.getName());
+            t = tin.getNextTarEntry();
+            assertEquals("bar.txt", t.getName());
+            t = tin.getNextTarEntry();
+            assertEquals("baz.txt", t.getName());
+        } finally {
+            if (tin != null) {
+                tin.close();
+            }
+            if (tout != null) {
+                tout.close();
+            }
+        }
+    }
+}

Propchange: commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveEntryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native