jdk/src/java.base/share/classes/jdk/internal/jrtfs/JrtPath.java
author sherman
Fri, 15 Apr 2016 13:05:52 -0700
changeset 37365 9cc4eb4d7491
parent 36511 9d0388c6b336
child 41121 91734a3ed04b
permissions -rw-r--r--
8147460: Clean-up jrtfs implementation Reviewed-by: alanb, jlaskey, sundar
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     1
/*
37365
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
     2
 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     4
 *
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    10
 *
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    15
 * accompanied this code).
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    16
 *
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    20
 *
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    23
 * questions.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    24
 */
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    25
package jdk.internal.jrtfs;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    26
37365
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    27
import java.io.File;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    28
import java.io.IOException;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    29
import java.io.InputStream;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    30
import java.io.OutputStream;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    31
import java.net.URI;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    32
import java.net.URISyntaxException;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    33
import java.nio.channels.FileChannel;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    34
import java.nio.channels.SeekableByteChannel;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    35
import java.nio.file.*;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    36
import java.nio.file.DirectoryStream.Filter;;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    37
import java.nio.file.attribute.BasicFileAttributes;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    38
import java.nio.file.attribute.BasicFileAttributeView;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    39
import java.nio.file.attribute.FileAttribute;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    40
import java.nio.file.attribute.FileTime;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    41
import java.util.Iterator;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    42
import java.util.Map;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    43
import java.util.NoSuchElementException;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    44
import java.util.Objects;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    45
import java.util.Set;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    46
import static java.nio.file.StandardOpenOption.*;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    47
import static java.nio.file.StandardCopyOption.*;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    48
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 31673
diff changeset
    49
/**
37365
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    50
 * Base class for Path implementation of jrt file systems.
36511
9d0388c6b336 8142968: Module System implementation
alanb
parents: 31673
diff changeset
    51
 *
9d0388c6b336 8142968: Module System implementation
alanb
parents: 31673
diff changeset
    52
 * @implNote This class needs to maintain JDK 8 source compatibility.
9d0388c6b336 8142968: Module System implementation
alanb
parents: 31673
diff changeset
    53
 *
9d0388c6b336 8142968: Module System implementation
alanb
parents: 31673
diff changeset
    54
 * It is used internally in the JDK to implement jimage/jrtfs access,
9d0388c6b336 8142968: Module System implementation
alanb
parents: 31673
diff changeset
    55
 * but also compiled and delivered as part of the jrtfs.jar to support access
9d0388c6b336 8142968: Module System implementation
alanb
parents: 31673
diff changeset
    56
 * to the jimage file provided by the shipped JDK by tools running on JDK 8.
9d0388c6b336 8142968: Module System implementation
alanb
parents: 31673
diff changeset
    57
 */
