src/java.base/windows/classes/java/io/WinNTFileSystem.java
author redestad
Thu, 13 Dec 2018 15:31:05 +0100
changeset 53018 8bf9268df0e2
parent 51517 edcf0d527658
child 54273 f0490ada4712
permissions -rw-r--r--
8215281: Use String.isEmpty() when applicable in java.base Reviewed-by: dfuchs, alanb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
48927
847a988152b8 8194154: System property user.dir should not be changed
minqi
parents: 47216
diff changeset
     2
 * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    26
package java.io;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
42777
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
    28
import java.io.File;
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
    29
import java.nio.file.Path;
45715
5770e935238b 8182710: File.listRoots() always returns the root of CD drive
bpb
parents: 43105
diff changeset
    30
import java.util.BitSet;
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    31
import java.util.Locale;
37593
824750ada3d6 8154231: Simplify access to System properties from JDK code
redestad
parents: 31471
diff changeset
    32
import java.util.Properties;
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    33
import sun.security.action.GetPropertyAction;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
/**
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
 * Unicode-aware FileSystem for Windows NT/2000.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
 * @author Konstantin Kladko
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
 * @since 1.4
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
 */
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    41
class WinNTFileSystem extends FileSystem {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    42
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    43
    private final char slash;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    44
    private final char altSlash;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    45
    private final char semicolon;
48927
847a988152b8 8194154: System property user.dir should not be changed
minqi
parents: 47216
diff changeset
    46
    private final String userDir;
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    47
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    48
    public WinNTFileSystem() {
37781
71ed5645f17c 8155775: Re-examine naming of privileged methods to access System properties
redestad
parents: 37593
diff changeset
    49
        Properties props = GetPropertyAction.privilegedGetProperties();
37593
824750ada3d6 8154231: Simplify access to System properties from JDK code
redestad
parents: 31471
diff changeset
    50
        slash = props.getProperty("file.separator").charAt(0);
824750ada3d6 8154231: Simplify access to System properties from JDK code
redestad
parents: 31471
diff changeset
    51
        semicolon = props.getProperty("path.separator").charAt(0);
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    52
        altSlash = (this.slash == '\\') ? '/' : '\\';
49281
6712bdd93e4e 8198997: Cache normalized/resolved user.dir property
bpb
parents: 48927
diff changeset
    53
        userDir = normalize(props.getProperty("user.dir"));
51517
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
    54
        cache = useCanonCaches ? new ExpiringCache() : null;
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
    55
        prefixCache = useCanonPrefixCache ? new ExpiringCache() : null;
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    56
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    57
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    58
    private boolean isSlash(char c) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    59
        return (c == '\\') || (c == '/');
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    60
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    61
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    62
    private boolean isLetter(char c) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    63
        return ((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'));
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    64
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    65
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    66
    private String slashify(String p) {
53018
8bf9268df0e2 8215281: Use String.isEmpty() when applicable in java.base
redestad
parents: 51517
diff changeset
    67
        if (!p.isEmpty() && p.charAt(0) != slash) return slash + p;
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    68
        else return p;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    69
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    70
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    71
    /* -- Normalization and construction -- */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    72
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    73
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    74
    public char getSeparator() {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    75
        return slash;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    76
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    77
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    78
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    79
    public char getPathSeparator() {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    80
        return semicolon;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    81
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    82
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    83
    /* Check that the given pathname is normal.  If not, invoke the real
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    84
       normalizer on the part of the pathname that requires normalization.
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    85
       This way we iterate through the whole pathname string only once. */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    86
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    87
    public String normalize(String path) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    88
        int n = path.length();
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    89
        char slash = this.slash;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    90
        char altSlash = this.altSlash;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    91
        char prev = 0;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    92
        for (int i = 0; i < n; i++) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    93
            char c = path.charAt(i);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    94
            if (c == altSlash)
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    95
                return normalize(path, n, (prev == slash) ? i - 1 : i);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    96
            if ((c == slash) && (prev == slash) && (i > 1))
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    97
                return normalize(path, n, i - 1);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    98
            if ((c == ':') && (i > 1))
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
    99
                return normalize(path, n, 0);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   100
            prev = c;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   101
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   102
        if (prev == slash) return normalize(path, n, n - 1);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   103
        return path;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   104
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   105
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   106
    /* Normalize the given pathname, whose length is len, starting at the given
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   107
       offset; everything before this offset is already normal. */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   108
    private String normalize(String path, int len, int off) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   109
        if (len == 0) return path;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   110
        if (off < 3) off = 0;   /* Avoid fencepost cases with UNC pathnames */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   111
        int src;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   112
        char slash = this.slash;
31471
ae27c6f1d8bf 8077242: (str) Optimize AbstractStringBuilder.append(CharSequence, int, int) for String argument
igerasim
parents: 25859
diff changeset
   113
        StringBuilder sb = new StringBuilder(len);
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   114
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   115
        if (off == 0) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   116
            /* Complete normalization, including prefix */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   117
            src = normalizePrefix(path, len, sb);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   118
        } else {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   119
            /* Partial normalization */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   120
            src = off;
31471
ae27c6f1d8bf 8077242: (str) Optimize AbstractStringBuilder.append(CharSequence, int, int) for String argument
igerasim
parents: 25859
diff changeset
   121
            sb.append(path, 0, off);
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   122
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   123
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   124
        /* Remove redundant slashes from the remainder of the path, forcing all
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   125
           slashes into the preferred slash */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   126
        while (src < len) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   127
            char c = path.charAt(src++);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   128
            if (isSlash(c)) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   129
                while ((src < len) && isSlash(path.charAt(src))) src++;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   130
                if (src == len) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   131
                    /* Check for trailing separator */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   132
                    int sn = sb.length();
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   133
                    if ((sn == 2) && (sb.charAt(1) == ':')) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   134
                        /* "z:\\" */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   135
                        sb.append(slash);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   136
                        break;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   137
                    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   138
                    if (sn == 0) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   139
                        /* "\\" */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   140
                        sb.append(slash);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   141
                        break;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   142
                    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   143
                    if ((sn == 1) && (isSlash(sb.charAt(0)))) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   144
                        /* "\\\\" is not collapsed to "\\" because "\\\\" marks
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   145
                           the beginning of a UNC pathname.  Even though it is
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   146
                           not, by itself, a valid UNC pathname, we leave it as
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   147
                           is in order to be consistent with the win32 APIs,
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   148
                           which treat this case as an invalid UNC pathname
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   149
                           rather than as an alias for the root directory of
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   150
                           the current drive. */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   151
                        sb.append(slash);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   152
                        break;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   153
                    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   154
                    /* Path does not denote a root directory, so do not append
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   155
                       trailing slash */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   156
                    break;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   157
                } else {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   158
                    sb.append(slash);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   159
                }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   160
            } else {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   161
                sb.append(c);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   162
            }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   163
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   164
31471
ae27c6f1d8bf 8077242: (str) Optimize AbstractStringBuilder.append(CharSequence, int, int) for String argument
igerasim
parents: 25859
diff changeset
   165
        return sb.toString();
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   166
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   167
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   168
    /* A normal Win32 pathname contains no duplicate slashes, except possibly
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   169
       for a UNC prefix, and does not end with a slash.  It may be the empty
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   170
       string.  Normalized Win32 pathnames have the convenient property that
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   171
       the length of the prefix almost uniquely identifies the type of the path
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   172
       and whether it is absolute or relative:
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   173
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   174
           0  relative to both drive and directory
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   175
           1  drive-relative (begins with '\\')
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   176
           2  absolute UNC (if first char is '\\'),
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   177
                else directory-relative (has form "z:foo")
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   178
           3  absolute local pathname (begins with "z:\\")
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   179
     */
31471
ae27c6f1d8bf 8077242: (str) Optimize AbstractStringBuilder.append(CharSequence, int, int) for String argument
igerasim
parents: 25859
diff changeset
   180
    private int normalizePrefix(String path, int len, StringBuilder sb) {
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   181
        int src = 0;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   182
        while ((src < len) && isSlash(path.charAt(src))) src++;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   183
        char c;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   184
        if ((len - src >= 2)
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   185
            && isLetter(c = path.charAt(src))
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   186
            && path.charAt(src + 1) == ':') {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   187
            /* Remove leading slashes if followed by drive specifier.
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   188
               This hack is necessary to support file URLs containing drive
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   189
               specifiers (e.g., "file://c:/path").  As a side effect,
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   190
               "/c:/path" can be used as an alternative to "c:/path". */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   191
            sb.append(c);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   192
            sb.append(':');
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   193
            src += 2;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   194
        } else {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   195
            src = 0;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   196
            if ((len >= 2)
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   197
                && isSlash(path.charAt(0))
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   198
                && isSlash(path.charAt(1))) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   199
                /* UNC pathname: Retain first slash; leave src pointed at
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   200
                   second slash so that further slashes will be collapsed
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   201
                   into the second slash.  The result will be a pathname
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   202
                   beginning with "\\\\" followed (most likely) by a host
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   203
                   name. */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   204
                src = 1;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   205
                sb.append(slash);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   206
            }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   207
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   208
        return src;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   209
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   210
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   211
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   212
    public int prefixLength(String path) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   213
        char slash = this.slash;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   214
        int n = path.length();
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   215
        if (n == 0) return 0;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   216
        char c0 = path.charAt(0);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   217
        char c1 = (n > 1) ? path.charAt(1) : 0;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   218
        if (c0 == slash) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   219
            if (c1 == slash) return 2;  /* Absolute UNC pathname "\\\\foo" */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   220
            return 1;                   /* Drive-relative "\\foo" */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   221
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   222
        if (isLetter(c0) && (c1 == ':')) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   223
            if ((n > 2) && (path.charAt(2) == slash))
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   224
                return 3;               /* Absolute local pathname "z:\\foo" */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   225
            return 2;                   /* Directory-relative "z:foo" */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   226
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   227
        return 0;                       /* Completely relative */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   228
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   229
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   230
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   231
    public String resolve(String parent, String child) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   232
        int pn = parent.length();
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   233
        if (pn == 0) return child;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   234
        int cn = child.length();
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   235
        if (cn == 0) return parent;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   236
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   237
        String c = child;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   238
        int childStart = 0;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   239
        int parentEnd = pn;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   240
43105
b1d99aa9f29f 8153250: java.io.File does not handle Windows paths of the form "D:" (no path) correctly
bpb
parents: 42777
diff changeset
   241
        boolean isDirectoryRelative =
b1d99aa9f29f 8153250: java.io.File does not handle Windows paths of the form "D:" (no path) correctly
bpb
parents: 42777
diff changeset
   242
            pn == 2 && isLetter(parent.charAt(0)) && parent.charAt(1) == ':';
b1d99aa9f29f 8153250: java.io.File does not handle Windows paths of the form "D:" (no path) correctly
bpb
parents: 42777
diff changeset
   243
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   244
        if ((cn > 1) && (c.charAt(0) == slash)) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   245
            if (c.charAt(1) == slash) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   246
                /* Drop prefix when child is a UNC pathname */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   247
                childStart = 2;
43105
b1d99aa9f29f 8153250: java.io.File does not handle Windows paths of the form "D:" (no path) correctly
bpb
parents: 42777
diff changeset
   248
            } else if (!isDirectoryRelative) {
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   249
                /* Drop prefix when child is drive-relative */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   250
                childStart = 1;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   251
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   252
            }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   253
            if (cn == childStart) { // Child is double slash
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   254
                if (parent.charAt(pn - 1) == slash)
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   255
                    return parent.substring(0, pn - 1);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   256
                return parent;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   257
            }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   258
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   259
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   260
        if (parent.charAt(pn - 1) == slash)
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   261
            parentEnd--;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   262
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   263
        int strlen = parentEnd + cn - childStart;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   264
        char[] theChars = null;
43105
b1d99aa9f29f 8153250: java.io.File does not handle Windows paths of the form "D:" (no path) correctly
bpb
parents: 42777
diff changeset
   265
        if (child.charAt(childStart) == slash || isDirectoryRelative) {
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   266
            theChars = new char[strlen];
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   267
            parent.getChars(0, parentEnd, theChars, 0);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   268
            child.getChars(childStart, cn, theChars, parentEnd);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   269
        } else {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   270
            theChars = new char[strlen + 1];
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   271
            parent.getChars(0, parentEnd, theChars, 0);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   272
            theChars[parentEnd] = slash;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   273
            child.getChars(childStart, cn, theChars, parentEnd + 1);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   274
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   275
        return new String(theChars);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   276
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   277
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   278
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   279
    public String getDefaultParent() {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   280
        return ("" + slash);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   281
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   283
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   284
    public String fromURIPath(String path) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   285
        String p = path;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   286
        if ((p.length() > 2) && (p.charAt(2) == ':')) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   287
            // "/c:/foo" --> "c:/foo"
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   288
            p = p.substring(1);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   289
            // "c:/foo/" --> "c:/foo", but "c:/" --> "c:/"
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   290
            if ((p.length() > 3) && p.endsWith("/"))
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   291
                p = p.substring(0, p.length() - 1);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   292
        } else if ((p.length() > 1) && p.endsWith("/")) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   293
            // "/foo/" --> "/foo"
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   294
            p = p.substring(0, p.length() - 1);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   295
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   296
        return p;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   297
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   298
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   299
    /* -- Path operations -- */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   300
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   301
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   302
    public boolean isAbsolute(File f) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   303
        int pl = f.getPrefixLength();
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   304
        return (((pl == 2) && (f.getPath().charAt(0) == slash))
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   305
                || (pl == 3));
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   306
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   307
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   308
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   309
    public String resolve(File f) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   310
        String path = f.getPath();
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   311
        int pl = f.getPrefixLength();
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   312
        if ((pl == 2) && (path.charAt(0) == slash))
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   313
            return path;                        /* UNC */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   314
        if (pl == 3)
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   315
            return path;                        /* Absolute local */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   316
        if (pl == 0)
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   317
            return getUserPath() + slashify(path); /* Completely relative */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   318
        if (pl == 1) {                          /* Drive-relative */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   319
            String up = getUserPath();
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   320
            String ud = getDrive(up);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   321
            if (ud != null) return ud + path;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   322
            return up + path;                   /* User dir is a UNC path */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   323
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   324
        if (pl == 2) {                          /* Directory-relative */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   325
            String up = getUserPath();
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   326
            String ud = getDrive(up);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   327
            if ((ud != null) && path.startsWith(ud))
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   328
                return up + slashify(path.substring(2));
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   329
            char drive = path.charAt(0);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   330
            String dir = getDriveDirectory(drive);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   331
            String np;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   332
            if (dir != null) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   333
                /* When resolving a directory-relative path that refers to a
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   334
                   drive other than the current drive, insist that the caller
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   335
                   have read permission on the result */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   336
                String p = drive + (':' + dir + slashify(path.substring(2)));
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   337
                SecurityManager security = System.getSecurityManager();
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   338
                try {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   339
                    if (security != null) security.checkRead(p);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   340
                } catch (SecurityException x) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   341
                    /* Don't disclose the drive's directory in the exception */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   342
                    throw new SecurityException("Cannot resolve path " + path);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   343
                }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   344
                return p;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   345
            }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   346
            return drive + ":" + slashify(path.substring(2)); /* fake it */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   347
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   348
        throw new InternalError("Unresolvable path: " + path);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   349
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   350
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   351
    private String getUserPath() {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   352
        /* For both compatibility and security,
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   353
           we must look this up every time */
48927
847a988152b8 8194154: System property user.dir should not be changed
minqi
parents: 47216
diff changeset
   354
        SecurityManager sm = System.getSecurityManager();
847a988152b8 8194154: System property user.dir should not be changed
minqi
parents: 47216
diff changeset
   355
        if (sm != null) {
847a988152b8 8194154: System property user.dir should not be changed
minqi
parents: 47216
diff changeset
   356
            sm.checkPropertyAccess("user.dir");
847a988152b8 8194154: System property user.dir should not be changed
minqi
parents: 47216
diff changeset
   357
        }
847a988152b8 8194154: System property user.dir should not be changed
minqi
parents: 47216
diff changeset
   358
        return normalize(userDir);
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   359
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   360
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   361
    private String getDrive(String path) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   362
        int pl = prefixLength(path);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   363
        return (pl == 3) ? path.substring(0, 2) : null;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   364
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   365
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   366
    private static String[] driveDirCache = new String[26];
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   367
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   368
    private static int driveIndex(char d) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   369
        if ((d >= 'a') && (d <= 'z')) return d - 'a';
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   370
        if ((d >= 'A') && (d <= 'Z')) return d - 'A';
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   371
        return -1;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   372
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   373
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   374
    private native String getDriveDirectory(int drive);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   375
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   376
    private String getDriveDirectory(char drive) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   377
        int i = driveIndex(drive);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   378
        if (i < 0) return null;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   379
        String s = driveDirCache[i];
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   380
        if (s != null) return s;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   381
        s = getDriveDirectory(i + 1);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   382
        driveDirCache[i] = s;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   383
        return s;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   384
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   385
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   386
    // Caches for canonicalization results to improve startup performance.
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   387
    // The first cache handles repeated canonicalizations of the same path
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   388
    // name. The prefix cache handles repeated canonicalizations within the
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   389
    // same directory, and must not create results differing from the true
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   390
    // canonicalization algorithm in canonicalize_md.c. For this reason the
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   391
    // prefix cache is conservative and is not used for complex path names.
51517
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
   392
    private final ExpiringCache cache;
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
   393
    private final ExpiringCache prefixCache;
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   394
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   395
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   396
    public String canonicalize(String path) throws IOException {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   397
        // If path is a drive letter only then skip canonicalization
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   398
        int len = path.length();
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   399
        if ((len == 2) &&
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   400
            (isLetter(path.charAt(0))) &&
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   401
            (path.charAt(1) == ':')) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   402
            char c = path.charAt(0);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   403
            if ((c >= 'A') && (c <= 'Z'))
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   404
                return path;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   405
            return "" + ((char) (c-32)) + ':';
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   406
        } else if ((len == 3) &&
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   407
                   (isLetter(path.charAt(0))) &&
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   408
                   (path.charAt(1) == ':') &&
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   409
                   (path.charAt(2) == '\\')) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   410
            char c = path.charAt(0);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   411
            if ((c >= 'A') && (c <= 'Z'))
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   412
                return path;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   413
            return "" + ((char) (c-32)) + ':' + '\\';
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   414
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   415
        if (!useCanonCaches) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   416
            return canonicalize0(path);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   417
        } else {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   418
            String res = cache.get(path);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   419
            if (res == null) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   420
                String dir = null;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   421
                String resDir = null;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   422
                if (useCanonPrefixCache) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   423
                    dir = parentOrNull(path);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   424
                    if (dir != null) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   425
                        resDir = prefixCache.get(dir);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   426
                        if (resDir != null) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   427
                            /*
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   428
                             * Hit only in prefix cache; full path is canonical,
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   429
                             * but we need to get the canonical name of the file
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   430
                             * in this directory to get the appropriate
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   431
                             * capitalization
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   432
                             */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   433
                            String filename = path.substring(1 + dir.length());
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   434
                            res = canonicalizeWithPrefix(resDir, filename);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   435
                            cache.put(dir + File.separatorChar + filename, res);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   436
                        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   437
                    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   438
                }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   439
                if (res == null) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   440
                    res = canonicalize0(path);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   441
                    cache.put(path, res);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   442
                    if (useCanonPrefixCache && dir != null) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   443
                        resDir = parentOrNull(res);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   444
                        if (resDir != null) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   445
                            File f = new File(res);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   446
                            if (f.exists() && !f.isDirectory()) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   447
                                prefixCache.put(dir, resDir);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   448
                            }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   449
                        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   450
                    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   451
                }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   452
            }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   453
            return res;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   454
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   455
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   456
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   457
    private native String canonicalize0(String path)
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   458
            throws IOException;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   459
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   460
    private String canonicalizeWithPrefix(String canonicalPrefix,
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   461
            String filename) throws IOException
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   462
    {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   463
        return canonicalizeWithPrefix0(canonicalPrefix,
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   464
                canonicalPrefix + File.separatorChar + filename);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   465
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   466
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   467
    // Run the canonicalization operation assuming that the prefix
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   468
    // (everything up to the last filename) is canonical; just gets
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   469
    // the canonical name of the last element of the path
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   470
    private native String canonicalizeWithPrefix0(String canonicalPrefix,
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   471
            String pathWithCanonicalPrefix)
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   472
            throws IOException;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   473
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   474
    // Best-effort attempt to get parent of this path; used for
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   475
    // optimization of filename canonicalization. This must return null for
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   476
    // any cases where the code in canonicalize_md.c would throw an
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   477
    // exception or otherwise deal with non-simple pathnames like handling
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   478
    // of "." and "..". It may conservatively return null in other
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   479
    // situations as well. Returning null will cause the underlying
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   480
    // (expensive) canonicalization routine to be called.
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   481
    private static String parentOrNull(String path) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   482
        if (path == null) return null;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   483
        char sep = File.separatorChar;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   484
        char altSep = '/';
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   485
        int last = path.length() - 1;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   486
        int idx = last;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   487
        int adjacentDots = 0;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   488
        int nonDotCount = 0;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   489
        while (idx > 0) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   490
            char c = path.charAt(idx);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   491
            if (c == '.') {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   492
                if (++adjacentDots >= 2) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   493
                    // Punt on pathnames containing . and ..
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   494
                    return null;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   495
                }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   496
                if (nonDotCount == 0) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   497
                    // Punt on pathnames ending in a .
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   498
                    return null;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   499
                }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   500
            } else if (c == sep) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   501
                if (adjacentDots == 1 && nonDotCount == 0) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   502
                    // Punt on pathnames containing . and ..
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   503
                    return null;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   504
                }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   505
                if (idx == 0 ||
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   506
                    idx >= last - 1 ||
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   507
                    path.charAt(idx - 1) == sep ||
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   508
                    path.charAt(idx - 1) == altSep) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   509
                    // Punt on pathnames containing adjacent slashes
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   510
                    // toward the end
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   511
                    return null;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   512
                }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   513
                return path.substring(0, idx);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   514
            } else if (c == altSep) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   515
                // Punt on pathnames containing both backward and
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   516
                // forward slashes
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   517
                return null;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   518
            } else if (c == '*' || c == '?') {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   519
                // Punt on pathnames containing wildcards
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   520
                return null;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   521
            } else {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   522
                ++nonDotCount;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   523
                adjacentDots = 0;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   524
            }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   525
            --idx;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   526
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   527
        return null;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   528
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
    /* -- Attribute accessors -- */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   531
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   532
    @Override
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   533
    public native int getBooleanAttributes(File f);
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   534
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   535
    @Override
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   536
    public native boolean checkAccess(File f, int access);
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   537
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   538
    @Override
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   539
    public native long getLastModifiedTime(File f);
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   540
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   541
    @Override
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   542
    public native long getLength(File f);
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   543
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   544
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   545
    public native boolean setPermission(File f, int access, boolean enable,
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   546
            boolean owneronly);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   547
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   548
    /* -- File operations -- */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   549
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   550
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   551
    public native boolean createFileExclusively(String path)
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   552
            throws IOException;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   553
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   554
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   555
    public native String[] list(File f);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   556
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   557
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   558
    public native boolean createDirectory(File f);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   559
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   560
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   561
    public native boolean setLastModifiedTime(File f, long time);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   562
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   563
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   564
    public native boolean setReadOnly(File f);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   565
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   566
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   567
    public boolean delete(File f) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   568
        // Keep canonicalization caches in sync after file deletion
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   569
        // and renaming operations. Could be more clever than this
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   570
        // (i.e., only remove/update affected entries) but probably
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   571
        // not worth it since these entries expire after 30 seconds
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   572
        // anyway.
