src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipPath.java

Print this page

        

@@ -374,18 +374,23 @@
         if (offsets == null) {
             int count, index;
             // count names
             count = 0;
             index = 0;
+            if (path.length == 0) {
+                // empty path has one name
+                count = 1;
+            } else {
             while (index < path.length) {
                 byte c = path[index++];
                 if (c != '/') {
                     count++;
                     while (index < path.length && path[index] != '/')
                         index++;
                 }
             }
+            }
             // populate offsets
             int[] result = new int[count];
             count = 0;
             index = 0;
             while (index < path.length) {

@@ -421,21 +426,24 @@
     }
 
     // removes redundant slashs, replace "\" to zip separator "/"
     // and check for invalid characters
     private byte[] normalize(byte[] path) {
-        if (path.length == 0)
+        int len = path.length;
+        if (len == 0)
             return path;
         byte prevC = 0;
-        for (int i = 0; i < path.length; i++) {
+        for (int i = 0; i < len; i++) {
             byte c = path[i];
             if (c == '\\' || c == '\u0000')
                 return normalize(path, i);
             if (c == (byte)'/' && prevC == '/')
                 return normalize(path, i - 1);
             prevC = c;
         }
+        if (len > 1 && prevC == '/')
+            return Arrays.copyOf(path, len - 1);
         return path;
     }
 
     private byte[] normalize(byte[] path, int off) {
         byte[] to = new byte[path.length];

@@ -565,11 +573,12 @@
             WatchEvent.Kind<?>[] events,
             WatchEvent.Modifier... modifiers) {
         if (watcher == null || events == null || modifiers == null) {
             throw new NullPointerException();
         }
-        throw new UnsupportedOperationException();
+        // watcher must be associated with a different provider
+        throw new ProviderMismatchException();
     }
 
     @Override
     public WatchKey register(WatchService watcher, WatchEvent.Kind<?>... events) {
         return register(watcher, events, new WatchEvent.Modifier[0]);