author | jjg |
Mon, 07 Dec 2015 14:02:55 -0800 | |
changeset 34560 | b6a567b677f7 |
parent 31753 | 72417309a675 |
child 35807 | 2eb1d877da0f |
permissions | -rw-r--r-- |
4548 | 1 |
/* |
31753 | 2 |
* Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. |
4548 | 3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 |
* |
|
5 |
* This code is free software; you can redistribute it and/or modify it |
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
|
5520 | 7 |
* published by the Free Software Foundation. Oracle designates this |
4548 | 8 |
* particular file as subject to the "Classpath" exception as provided |
5520 | 9 |
* by Oracle in the LICENSE file that accompanied this code. |
4548 | 10 |
* |
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
|
15 |
* accompanied this code). |
|
16 |
* |
|
17 |
* You should have received a copy of the GNU General Public License version |
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
20 |
* |
|
5520 | 21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
22 |
* or visit www.oracle.com if you need additional information or have any |
|
23 |
* questions. |
|
4548 | 24 |
*/ |
25 |
||
29780
8f8e54a1fa20
8076420: Consolidate javac file handling in javac.file package
jjg
parents:
29291
diff
changeset
|
26 |
package com.sun.tools.javac.file; |
4548 | 27 |
|
28 |
import java.io.IOException; |
|
29 |
import java.io.InputStream; |
|
30 |
import java.io.InputStreamReader; |
|
31 |
import java.io.OutputStream; |
|
32 |
import java.io.OutputStreamWriter; |
|
33 |
import java.io.Reader; |
|
34 |
import java.io.Writer; |
|
35 |
import java.net.URI; |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
36 |
import java.net.URISyntaxException; |
4548 | 37 |
import java.nio.ByteBuffer; |
38 |
import java.nio.CharBuffer; |
|
39 |
import java.nio.charset.CharsetDecoder; |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
40 |
import java.nio.file.FileSystem; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
41 |
import java.nio.file.FileSystems; |
4548 | 42 |
import java.nio.file.Files; |
9084
0e6af03b5c9e
7029979: (fs) Path.toRealPath(boolean) should be toRealPath(LinkOption...)
alanb
parents:
8231
diff
changeset
|
43 |
import java.nio.file.LinkOption; |
4548 | 44 |
import java.nio.file.Path; |
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
45 |
import java.text.Normalizer; |
29291
076c277565f7
8073550: java* tools: replace obj.getClass hacks with Assert.checkNonNull or Objects.requireNonNull
mcimadamore
parents:
27579
diff
changeset
|
46 |
import java.util.Objects; |
29780
8f8e54a1fa20
8076420: Consolidate javac file handling in javac.file package
jjg
parents:
29291
diff
changeset
|
47 |
|
4548 | 48 |
import javax.lang.model.element.Modifier; |
49 |
import javax.lang.model.element.NestingKind; |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
50 |
import javax.tools.FileObject; |
4548 | 51 |
import javax.tools.JavaFileObject; |
52 |
||
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
53 |
import com.sun.tools.javac.file.RelativePath.RelativeFile; |
26266
2d24bda701dc
8056061: Mark implementations of public interfaces with an annotation
jlahoda
parents:
25874
diff
changeset
|
54 |
import com.sun.tools.javac.util.DefinedBy; |
2d24bda701dc
8056061: Mark implementations of public interfaces with an annotation
jlahoda
parents:
25874
diff
changeset
|
55 |
import com.sun.tools.javac.util.DefinedBy.Api; |
4548 | 56 |
|
57 |
||
58 |
/** |
|
59 |
* Implementation of JavaFileObject using java.nio.file API. |
|
60 |
* |
|
61 |
* <p>PathFileObjects are, for the most part, straightforward wrappers around |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
62 |
* immutable absolute Path objects. Different subtypes are used to provide |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
63 |
* specialized implementations of "inferBinaryName" and "getName" that capture |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
64 |
* additional information available at the time the object is created. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
65 |
* |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
66 |
* <p>In general, {@link JavaFileManager#isSameFile} should be used to |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
67 |
* determine whether two file objects refer to the same file on disk. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
68 |
* PathFileObject also supports the standard {@code equals} and {@code hashCode} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
69 |
* methods, primarily for convenience when working with collections. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
70 |
* All of these operations delegate to the equivalent operations on the |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
71 |
* underlying Path object. |
4548 | 72 |
* |
5847
1908176fd6e3
6944312: Potential rebranding issues in openjdk/langtools repository sources
jjg
parents:
5520
diff
changeset
|
73 |
* <p><b>This is NOT part of any supported API. |
1908176fd6e3
6944312: Potential rebranding issues in openjdk/langtools repository sources
jjg
parents:
5520
diff
changeset
|
74 |
* If you write code that depends on this, you do so at your own risk. |
4548 | 75 |
* This code and its internal interfaces are subject to change or |
76 |
* deletion without notice.</b> |
|
77 |
*/ |
|
27579 | 78 |
public abstract class PathFileObject implements JavaFileObject { |
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
79 |
private static final FileSystem defaultFileSystem = FileSystems.getDefault(); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
80 |
private static final boolean isMacOS = System.getProperty("os.name", "").contains("OS X"); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
81 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
82 |
protected final BaseFileManager fileManager; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
83 |
protected final Path path; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
84 |
private boolean hasParents; |
4548 | 85 |
|
86 |
/** |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
87 |
* Create a PathFileObject for a file within a directory, such that the |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
88 |
* binary name can be inferred from the relationship to an enclosing directory. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
89 |
* |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
90 |
* The binary name is derived from {@code relativePath}. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
91 |
* The name is derived from the composition of {@code userPackageRootDir} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
92 |
* and {@code relativePath}. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
93 |
* |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
94 |
* @param fileManager the file manager creating this file object |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
95 |
* @param path the absolute path referred to by this file object |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
96 |
* @param userPackageRootDir the path of the directory containing the |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
97 |
* root of the package hierarchy |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
98 |
* @param relativePath the path of this file relative to {@code userPackageRootDir} |
4548 | 99 |
*/ |
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
100 |
static PathFileObject forDirectoryPath(BaseFileManager fileManager, Path path, |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
101 |
Path userPackageRootDir, RelativePath relativePath) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
102 |
return new DirectoryFileObject(fileManager, path, userPackageRootDir, relativePath); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
103 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
104 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
105 |
private static class DirectoryFileObject extends PathFileObject { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
106 |
private final Path userPackageRootDir; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
107 |
private final RelativePath relativePath; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
108 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
109 |
private DirectoryFileObject(BaseFileManager fileManager, Path path, |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
110 |
Path userPackageRootDir, RelativePath relativePath) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
111 |
super(fileManager, path); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
112 |
this.userPackageRootDir = userPackageRootDir; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
113 |
this.relativePath = relativePath; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
114 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
115 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
116 |
@Override @DefinedBy(Api.COMPILER) |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
117 |
public String getName() { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
118 |
return relativePath.resolveAgainst(userPackageRootDir).toString(); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
119 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
120 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
121 |
@Override |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
122 |
public String inferBinaryName(Iterable<? extends Path> paths) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
123 |
return toBinaryName(relativePath); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
124 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
125 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
126 |
@Override |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
127 |
public String toString() { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
128 |
return "DirectoryFileObject[" + userPackageRootDir + ":" + relativePath.path + "]"; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
129 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
130 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
131 |
@Override |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
132 |
PathFileObject getSibling(String baseName) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
133 |
return new DirectoryFileObject(fileManager, |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
134 |
path.resolveSibling(baseName), |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
135 |
userPackageRootDir, |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
136 |
new RelativeFile(relativePath.dirname(), baseName) |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
137 |
); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
138 |
} |
4548 | 139 |
} |
140 |
||
141 |
/** |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
142 |
* Create a PathFileObject for a file in a file system such as a jar file, |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
143 |
* such that the binary name can be inferred from its position within the |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
144 |
* file system. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
145 |
* |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
146 |
* The binary name is derived from {@code path}. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
147 |
* The name is derived from the composition of {@code userJarPath} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
148 |
* and {@code path}. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
149 |
* |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
150 |
* @param fileManager the file manager creating this file object |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
151 |
* @param path the path referred to by this file object |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
152 |
* @param userJarPath the path of the jar file containing the file system. |
4548 | 153 |
*/ |
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
154 |
public static PathFileObject forJarPath(BaseFileManager fileManager, |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
155 |
Path path, Path userJarPath) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
156 |
return new JarFileObject(fileManager, path, userJarPath); |
4548 | 157 |
} |
158 |
||
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
159 |
private static class JarFileObject extends PathFileObject { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
160 |
private final Path userJarPath; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
161 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
162 |
private JarFileObject(BaseFileManager fileManager, Path path, Path userJarPath) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
163 |
super(fileManager, path); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
164 |
this.userJarPath = userJarPath; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
165 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
166 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
167 |
@Override @DefinedBy(Api.COMPILER) |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
168 |
public String getName() { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
169 |
// The use of ( ) to delimit the entry name is not ideal |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
170 |
// but it does match earlier behavior |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
171 |
return userJarPath + "(" + path + ")"; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
172 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
173 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
174 |
@Override |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
175 |
public String inferBinaryName(Iterable<? extends Path> paths) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
176 |
Path root = path.getFileSystem().getRootDirectories().iterator().next(); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
177 |
return toBinaryName(root.relativize(path)); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
178 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
179 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
180 |
@Override @DefinedBy(Api.COMPILER) |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
181 |
public URI toUri() { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
182 |
// Work around bug JDK-8134451: |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
183 |
// path.toUri() returns double-encoded URIs, that cannot be opened by URLConnection |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
184 |
return createJarUri(userJarPath, path.toString()); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
185 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
186 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
187 |
@Override |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
188 |
public String toString() { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
189 |
return "JarFileObject[" + userJarPath + ":" + path + "]"; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
190 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
191 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
192 |
@Override |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
193 |
PathFileObject getSibling(String baseName) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
194 |
return new JarFileObject(fileManager, |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
195 |
path.resolveSibling(baseName), |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
196 |
userJarPath |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
197 |
); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
198 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
199 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
200 |
private static URI createJarUri(Path jarFile, String entryName) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
201 |
URI jarURI = jarFile.toUri().normalize(); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
202 |
String separator = entryName.startsWith("/") ? "!" : "!/"; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
203 |
try { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
204 |
// The jar URI convention appears to be not to re-encode the jarURI |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
205 |
return new URI("jar:" + jarURI + separator + entryName); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
206 |
} catch (URISyntaxException e) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
207 |
throw new CannotCreateUriError(jarURI + separator + entryName, e); |
27579 | 208 |
} |
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
209 |
} |
27579 | 210 |
} |
211 |
||
212 |
/** |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
213 |
* Create a PathFileObject for a file in a modular file system, such as jrt:, |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
214 |
* such that the binary name can be inferred from its position within the |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
215 |
* filesystem. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
216 |
* |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
217 |
* The binary name is derived from {@code path}, ignoring the first two |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
218 |
* elements of the name (which are "modules" and a module name). |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
219 |
* The name is derived from {@code path}. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
220 |
* |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
221 |
* @param fileManager the file manager creating this file object |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
222 |
* @param path the path referred to by this file object |
4548 | 223 |
*/ |
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
224 |
public static PathFileObject forJRTPath(BaseFileManager fileManager, |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
225 |
final Path path) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
226 |
return new JRTFileObject(fileManager, path); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
227 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
228 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
229 |
private static class JRTFileObject extends PathFileObject { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
230 |
// private final Path javaHome; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
231 |
private JRTFileObject(BaseFileManager fileManager, Path path) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
232 |
super(fileManager, path); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
233 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
234 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
235 |
@Override @DefinedBy(Api.COMPILER) |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
236 |
public String getName() { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
237 |
return path.toString(); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
238 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
239 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
240 |
@Override |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
241 |
public String inferBinaryName(Iterable<? extends Path> paths) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
242 |
// use subpath to ignore the leading /modules/MODULE-NAME |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
243 |
return toBinaryName(path.subpath(2, path.getNameCount())); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
244 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
245 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
246 |
@Override |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
247 |
public String toString() { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
248 |
return "JRTFileObject[" + path + "]"; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
249 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
250 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
251 |
@Override |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
252 |
PathFileObject getSibling(String baseName) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
253 |
return new JRTFileObject(fileManager, |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
254 |
path.resolveSibling(baseName) |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
255 |
); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
256 |
} |
4548 | 257 |
} |
258 |
||
259 |
/** |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
260 |
* Create a PathFileObject for a file whose binary name must be inferred |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
261 |
* from its position on a search path. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
262 |
* |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
263 |
* The binary name is inferred by finding an enclosing directory in |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
264 |
* the sequence of paths associated with the location given to |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
265 |
* {@link JavaFileManager#inferBinaryName). |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
266 |
* The name is derived from {@code userPath}. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
267 |
* |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
268 |
* @param fileManager the file manager creating this file object |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
269 |
* @param path the path referred to by this file object |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
270 |
* @param userPath the "user-friendly" name for this path. |
4548 | 271 |
*/ |
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
272 |
static PathFileObject forSimplePath(BaseFileManager fileManager, |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
273 |
Path path, Path userPath) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
274 |
return new SimpleFileObject(fileManager, path, userPath); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
275 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
276 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
277 |
private static class SimpleFileObject extends PathFileObject { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
278 |
private final Path userPath; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
279 |
private SimpleFileObject(BaseFileManager fileManager, Path path, Path userPath) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
280 |
super(fileManager, path); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
281 |
this.userPath = userPath; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
282 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
283 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
284 |
@Override @DefinedBy(Api.COMPILER) |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
285 |
public String getName() { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
286 |
return userPath.toString(); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
287 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
288 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
289 |
@Override |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
290 |
public String inferBinaryName(Iterable<? extends Path> paths) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
291 |
Path absPath = path.toAbsolutePath(); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
292 |
for (Path p: paths) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
293 |
Path ap = p.toAbsolutePath(); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
294 |
if (absPath.startsWith(ap)) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
295 |
try { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
296 |
Path rp = ap.relativize(absPath); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
297 |
if (rp != null) // maybe null if absPath same as ap |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
298 |
return toBinaryName(rp); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
299 |
} catch (IllegalArgumentException e) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
300 |
// ignore this p if cannot relativize path to p |
4548 | 301 |
} |
302 |
} |
|
303 |
} |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
304 |
return null; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
305 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
306 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
307 |
@Override |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
308 |
PathFileObject getSibling(String baseName) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
309 |
return new SimpleFileObject(fileManager, |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
310 |
path.resolveSibling(baseName), |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
311 |
userPath.resolveSibling(baseName) |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
312 |
); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
313 |
} |
4548 | 314 |
} |
315 |
||
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
316 |
/** |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
317 |
* Create a PathFileObject, for a specified path, in the context of |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
318 |
* a given file manager. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
319 |
* |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
320 |
* In general, this path should be an |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
321 |
* {@link Path#toAbsolutePath absolute path}, if not a |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
322 |
* {@link Path#toRealPath} real path. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
323 |
* It will be used as the basis of {@code equals}, {@code hashCode} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
324 |
* and {@code isSameFile} methods on this file object. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
325 |
* |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
326 |
* A PathFileObject should also have a "friendly name" per the |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
327 |
* specification for {@link FileObject#getName}. The friendly name |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
328 |
* is provided by the various subtypes of {@code PathFileObject}. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
329 |
* |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
330 |
* @param fileManager the file manager creating this file object |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
331 |
* @param path the path contained in this file object. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
332 |
*/ |
27579 | 333 |
protected PathFileObject(BaseFileManager fileManager, Path path) { |
29291
076c277565f7
8073550: java* tools: replace obj.getClass hacks with Assert.checkNonNull or Objects.requireNonNull
mcimadamore
parents:
27579
diff
changeset
|
334 |
this.fileManager = Objects.requireNonNull(fileManager); |
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
335 |
if (Files.isDirectory(path)) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
336 |
throw new IllegalArgumentException("directories not supported"); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
337 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
338 |
this.path = path; |
4548 | 339 |
} |
340 |
||
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
341 |
/** |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
342 |
* See {@link JavacFileManager#inferBinaryName}. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
343 |
*/ |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
344 |
abstract String inferBinaryName(Iterable<? extends Path> paths); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
345 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
346 |
/** |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
347 |
* Return the file object for a sibling file with a given file name. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
348 |
* See {@link JavacFileManager#getFileForOutput} and |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
349 |
* {@link JavacFileManager#getJavaFileForOutput}. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
350 |
*/ |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
351 |
abstract PathFileObject getSibling(String basename); |
4548 | 352 |
|
353 |
/** |
|
354 |
* Return the Path for this object. |
|
355 |
* @return the Path for this object. |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
356 |
* @see StandardJavaFileManager#asPath |
4548 | 357 |
*/ |
27579 | 358 |
public Path getPath() { |
4548 | 359 |
return path; |
360 |
} |
|
361 |
||
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
362 |
/** |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
363 |
* The short name is used when generating raw diagnostics. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
364 |
* @return the last component of the path |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
365 |
*/ |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
366 |
public String getShortName() { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
367 |
return path.getFileName().toString(); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
368 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
369 |
|
26266
2d24bda701dc
8056061: Mark implementations of public interfaces with an annotation
jlahoda
parents:
25874
diff
changeset
|
370 |
@Override @DefinedBy(Api.COMPILER) |
4548 | 371 |
public Kind getKind() { |
8231 | 372 |
return BaseFileManager.getKind(path.getFileName().toString()); |
4548 | 373 |
} |
374 |
||
26266
2d24bda701dc
8056061: Mark implementations of public interfaces with an annotation
jlahoda
parents:
25874
diff
changeset
|
375 |
@Override @DefinedBy(Api.COMPILER) |
4548 | 376 |
public boolean isNameCompatible(String simpleName, Kind kind) { |
29291
076c277565f7
8073550: java* tools: replace obj.getClass hacks with Assert.checkNonNull or Objects.requireNonNull
mcimadamore
parents:
27579
diff
changeset
|
377 |
Objects.requireNonNull(simpleName); |
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
378 |
Objects.requireNonNull(kind); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
379 |
|
4548 | 380 |
if (kind == Kind.OTHER && getKind() != kind) { |
381 |
return false; |
|
382 |
} |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
383 |
|
4548 | 384 |
String sn = simpleName + kind.extension; |
8231 | 385 |
String pn = path.getFileName().toString(); |
4548 | 386 |
if (pn.equals(sn)) { |
387 |
return true; |
|
388 |
} |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
389 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
390 |
if (path.getFileSystem() == defaultFileSystem) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
391 |
if (isMacOS) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
392 |
String name = path.getFileName().toString(); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
393 |
if (Normalizer.isNormalized(name, Normalizer.Form.NFD) |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
394 |
&& Normalizer.isNormalized(sn, Normalizer.Form.NFC)) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
395 |
// On Mac OS X it is quite possible to have the file name and the |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
396 |
// given simple name normalized in different ways. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
397 |
// In that case we have to normalize file name to the |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
398 |
// Normal Form Composed (NFC). |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
399 |
String normName = Normalizer.normalize(name, Normalizer.Form.NFC); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
400 |
if (normName.equals(sn)) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
401 |
return true; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
402 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
403 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
404 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
405 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
406 |
if (pn.equalsIgnoreCase(sn)) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
407 |
try { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
408 |
// allow for Windows |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
409 |
return path.toRealPath(LinkOption.NOFOLLOW_LINKS).getFileName().toString().equals(sn); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
410 |
} catch (IOException e) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
411 |
} |
4548 | 412 |
} |
413 |
} |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
414 |
|
4548 | 415 |
return false; |
416 |
} |
|
417 |
||
26266
2d24bda701dc
8056061: Mark implementations of public interfaces with an annotation
jlahoda
parents:
25874
diff
changeset
|
418 |
@Override @DefinedBy(Api.COMPILER) |
4548 | 419 |
public NestingKind getNestingKind() { |
420 |
return null; |
|
421 |
} |
|
422 |
||
26266
2d24bda701dc
8056061: Mark implementations of public interfaces with an annotation
jlahoda
parents:
25874
diff
changeset
|
423 |
@Override @DefinedBy(Api.COMPILER) |
4548 | 424 |
public Modifier getAccessLevel() { |
425 |
return null; |
|
426 |
} |
|
427 |
||
26266
2d24bda701dc
8056061: Mark implementations of public interfaces with an annotation
jlahoda
parents:
25874
diff
changeset
|
428 |
@Override @DefinedBy(Api.COMPILER) |
4548 | 429 |
public URI toUri() { |
430 |
return path.toUri(); |
|
431 |
} |
|
432 |
||
26266
2d24bda701dc
8056061: Mark implementations of public interfaces with an annotation
jlahoda
parents:
25874
diff
changeset
|
433 |
@Override @DefinedBy(Api.COMPILER) |
4548 | 434 |
public InputStream openInputStream() throws IOException { |
8231 | 435 |
return Files.newInputStream(path); |
4548 | 436 |
} |
437 |
||
26266
2d24bda701dc
8056061: Mark implementations of public interfaces with an annotation
jlahoda
parents:
25874
diff
changeset
|
438 |
@Override @DefinedBy(Api.COMPILER) |
4548 | 439 |
public OutputStream openOutputStream() throws IOException { |
10461
998e642f9811
7068451: Regression: javac compiles fixed sources against previous, not current, version of generated sources
jjg
parents:
9091
diff
changeset
|
440 |
fileManager.flushCache(this); |
4548 | 441 |
ensureParentDirectoriesExist(); |
8231 | 442 |
return Files.newOutputStream(path); |
4548 | 443 |
} |
444 |
||
26266
2d24bda701dc
8056061: Mark implementations of public interfaces with an annotation
jlahoda
parents:
25874
diff
changeset
|
445 |
@Override @DefinedBy(Api.COMPILER) |
4548 | 446 |
public Reader openReader(boolean ignoreEncodingErrors) throws IOException { |
447 |
CharsetDecoder decoder = fileManager.getDecoder(fileManager.getEncodingName(), ignoreEncodingErrors); |
|
448 |
return new InputStreamReader(openInputStream(), decoder); |
|
449 |
} |
|
450 |
||
26266
2d24bda701dc
8056061: Mark implementations of public interfaces with an annotation
jlahoda
parents:
25874
diff
changeset
|
451 |
@Override @DefinedBy(Api.COMPILER) |
4548 | 452 |
public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { |
453 |
CharBuffer cb = fileManager.getCachedContent(this); |
|
454 |
if (cb == null) { |
|
22159
682da512ec17
8030253: Update langtools to use strings-in-switch
briangoetz
parents:
14258
diff
changeset
|
455 |
try (InputStream in = openInputStream()) { |
4548 | 456 |
ByteBuffer bb = fileManager.makeByteBuffer(in); |
457 |
JavaFileObject prev = fileManager.log.useSource(this); |
|
458 |
try { |
|
459 |
cb = fileManager.decode(bb, ignoreEncodingErrors); |
|
460 |
} finally { |
|
461 |
fileManager.log.useSource(prev); |
|
462 |
} |
|
463 |
fileManager.recycleByteBuffer(bb); |
|
464 |
if (!ignoreEncodingErrors) { |
|
465 |
fileManager.cache(this, cb); |
|
466 |
} |
|
467 |
} |
|
468 |
} |
|
469 |
return cb; |
|
470 |
} |
|
471 |
||
26266
2d24bda701dc
8056061: Mark implementations of public interfaces with an annotation
jlahoda
parents:
25874
diff
changeset
|
472 |
@Override @DefinedBy(Api.COMPILER) |
4548 | 473 |
public Writer openWriter() throws IOException { |
10461
998e642f9811
7068451: Regression: javac compiles fixed sources against previous, not current, version of generated sources
jjg
parents:
9091
diff
changeset
|
474 |
fileManager.flushCache(this); |
4548 | 475 |
ensureParentDirectoriesExist(); |
8231 | 476 |
return new OutputStreamWriter(Files.newOutputStream(path), fileManager.getEncodingName()); |
4548 | 477 |
} |
478 |
||
26266
2d24bda701dc
8056061: Mark implementations of public interfaces with an annotation
jlahoda
parents:
25874
diff
changeset
|
479 |
@Override @DefinedBy(Api.COMPILER) |
4548 | 480 |
public long getLastModified() { |
481 |
try { |
|
8231 | 482 |
return Files.getLastModifiedTime(path).toMillis(); |
4548 | 483 |
} catch (IOException e) { |
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
484 |
return 0; |
4548 | 485 |
} |
486 |
} |
|
487 |
||
26266
2d24bda701dc
8056061: Mark implementations of public interfaces with an annotation
jlahoda
parents:
25874
diff
changeset
|
488 |
@Override @DefinedBy(Api.COMPILER) |
4548 | 489 |
public boolean delete() { |
490 |
try { |
|
8231 | 491 |
Files.delete(path); |
4548 | 492 |
return true; |
493 |
} catch (IOException e) { |
|
494 |
return false; |
|
495 |
} |
|
496 |
} |
|
497 |
||
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
498 |
boolean isSameFile(PathFileObject other) { |
4548 | 499 |
try { |
8231 | 500 |
return Files.isSameFile(path, other.path); |
4548 | 501 |
} catch (IOException e) { |
502 |
return false; |
|
503 |
} |
|
504 |
} |
|
505 |
||
506 |
@Override |
|
507 |
public boolean equals(Object other) { |
|
508 |
return (other instanceof PathFileObject && path.equals(((PathFileObject) other).path)); |
|
509 |
} |
|
510 |
||
511 |
@Override |
|
512 |
public int hashCode() { |
|
513 |
return path.hashCode(); |
|
514 |
} |
|
515 |
||
516 |
@Override |
|
517 |
public String toString() { |
|
518 |
return getClass().getSimpleName() + "[" + path + "]"; |
|
519 |
} |
|
520 |
||
521 |
private void ensureParentDirectoriesExist() throws IOException { |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
522 |
if (!hasParents) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
523 |
Path parent = path.getParent(); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
524 |
if (parent != null && !Files.isDirectory(parent)) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
525 |
try { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
526 |
Files.createDirectories(parent); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
527 |
} catch (IOException e) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
528 |
throw new IOException("could not create parent directories", e); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
529 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
530 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
531 |
hasParents = true; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
532 |
} |
4548 | 533 |
} |
534 |
||
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
535 |
protected static String toBinaryName(RelativePath relativePath) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
536 |
return toBinaryName(relativePath.path, "/"); |
4548 | 537 |
} |
538 |
||
539 |
protected static String toBinaryName(Path relativePath) { |
|
540 |
return toBinaryName(relativePath.toString(), |
|
541 |
relativePath.getFileSystem().getSeparator()); |
|
542 |
} |
|
543 |
||
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
544 |
private static String toBinaryName(String relativePath, String sep) { |
4701
39e13c0d8d75
6915476: java.util.regex.PatternSyntaxException in com.sun.tools.javac.nio.PathFileObject
jjg
parents:
4548
diff
changeset
|
545 |
return removeExtension(relativePath).replace(sep, "."); |
4548 | 546 |
} |
547 |
||
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
548 |
private static String removeExtension(String fileName) { |
4548 | 549 |
int lastDot = fileName.lastIndexOf("."); |
550 |
return (lastDot == -1 ? fileName : fileName.substring(0, lastDot)); |
|
551 |
} |
|
34560
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
552 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
553 |
/** Return the last component of a presumed hierarchical URI. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
554 |
* From the scheme specific part of the URI, it returns the substring |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
555 |
* after the last "/" if any, or everything if no "/" is found. |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
556 |
*/ |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
557 |
public static String getSimpleName(FileObject fo) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
558 |
URI uri = fo.toUri(); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
559 |
String s = uri.getSchemeSpecificPart(); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
560 |
return s.substring(s.lastIndexOf("/") + 1); // safe when / not found |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
561 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
562 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
563 |
|
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
564 |
/** Used when URLSyntaxException is thrown unexpectedly during |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
565 |
* implementations of FileObject.toURI(). */ |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
566 |
public static class CannotCreateUriError extends Error { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
567 |
private static final long serialVersionUID = 9101708840997613546L; |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
568 |
public CannotCreateUriError(String value, Throwable cause) { |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
569 |
super(value, cause); |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
570 |
} |
b6a567b677f7
8059976: Convert JavacFileManager to use java.nio.file internally
jjg
parents:
31753
diff
changeset
|
571 |
} |
4548 | 572 |
} |