51517
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
   573
        if (useCanonCaches) {
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
   574
            cache.clear();
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
   575
        }
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
   576
        if (useCanonPrefixCache) {
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
   577
            prefixCache.clear();
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
   578
        }
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   579
        return delete0(f);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   580
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   581
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   582
    private native boolean delete0(File f);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   583
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   584
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   585
    public boolean rename(File f1, File f2) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   586
        // Keep canonicalization caches in sync after file deletion
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   587
        // and renaming operations. Could be more clever than this
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   588
        // (i.e., only remove/update affected entries) but probably
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   589
        // not worth it since these entries expire after 30 seconds
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   590
        // anyway.
51517
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
   591
        if (useCanonCaches) {
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
   592
            cache.clear();
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
   593
        }
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
   594
        if (useCanonPrefixCache) {
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
   595
            prefixCache.clear();
edcf0d527658 8209837: Avoid initializing ExpiringCache during bootstrap
redestad
parents: 49281
diff changeset
   596
        }
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   597
        return rename0(f1, f2);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   598
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   599
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   600
    private native boolean rename0(File f1, File f2);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   601
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   602
    /* -- Filesystem interface -- */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   603
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   604
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   605
    public File[] listRoots() {
45715
5770e935238b 8182710: File.listRoots() always returns the root of CD drive
bpb
parents: 43105
diff changeset
   606
        return BitSet
5770e935238b 8182710: File.listRoots() always returns the root of CD drive
bpb
parents: 43105
diff changeset
   607
            .valueOf(new long[] {listRoots0()})
5770e935238b 8182710: File.listRoots() always returns the root of CD drive
bpb
parents: 43105
diff changeset
   608
            .stream()
5770e935238b 8182710: File.listRoots() always returns the root of CD drive
bpb
parents: 43105
diff changeset
   609
            .mapToObj(i -> new File((char)('A' + i) + ":" + slash))
5770e935238b 8182710: File.listRoots() always returns the root of CD drive
bpb
parents: 43105
diff changeset
   610
            .filter(f -> access(f.getPath()) && f.exists())
5770e935238b 8182710: File.listRoots() always returns the root of CD drive
bpb
parents: 43105
diff changeset
   611
            .toArray(File[]::new);
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   612
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   613
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   614
    private static native int listRoots0();
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   615
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   616
    private boolean access(String path) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   617
        try {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   618
            SecurityManager security = System.getSecurityManager();
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   619
            if (security != null) security.checkRead(path);
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   620
            return true;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   621
        } catch (SecurityException x) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   622
            return false;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   623
        }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   624
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   625
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   626
    /* -- Disk usage -- */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   627
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   628
    @Override
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   629
    public long getSpace(File f, int t) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   630
        if (f.exists()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   631
            return getSpace0(f, t);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   632
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   633
        return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   634
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   635
90ce3da70b43 Initial load
duke
parents:
diff changeset
   636
    private native long getSpace0(File f, int t);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   637
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   638
    /* -- Basic infrastructure -- */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   639
42777
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   640
    // Obtain maximum file component length from GetVolumeInformation which
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   641
    // expects the path to be null or a root component ending in a backslash
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   642
    private native int getNameMax0(String path);
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   643
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   644
    public int getNameMax(String path) {
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   645
        String s = null;
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   646
        if (path != null) {
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   647
            File f = new File(path);
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   648
            if (f.isAbsolute()) {
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   649
                Path root = f.toPath().getRoot();
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   650
                if (root != null) {
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   651
                    s = root.toString();
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   652
                    if (!s.endsWith("\\")) {
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   653
                        s = s + "\\";
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   654
                    }
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   655
                }
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   656
            }
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   657
        }
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   658
        return getNameMax0(s);
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   659
    }
a94fc33e9866 8148023: File.createTempFile is not adhering to the contract regarding file name lengths
bpb
parents: 37781
diff changeset
   660
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   661
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   662
    public int compare(File f1, File f2) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   663
        return f1.getPath().compareToIgnoreCase(f2.getPath());
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   664
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   665
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   666
    @Override
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   667
    public int hashCode(File f) {
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   668
        /* Could make this more efficient: String.hashCodeIgnoreCase */
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   669
        return f.getPath().toLowerCase(Locale.ENGLISH).hashCode() ^ 1234321;
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   670
    }
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   671
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   672
    private static native void initIDs();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   673
90ce3da70b43 Initial load
duke
parents:
diff changeset
   674
    static {
14177
007c2f91d22b 7186817: Remove Windows 95/98/ME Support
dxu
parents: 5506
diff changeset
   675
        initIDs();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   676
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   677
}