37365
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    58
final class JrtPath implements Path {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    59
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    60
    final JrtFileSystem jrtfs;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    61
    private final String path;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    62
    private volatile int[] offsets;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    63
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    64
    JrtPath(JrtFileSystem jrtfs, String path) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    65
        this.jrtfs = jrtfs;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    66
        this.path = normalize(path);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    67
        this.resolved = null;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    68
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    69
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    70
    JrtPath(JrtFileSystem jrtfs, String path, boolean normalized) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    71
        this.jrtfs = jrtfs;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    72
        this.path = normalized ? path : normalize(path);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    73
        this.resolved = null;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    74
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    75
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    76
    final String getName() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    77
        return path;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    78
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    79
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    80
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    81
    public final JrtPath getRoot() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    82
        if (this.isAbsolute()) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    83
            return jrtfs.getRootPath();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    84
        } else {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    85
            return null;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    86
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    87
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    88
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    89
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    90
    public final JrtPath getFileName() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    91
        if (path.length() == 0)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    92
            return this;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    93
        if (path.length() == 1 && path.charAt(0) == '/')
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    94
            return null;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    95
        int off = path.lastIndexOf('/');
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    96
        if (off == -1)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    97
            return this;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    98
        return new JrtPath(jrtfs, path.substring(off + 1), true);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
    99
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   100
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   101
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   102
    public final JrtPath getParent() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   103
        initOffsets();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   104
        int count = offsets.length;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   105
        if (count == 0) {     // no elements so no parent
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   106
            return null;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   107
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   108
        int off = offsets[count - 1] - 1;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   109
        if (off <= 0) {       // parent is root only (may be null)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   110
            return getRoot();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   111
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   112
        return new JrtPath(jrtfs, path.substring(0, off));
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   113
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   114
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   115
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   116
    public final int getNameCount() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   117
        initOffsets();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   118
        return offsets.length;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   119
    }
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   120
37365
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   121
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   122
    public final JrtPath getName(int index) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   123
        initOffsets();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   124
        if (index < 0 || index >= offsets.length) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   125
            throw new IllegalArgumentException();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   126
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   127
        int begin = offsets[index];
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   128
        int end;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   129
        if (index == (offsets.length - 1)) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   130
            end = path.length();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   131
        } else {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   132
            end = offsets[index + 1];
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   133
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   134
        return new JrtPath(jrtfs, path.substring(begin, end));
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   135
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   136
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   137
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   138
    public final JrtPath subpath(int beginIndex, int endIndex) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   139
        initOffsets();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   140
        if (beginIndex < 0 || endIndex > offsets.length ||
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   141
            beginIndex >= endIndex) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   142
            throw new IllegalArgumentException();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   143
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   144
        // starting/ending offsets
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   145
        int begin = offsets[beginIndex];
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   146
        int end;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   147
        if (endIndex == offsets.length) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   148
            end = path.length();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   149
        } else {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   150
            end = offsets[endIndex];
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   151
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   152
        return new JrtPath(jrtfs, path.substring(begin, end));
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   153
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   154
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   155
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   156
    public final JrtPath toRealPath(LinkOption... options) throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   157
        return jrtfs.toRealPath(this, options);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   158
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   159
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   160
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   161
    public final JrtPath toAbsolutePath() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   162
        if (isAbsolute())
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   163
            return this;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   164
        return new JrtPath(jrtfs, "/" + path, true);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   165
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   166
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   167
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   168
    public final URI toUri() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   169
        try {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   170
            return new URI("jrt", toAbsolutePath().path, null);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   171
        } catch (URISyntaxException ex) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   172
            throw new AssertionError(ex);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   173
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   174
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   175
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   176
    private boolean equalsNameAt(JrtPath other, int index) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   177
        int mbegin = offsets[index];
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   178
        int mlen;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   179
        if (index == (offsets.length - 1)) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   180
            mlen = path.length() - mbegin;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   181
        } else {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   182
            mlen = offsets[index + 1] - mbegin - 1;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   183
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   184
        int obegin = other.offsets[index];
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   185
        int olen;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   186
        if (index == (other.offsets.length - 1)) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   187
            olen = other.path.length() - obegin;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   188
        } else {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   189
            olen = other.offsets[index + 1] - obegin - 1;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   190
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   191
        if (mlen != olen) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   192
            return false;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   193
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   194
        int n = 0;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   195
        while (n < mlen) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   196
            if (path.charAt(mbegin + n) != other.path.charAt(obegin + n)) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   197
                return false;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   198
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   199
            n++;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   200
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   201
        return true;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   202
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   203
37365
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   204
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   205
    public final JrtPath relativize(Path other) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   206
        final JrtPath o = checkPath(other);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   207
        if (o.equals(this)) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   208
            return new JrtPath(jrtfs, "", true);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   209
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   210
        if (path.length() == 0) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   211
            return o;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   212
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   213
        if (jrtfs != o.jrtfs || isAbsolute() != o.isAbsolute()) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   214
            throw new IllegalArgumentException();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   215
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   216
        final String tp = this.path;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   217
        final String op = o.path;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   218
        if (op.startsWith(tp)) {    // fast path
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   219
            int off = tp.length();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   220
            if (op.charAt(off - 1) == '/')
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   221
                return new JrtPath(jrtfs, op.substring(off), true);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   222
            if (op.charAt(off) == '/')
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   223
                return new JrtPath(jrtfs, op.substring(off + 1), true);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   224
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   225
        int mc = this.getNameCount();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   226
        int oc = o.getNameCount();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   227
        int n = Math.min(mc, oc);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   228
        int i = 0;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   229
        while (i < n) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   230
            if (!equalsNameAt(o, i)) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   231
                break;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   232
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   233
            i++;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   234
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   235
        int dotdots = mc - i;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   236
        int len = dotdots * 3 - 1;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   237
        if (i < oc) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   238
            len += (o.path.length() - o.offsets[i] + 1);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   239
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   240
        StringBuilder sb  = new StringBuilder(len);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   241
        while (dotdots > 0) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   242
            sb.append("..");
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   243
            if (sb.length() < len) {  // no tailing slash at the end
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   244
                sb.append('/');
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   245
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   246
            dotdots--;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   247
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   248
        if (i < oc) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   249
            sb.append(o.path, o.offsets[i], o.path.length());
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   250
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   251
        return new JrtPath(jrtfs, sb.toString(), true);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   252
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   253
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   254
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   255
    public JrtFileSystem getFileSystem() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   256
        return jrtfs;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   257
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   258
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   259
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   260
    public final boolean isAbsolute() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   261
        return path.length() > 0 && path.charAt(0) == '/';
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   262
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   263
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   264
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   265
    public final JrtPath resolve(Path other) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   266
        final JrtPath o = checkPath(other);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   267
        if (this.path.length() == 0 || o.isAbsolute()) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   268
            return o;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   269
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   270
        if (o.path.length() == 0) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   271
            return this;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   272
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   273
        StringBuilder sb = new StringBuilder(path.length() + o.path.length());
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   274
        sb.append(path);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   275
        if (path.charAt(path.length() - 1) != '/')
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   276
            sb.append('/');
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   277
        sb.append(o.path);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   278
        return new JrtPath(jrtfs, sb.toString(), true);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   279
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   280
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   281
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   282
    public final Path resolveSibling(Path other) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   283
        Objects.requireNonNull(other, "other");
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   284
        Path parent = getParent();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   285
        return (parent == null) ? other : parent.resolve(other);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   286
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   287
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   288
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   289
    public final boolean startsWith(Path other) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   290
        if (!(Objects.requireNonNull(other) instanceof JrtPath))
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   291
            return false;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   292
        final JrtPath o = (JrtPath)other;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   293
        final String tp = this.path;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   294
        final String op = o.path;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   295
        if (isAbsolute() != o.isAbsolute() || !tp.startsWith(op)) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   296
            return false;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   297
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   298
        int off = op.length();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   299
        if (off == 0) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   300
            return tp.length() == 0;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   301
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   302
        // check match is on name boundary
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   303
        return tp.length() == off || tp.charAt(off) == '/' ||
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   304
               off == 0 || op.charAt(off - 1) == '/';
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   305
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   306
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   307
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   308
    public final boolean endsWith(Path other) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   309
        if (!(Objects.requireNonNull(other) instanceof JrtPath))
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   310
            return false;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   311
        final JrtPath o = (JrtPath)other;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   312
        final JrtPath t = this;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   313
        int olast = o.path.length() - 1;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   314
        if (olast > 0 && o.path.charAt(olast) == '/') {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   315
            olast--;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   316
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   317
        int last = t.path.length() - 1;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   318
        if (last > 0 && t.path.charAt(last) == '/') {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   319
            last--;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   320
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   321
        if (olast == -1) {  // o.path.length == 0
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   322
            return last == -1;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   323
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   324
        if ((o.isAbsolute() && (!t.isAbsolute() || olast != last))
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   325
            || last < olast) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   326
            return false;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   327
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   328
        for (; olast >= 0; olast--, last--) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   329
            if (o.path.charAt(olast) != t.path.charAt(last)) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   330
                return false;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   331
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   332
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   333
        return o.path.charAt(olast + 1) == '/' ||
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   334
               last == -1 || t.path.charAt(last) == '/';
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   335
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   336
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   337
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   338
    public final JrtPath resolve(String other) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   339
        return resolve(getFileSystem().getPath(other));
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   340
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   341
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   342
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   343
    public final Path resolveSibling(String other) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   344
        return resolveSibling(getFileSystem().getPath(other));
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   345
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   346
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   347
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   348
    public final boolean startsWith(String other) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   349
        return startsWith(getFileSystem().getPath(other));
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   350
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   351
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   352
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   353
    public final boolean endsWith(String other) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   354
        return endsWith(getFileSystem().getPath(other));
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   355
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   356
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   357
    @Override
37365
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   358
    public final JrtPath normalize() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   359
        String res = getResolved();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   360
        if (res == path) {  // no change
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   361
            return this;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   362
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   363
        return new JrtPath(jrtfs, res, true);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   364
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   365
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   366
    private JrtPath checkPath(Path path) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   367
        Objects.requireNonNull(path);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   368
        if (!(path instanceof JrtPath))
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   369
            throw new ProviderMismatchException();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   370
        return (JrtPath) path;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   371
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   372
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   373
    // create offset list if not already created
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   374
    private void initOffsets() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   375
        if (this.offsets == null) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   376
            int len = path.length();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   377
            // count names
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   378
            int count = 0;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   379
            int off = 0;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   380
            while (off < len) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   381
                char c = path.charAt(off++);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   382
                if (c != '/') {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   383
                    count++;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   384
                    off = path.indexOf('/', off);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   385
                    if (off == -1)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   386
                        break;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   387
                }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   388
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   389
            // populate offsets
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   390
            int[] offsets = new int[count];
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   391
            count = 0;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   392
            off = 0;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   393
            while (off < len) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   394
                char c = path.charAt(off);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   395
                if (c == '/') {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   396
                    off++;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   397
                } else {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   398
                    offsets[count++] = off++;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   399
                    off = path.indexOf('/', off);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   400
                    if (off == -1)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   401
                        break;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   402
                }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   403
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   404
            this.offsets = offsets;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   405
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   406
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   407
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   408
    private volatile String resolved;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   409
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   410
    final String getResolvedPath() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   411
        String r = resolved;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   412
        if (r == null) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   413
            if (isAbsolute()) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   414
                r = getResolved();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   415
            } else {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   416
                r = toAbsolutePath().getResolvedPath();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   417
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   418
            resolved = r;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   419
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   420
        return r;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   421
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   422
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   423
    // removes redundant slashs, replace "\" to separator "/"
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   424
    // and check for invalid characters
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   425
    private static String normalize(String path) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   426
        int len = path.length();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   427
        if (len == 0) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   428
            return path;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   429
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   430
        char prevC = 0;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   431
        for (int i = 0; i < len; i++) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   432
            char c = path.charAt(i);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   433
            if (c == '\\' || c == '\u0000') {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   434
                return normalize(path, i);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   435
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   436
            if (c == '/' && prevC == '/') {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   437
                return normalize(path, i - 1);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   438
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   439
            prevC = c;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   440
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   441
        if (prevC == '/' && len > 1) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   442
            return path.substring(0, len - 1);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   443
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   444
        return path;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   445
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   446
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   447
    private static String normalize(String path, int off) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   448
        int len = path.length();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   449
        StringBuilder to = new StringBuilder(len);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   450
        to.append(path, 0, off);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   451
        char prevC = 0;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   452
        while (off < len) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   453
            char c = path.charAt(off++);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   454
            if (c == '\\') {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   455
                c = '/';
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   456
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   457
            if (c == '/' && prevC == '/') {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   458
                continue;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   459
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   460
            if (c == '\u0000') {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   461
                throw new InvalidPathException(path,
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   462
                        "Path: nul character not allowed");
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   463
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   464
            to.append(c);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   465
            prevC = c;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   466
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   467
        len = to.length();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   468
        if (len > 1 && to.charAt(len - 1) == '/') {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   469
            to.deleteCharAt(len - 1);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   470
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   471
        return to.toString();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   472
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   473
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   474
    // Remove DotSlash(./) and resolve DotDot (..) components
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   475
    private String getResolved() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   476
        if (path.length() == 0) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   477
            return path;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   478
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   479
        if (path.indexOf('.') == -1) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   480
            return path;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   481
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   482
        int length = path.length();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   483
        char[] to = new char[length];
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   484
        int nc = getNameCount();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   485
        int[] lastM = new int[nc];
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   486
        int lastMOff = -1;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   487
        int m = 0;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   488
        for (int i = 0; i < nc; i++) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   489
            int n = offsets[i];
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   490
            int len = (i == offsets.length - 1) ? length - n
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   491
                                                : offsets[i + 1] - n - 1;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   492
            if (len == 1 && path.charAt(n) == '.') {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   493
                if (m == 0 && path.charAt(0) == '/')   // absolute path
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   494
                    to[m++] = '/';
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   495
                continue;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   496
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   497
            if (len == 2 && path.charAt(n) == '.' && path.charAt(n + 1) == '.') {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   498
                if (lastMOff >= 0) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   499
                    m = lastM[lastMOff--];    // retreat
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   500
                    continue;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   501
                }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   502
                if (path.charAt(0) == '/') {  // "/../xyz" skip
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   503
                    if (m == 0)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   504
                        to[m++] = '/';
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   505
                } else {                      // "../xyz" -> "../xyz"
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   506
                    if (m != 0 && to[m-1] != '/')
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   507
                        to[m++] = '/';
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   508
                    while (len-- > 0)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   509
                        to[m++] = path.charAt(n++);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   510
                }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   511
                continue;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   512
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   513
            if (m == 0 && path.charAt(0) == '/' ||   // absolute path
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   514
                m != 0 && to[m-1] != '/') {   // not the first name
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   515
                to[m++] = '/';
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   516
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   517
            lastM[++lastMOff] = m;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   518
            while (len-- > 0)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   519
                to[m++] = path.charAt(n++);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   520
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   521
        if (m > 1 && to[m - 1] == '/')
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   522
            m--;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   523
        return (m == to.length) ? new String(to) : new String(to, 0, m);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   524
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   525
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   526
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   527
    public final String toString() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   528
        return path;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   529
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   530
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   531
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   532
    public final int hashCode() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   533
        return path.hashCode();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   534
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   535
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   536
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   537
    public final boolean equals(Object obj) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   538
        return obj instanceof JrtPath &&
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   539
               this.path.equals(((JrtPath) obj).path);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   540
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   541
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   542
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   543
    public final int compareTo(Path other) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   544
        final JrtPath o = checkPath(other);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   545
        return path.compareTo(o.path);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   546
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   547
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   548
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   549
    public final WatchKey register(
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   550
            WatchService watcher,
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   551
            WatchEvent.Kind<?>[] events,
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   552
            WatchEvent.Modifier... modifiers) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   553
        Objects.requireNonNull(watcher, "watcher");
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   554
        Objects.requireNonNull(events, "events");
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   555
        Objects.requireNonNull(modifiers, "modifiers");
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   556
        throw new UnsupportedOperationException();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   557
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   558
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   559
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   560
    public final WatchKey register(WatchService watcher, WatchEvent.Kind<?>... events) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   561
        return register(watcher, events, new WatchEvent.Modifier[0]);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   562
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   563
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   564
    @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   565
    public final File toFile() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   566
        throw new UnsupportedOperationException();
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   567
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   568
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   569
    @Override
37365
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   570
    public final Iterator<Path> iterator() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   571
        return new Iterator<Path>() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   572
            private int i = 0;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   573
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   574
            @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   575
            public boolean hasNext() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   576
                return (i < getNameCount());
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   577
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   578
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   579
            @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   580
            public Path next() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   581
                if (i < getNameCount()) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   582
                    Path result = getName(i);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   583
                    i++;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   584
                    return result;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   585
                } else {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   586
                    throw new NoSuchElementException();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   587
                }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   588
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   589
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   590
            @Override
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   591
            public void remove() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   592
                throw new ReadOnlyFileSystemException();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   593
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   594
        };
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   595
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   596
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   597
    // Helpers for JrtFileSystemProvider and JrtFileSystem
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   598
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   599
    final JrtPath readSymbolicLink() throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   600
        if (!jrtfs.isLink(this)) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   601
            throw new IOException("not a symbolic link");
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   602
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   603
        return jrtfs.resolveLink(this);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   604
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   605
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   606
    final boolean isHidden() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   607
        return false;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   608
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   609
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   610
    final void createDirectory(FileAttribute<?>... attrs)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   611
            throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   612
        jrtfs.createDirectory(this, attrs);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   613
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   614
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   615
    final InputStream newInputStream(OpenOption... options) throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   616
        if (options.length > 0) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   617
            for (OpenOption opt : options) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   618
                if (opt != READ) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   619
                    throw new UnsupportedOperationException("'" + opt + "' not allowed");
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   620
                }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   621
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   622
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   623
        return jrtfs.newInputStream(this);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   624
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   625
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   626
    final DirectoryStream<Path> newDirectoryStream(Filter<? super Path> filter)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   627
            throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   628
        return new JrtDirectoryStream(this, filter);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   629
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   630
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   631
    final void delete() throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   632
        jrtfs.deleteFile(this, true);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   633
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   634
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   635
    final void deleteIfExists() throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   636
        jrtfs.deleteFile(this, false);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   637
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   638
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   639
    final JrtFileAttributes getAttributes(LinkOption... options) throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   640
        JrtFileAttributes zfas = jrtfs.getFileAttributes(this, options);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   641
        if (zfas == null) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   642
            throw new NoSuchFileException(toString());
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   643
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   644
        return zfas;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   645
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   646
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   647
    final void setAttribute(String attribute, Object value, LinkOption... options)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   648
            throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   649
        JrtFileAttributeView.setAttribute(this, attribute, value);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   650
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   651
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   652
    final Map<String, Object> readAttributes(String attributes, LinkOption... options)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   653
            throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   654
        return JrtFileAttributeView.readAttributes(this, attributes, options);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   655
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   656
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   657
    final void setTimes(FileTime mtime, FileTime atime, FileTime ctime)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   658
            throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   659
        jrtfs.setTimes(this, mtime, atime, ctime);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   660
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   661
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   662
    final FileStore getFileStore() throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   663
        // each JrtFileSystem only has one root (as requested for now)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   664
        if (exists()) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   665
            return jrtfs.getFileStore(this);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   666
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   667
        throw new NoSuchFileException(path);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   668
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   669
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   670
    final boolean isSameFile(Path other) throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   671
        if (this == other || this.equals(other)) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   672
            return true;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   673
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   674
        if (other == null || this.getFileSystem() != other.getFileSystem()) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   675
            return false;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   676
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   677
        this.checkAccess();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   678
        JrtPath o = (JrtPath) other;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   679
        o.checkAccess();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   680
        return this.getResolvedPath().equals(o.getResolvedPath()) ||
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   681
               jrtfs.isSameFile(this, o);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   682
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   683
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   684
    final SeekableByteChannel newByteChannel(Set<? extends OpenOption> options,
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   685
                                             FileAttribute<?>... attrs)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   686
            throws IOException
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   687
    {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   688
        return jrtfs.newByteChannel(this, options, attrs);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   689
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   690
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   691
    final FileChannel newFileChannel(Set<? extends OpenOption> options,
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   692
            FileAttribute<?>... attrs)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   693
            throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   694
        return jrtfs.newFileChannel(this, options, attrs);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   695
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   696
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   697
    final void checkAccess(AccessMode... modes) throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   698
        if (modes.length == 0) {    // check if the path exists
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   699
            jrtfs.checkNode(this);  // no need to follow link. the "link" node
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   700
                                    // is built from real node under "/module"
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   701
        } else {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   702
            boolean w = false;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   703
            for (AccessMode mode : modes) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   704
                switch (mode) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   705
                    case READ:
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   706
                        break;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   707
                    case WRITE:
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   708
                        w = true;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   709
                        break;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   710
                    case EXECUTE:
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   711
                        throw new AccessDeniedException(toString());
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   712
                    default:
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   713
                        throw new UnsupportedOperationException();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   714
                }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   715
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   716
            jrtfs.checkNode(this);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   717
            if (w && jrtfs.isReadOnly()) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   718
                throw new AccessDeniedException(toString());
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   719
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   720
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   721
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   722
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   723
    final boolean exists() {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   724
        try {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   725
            return jrtfs.exists(this);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   726
        } catch (IOException x) {}
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   727
        return false;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   728
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   729
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   730
    final OutputStream newOutputStream(OpenOption... options) throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   731
        if (options.length == 0) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   732
            return jrtfs.newOutputStream(this, CREATE_NEW, WRITE);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   733
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   734
        return jrtfs.newOutputStream(this, options);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   735
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   736
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   737
    final void move(JrtPath target, CopyOption... options) throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   738
        if (this.jrtfs == target.jrtfs) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   739
            jrtfs.copyFile(true, this, target, options);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   740
        } else {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   741
            copyToTarget(target, options);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   742
            delete();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   743
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   744
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   745
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   746
    final void copy(JrtPath target, CopyOption... options) throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   747
        if (this.jrtfs == target.jrtfs) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   748
            jrtfs.copyFile(false, this, target, options);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   749
        } else {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   750
            copyToTarget(target, options);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   751
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   752
    }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   753
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   754
    private void copyToTarget(JrtPath target, CopyOption... options)
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   755
            throws IOException {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   756
        boolean replaceExisting = false;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   757
        boolean copyAttrs = false;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   758
        for (CopyOption opt : options) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   759
            if (opt == REPLACE_EXISTING) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   760
                replaceExisting = true;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   761
            } else if (opt == COPY_ATTRIBUTES) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   762
                copyAttrs = true;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   763
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   764
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   765
        // attributes of source file
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   766
        BasicFileAttributes jrtfas = getAttributes();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   767
        // check if target exists
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   768
        boolean exists;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   769
        if (replaceExisting) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   770
            try {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   771
                target.deleteIfExists();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   772
                exists = false;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   773
            } catch (DirectoryNotEmptyException x) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   774
                exists = true;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   775
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   776
        } else {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   777
            exists = target.exists();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   778
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   779
        if (exists) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   780
            throw new FileAlreadyExistsException(target.toString());
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   781
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   782
        if (jrtfas.isDirectory()) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   783
            // create directory or file
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   784
            target.createDirectory();
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   785
        } else {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   786
            try (InputStream is = jrtfs.newInputStream(this);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   787
                 OutputStream os = target.newOutputStream()) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   788
                byte[] buf = new byte[8192];
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   789
                int n;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   790
                while ((n = is.read(buf)) != -1) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   791
                    os.write(buf, 0, n);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   792
                }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   793
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   794
        }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   795
        if (copyAttrs) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   796
            BasicFileAttributeView view =
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   797
                Files.getFileAttributeView(target, BasicFileAttributeView.class);
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   798
            try {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   799
                view.setTimes(jrtfas.lastModifiedTime(),
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   800
                              jrtfas.lastAccessTime(),
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   801
                              jrtfas.creationTime());
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   802
            } catch (IOException x) {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   803
                try {
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   804
                    target.delete();  // rollback?
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   805
                } catch (IOException ignore) {}
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   806
                throw x;
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   807
            }
9cc4eb4d7491 8147460: Clean-up jrtfs implementation
sherman
parents: 36511
diff changeset
   808
        }
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   809
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   810
}