提交 fa2b05ca 编写于 作者: A asaha

Merge

...@@ -35,3 +35,4 @@ d5a1223e961891564de25c39fba6f2442d0fb045 jdk7-b57 ...@@ -35,3 +35,4 @@ d5a1223e961891564de25c39fba6f2442d0fb045 jdk7-b57
9ba256e2e5c161b89e638390f998baa175ec9abe jdk7-b58 9ba256e2e5c161b89e638390f998baa175ec9abe jdk7-b58
2a5a1b269e89f27ebe419ef4cf6e66a3face0df1 jdk7-b59 2a5a1b269e89f27ebe419ef4cf6e66a3face0df1 jdk7-b59
0c3ef2d612a47667829eb17a192decef23f1c536 jdk7-b60 0c3ef2d612a47667829eb17a192decef23f1c536 jdk7-b60
f72c0dc047b9b2e797beee68ae0b50decb1f020d jdk7-b61
...@@ -27,6 +27,7 @@ SUNWprivate_1.1 { ...@@ -27,6 +27,7 @@ SUNWprivate_1.1 {
global: global:
Java_sun_nio_ch_SctpNet_socket0; Java_sun_nio_ch_SctpNet_socket0;
Java_sun_nio_ch_SctpNet_bindx; Java_sun_nio_ch_SctpNet_bindx;
Java_sun_nio_ch_SctpNet_branch0;
Java_sun_nio_ch_SctpNet_getLocalAddresses0; Java_sun_nio_ch_SctpNet_getLocalAddresses0;
Java_sun_nio_ch_SctpNet_getRemoteAddresses0; Java_sun_nio_ch_SctpNet_getRemoteAddresses0;
Java_sun_nio_ch_SctpNet_getPrimAddrOption0; Java_sun_nio_ch_SctpNet_getPrimAddrOption0;
......
...@@ -97,7 +97,7 @@ else ...@@ -97,7 +97,7 @@ else
ifeq ($(PLATFORM), windows) ifeq ($(PLATFORM), windows)
LICENSE_DOCLIST_JDK = $(subst $(LICENSE_VERSION),,\ LICENSE_DOCLIST_JDK = $(subst $(LICENSE_VERSION),,\
$(shell $(CD) $(SHARE_JDK_DOC_SRC) && \ $(shell $(CD) $(SHARE_JDK_DOC_SRC) && \
$(LS) *LICENSE*$(LICENSE_VERSION))) $(LS) *LICENSE*$(LICENSE_VERSION)))
LICENSE_DOCLIST_JRE = $(subst $(LICENSE_VERSION),,\ LICENSE_DOCLIST_JRE = $(subst $(LICENSE_VERSION),,\
$(shell $(CD) $(SHARE_JRE_DOC_SRC) && \ $(shell $(CD) $(SHARE_JRE_DOC_SRC) && \
$(LS) *LICENSE*$(LICENSE_VERSION))) $(LS) *LICENSE*$(LICENSE_VERSION)))
...@@ -401,7 +401,7 @@ TOOLS = \ ...@@ -401,7 +401,7 @@ TOOLS = \
sun/tools/jstack \ sun/tools/jstack \
sun/tools/jinfo \ sun/tools/jinfo \
sun/tools/jmap sun/tools/jmap
# classes that go into jsse.jar # classes that go into jsse.jar
JSSE_CLASSES_DIRS = \ JSSE_CLASSES_DIRS = \
sun/security/provider/Sun.class \ sun/security/provider/Sun.class \
...@@ -645,7 +645,7 @@ $(RT_JAR_FILELIST) + $(RES_JAR_FILELIST): \ ...@@ -645,7 +645,7 @@ $(RT_JAR_FILELIST) + $(RES_JAR_FILELIST): \
@$(java-vm-cleanup) @$(java-vm-cleanup)
# Create the manifest file. # Create the manifest file.
JAR_MANIFEST_FILE=$(TEMPDIR)/manifest.tmp JAR_MANIFEST_FILE=$(ABS_TEMPDIR)/manifest.tmp
$(JAR_MANIFEST_FILE): $(MAINMANIFEST) $(BEANMANIFEST) $(JAR_MANIFEST_FILE): $(MAINMANIFEST) $(BEANMANIFEST)
$(prep-target) $(prep-target)
$(SED) -e "s/@@RELEASE@@/$(RELEASE)/" $(MAINMANIFEST) >> $@ $(SED) -e "s/@@RELEASE@@/$(RELEASE)/" $(MAINMANIFEST) >> $@
...@@ -653,25 +653,22 @@ $(JAR_MANIFEST_FILE): $(MAINMANIFEST) $(BEANMANIFEST) ...@@ -653,25 +653,22 @@ $(JAR_MANIFEST_FILE): $(MAINMANIFEST) $(BEANMANIFEST)
$(CAT) $(BEANMANIFEST) >> $@ $(CAT) $(BEANMANIFEST) >> $@
# Create resources.jar containing non-class files # Create resources.jar containing non-class files
RESOURCES_JAR=$(TEMPDIR)/resources-orig.jar RESOURCES_JAR=$(ABS_TEMPDIR)/resources-orig.jar
RES_JAR_ARGLIST=$(RES_JAR_FILELIST)_args $(RESOURCES_JAR): $(RES_JAR_FILELIST) $(JAR_MANIFEST_FILE)
$(RES_JAR_ARGLIST): $(RES_JAR_FILELIST)
$(prep-target) $(prep-target)
$(SED) -e "s@^@-C $(CLASSBINDIR) @" $< > $@ $(CD) $(CLASSBINDIR) && \
$(RESOURCES_JAR): $(RES_JAR_ARGLIST) $(JAR_MANIFEST_FILE) $(BOOT_JAR_CMD) c0mf $(JAR_MANIFEST_FILE) $@ \
$(prep-target) @$(RES_JAR_FILELIST) $(BOOT_JAR_JFLAGS)
$(BOOT_JAR_CMD) c0mf $(JAR_MANIFEST_FILE) $@ \ @$(CD) $(CLASSBINDIR) && $(java-vm-cleanup)
@$(RES_JAR_ARGLIST) $(BOOT_JAR_JFLAGS)
@$(java-vm-cleanup)
# Create jsse.jar containing SunJSSE implementation classes # Create jsse.jar containing SunJSSE implementation classes
JSSE_JAR=$(TEMPDIR)/jsse-orig.jar JSSE_JAR=$(ABS_TEMPDIR)/jsse-orig.jar
$(JSSE_JAR): $(JAR_MANIFEST_FILE) $(JSSE_JAR): $(JAR_MANIFEST_FILE)
$(prep-target) $(prep-target)
$(BOOT_JAR_CMD) c0mf $(JAR_MANIFEST_FILE) $@ \ $(CD) $(CLASSBINDIR) && \
$(JSSE_CLASSES_DIRS:%=-C $(CLASSBINDIR) %) \ $(BOOT_JAR_CMD) c0mf $(JAR_MANIFEST_FILE) $@ \
$(BOOT_JAR_JFLAGS) $(JSSE_CLASSES_DIRS) $(BOOT_JAR_JFLAGS)
@$(java-vm-cleanup) @$(CD) $(CLASSBINDIR) && $(java-vm-cleanup)
# Create sec-bin.zip # Create sec-bin.zip
SEC_FILES_ZIP=$(ABS_TEMPDIR)/sec-bin.zip SEC_FILES_ZIP=$(ABS_TEMPDIR)/sec-bin.zip
...@@ -713,15 +710,12 @@ endif ...@@ -713,15 +710,12 @@ endif
# Create rt.jar # Create rt.jar
RT_JAR=$(ABS_TEMPDIR)/rt-orig.jar RT_JAR=$(ABS_TEMPDIR)/rt-orig.jar
RT_JAR_ARGLIST=$(RT_JAR_FILELIST)_args $(RT_JAR): $(RT_JAR_FILELIST) $(JAR_MANIFEST_FILE)
$(RT_JAR_ARGLIST): $(RT_JAR_FILELIST)
$(prep-target)
$(SED) -e "s@^@-C $(CLASSBINDIR) @" $< > $@
$(RT_JAR): $(RT_JAR_ARGLIST) $(JAR_MANIFEST_FILE)
$(prep-target) $(prep-target)
$(BOOT_JAR_CMD) c0mf $(JAR_MANIFEST_FILE) $@ \ $(CD) $(CLASSBINDIR) && \
@$(RT_JAR_ARGLIST) $(BOOT_JAR_JFLAGS) $(BOOT_JAR_CMD) c0mf $(JAR_MANIFEST_FILE) $@ \
@$(java-vm-cleanup) @$(RT_JAR_FILELIST) $(BOOT_JAR_JFLAGS)
@$(CD) $(CLASSBINDIR) && $(java-vm-cleanup)
# Meta-index construction to make core class loaders lazier # Meta-index construction to make core class loaders lazier
...@@ -944,10 +938,10 @@ initial-image-jdk:: initial-image-jdk-setup \ ...@@ -944,10 +938,10 @@ initial-image-jdk:: initial-image-jdk-setup \
@# @#
@# lib/tools.jar @# lib/tools.jar
@# @#
$(BOOT_JAR_CMD) c0f $(LIBDIR)/tools.jar $(addprefix \ $(CD) $(CLASSBINDIR) && \
-C $(CLASSBINDIR) , $(TOOLS)) \ $(BOOT_JAR_CMD) c0f $(ABS_LIBDIR)/tools.jar \
$(BOOT_JAR_JFLAGS) $(TOOLS) $(BOOT_JAR_JFLAGS)
@$(java-vm-cleanup) @$(CD) $(CLASSBINDIR) && $(java-vm-cleanup)
$(CP) $(LIBDIR)/tools.jar $(JDK_IMAGE_DIR)/lib/tools.jar $(CP) $(LIBDIR)/tools.jar $(JDK_IMAGE_DIR)/lib/tools.jar
@# @#
@# lib/ct.sym @# lib/ct.sym
......
...@@ -412,6 +412,7 @@ JAVA_JAVA_java = \ ...@@ -412,6 +412,7 @@ JAVA_JAVA_java = \
java/io/FileReader.java \ java/io/FileReader.java \
java/io/PipedReader.java \ java/io/PipedReader.java \
java/io/StringReader.java \ java/io/StringReader.java \
java/io/TempFileHelper.java \
java/io/Writer.java \ java/io/Writer.java \
java/io/BufferedWriter.java \ java/io/BufferedWriter.java \
java/io/PrintWriter.java \ java/io/PrintWriter.java \
......
...@@ -280,6 +280,9 @@ SUNWprivate_1.1 { ...@@ -280,6 +280,9 @@ SUNWprivate_1.1 {
Java_sun_misc_VM_initialize; Java_sun_misc_VM_initialize;
Java_sun_misc_VMSupport_initAgentProperties; Java_sun_misc_VMSupport_initAgentProperties;
# ZipFile.c needs this one
throwFileNotFoundException;
# Java_sun_misc_VM_getState; threads.c # Java_sun_misc_VM_getState; threads.c
# Java_sun_misc_VM_threadsSuspended; threads.c # Java_sun_misc_VM_threadsSuspended; threads.c
# Java_sun_misc_VM_unsuspendSomeThreads; threads.c # Java_sun_misc_VM_unsuspendSomeThreads; threads.c
......
...@@ -86,8 +86,6 @@ FILES_src = \ ...@@ -86,8 +86,6 @@ FILES_src = \
java/nio/file/CopyOption.java \ java/nio/file/CopyOption.java \
java/nio/file/DirectoryNotEmptyException.java \ java/nio/file/DirectoryNotEmptyException.java \
java/nio/file/DirectoryStream.java \ java/nio/file/DirectoryStream.java \
java/nio/file/DirectoryStreamFilters.java \
java/nio/file/FileAction.java \
java/nio/file/FileAlreadyExistsException.java \ java/nio/file/FileAlreadyExistsException.java \
java/nio/file/FileRef.java \ java/nio/file/FileRef.java \
java/nio/file/FileStore.java \ java/nio/file/FileStore.java \
...@@ -141,6 +139,7 @@ FILES_src = \ ...@@ -141,6 +139,7 @@ FILES_src = \
java/nio/file/attribute/FileStoreAttributeView.java \ java/nio/file/attribute/FileStoreAttributeView.java \
java/nio/file/attribute/FileStoreSpaceAttributeView.java \ java/nio/file/attribute/FileStoreSpaceAttributeView.java \
java/nio/file/attribute/FileStoreSpaceAttributes.java \ java/nio/file/attribute/FileStoreSpaceAttributes.java \
java/nio/file/attribute/FileTime.java \
java/nio/file/attribute/GroupPrincipal.java \ java/nio/file/attribute/GroupPrincipal.java \
java/nio/file/attribute/UserDefinedFileAttributeView.java \ java/nio/file/attribute/UserDefinedFileAttributeView.java \
java/nio/file/attribute/PosixFileAttributeView.java \ java/nio/file/attribute/PosixFileAttributeView.java \
...@@ -151,7 +150,6 @@ FILES_src = \ ...@@ -151,7 +150,6 @@ FILES_src = \
java/nio/file/attribute/UserPrincipalLookupService.java \ java/nio/file/attribute/UserPrincipalLookupService.java \
java/nio/file/attribute/UserPrincipalNotFoundException.java \ java/nio/file/attribute/UserPrincipalNotFoundException.java \
\ \
java/nio/file/spi/AbstractPath.java \
java/nio/file/spi/FileSystemProvider.java \ java/nio/file/spi/FileSystemProvider.java \
java/nio/file/spi/FileTypeDetector.java \ java/nio/file/spi/FileTypeDetector.java \
\ \
...@@ -248,8 +246,8 @@ FILES_src = \ ...@@ -248,8 +246,8 @@ FILES_src = \
\ \
sun/nio/fs/AbstractAclFileAttributeView.java \ sun/nio/fs/AbstractAclFileAttributeView.java \
sun/nio/fs/AbstractBasicFileAttributeView.java \ sun/nio/fs/AbstractBasicFileAttributeView.java \
sun/nio/fs/AbstractFileStoreSpaceAttributeView.java \
sun/nio/fs/AbstractFileTypeDetector.java \ sun/nio/fs/AbstractFileTypeDetector.java \
sun/nio/fs/AbstractPath.java \
sun/nio/fs/AbstractPoller.java \ sun/nio/fs/AbstractPoller.java \
sun/nio/fs/AbstractUserDefinedFileAttributeView.java \ sun/nio/fs/AbstractUserDefinedFileAttributeView.java \
sun/nio/fs/AbstractWatchKey.java \ sun/nio/fs/AbstractWatchKey.java \
...@@ -258,12 +256,13 @@ FILES_src = \ ...@@ -258,12 +256,13 @@ FILES_src = \
sun/nio/fs/Cancellable.java \ sun/nio/fs/Cancellable.java \
sun/nio/fs/DefaultFileSystemProvider.java \ sun/nio/fs/DefaultFileSystemProvider.java \
sun/nio/fs/DefaultFileTypeDetector.java \ sun/nio/fs/DefaultFileTypeDetector.java \
sun/nio/fs/DynamicFileAttributeView.java \
sun/nio/fs/FileOwnerAttributeViewImpl.java \ sun/nio/fs/FileOwnerAttributeViewImpl.java \
sun/nio/fs/Globs.java \ sun/nio/fs/Globs.java \
sun/nio/fs/MimeType.java \
sun/nio/fs/NativeBuffer.java \ sun/nio/fs/NativeBuffer.java \
sun/nio/fs/NativeBuffers.java \ sun/nio/fs/NativeBuffers.java \
sun/nio/fs/Reflect.java \ sun/nio/fs/Reflect.java \
sun/nio/fs/Util.java \
\ \
java/net/DatagramSocket.java \ java/net/DatagramSocket.java \
java/net/DatagramSocketImpl.java \ java/net/DatagramSocketImpl.java \
......
...@@ -142,7 +142,7 @@ SUNWprivate_1.1 { ...@@ -142,7 +142,7 @@ SUNWprivate_1.1 {
Java_sun_nio_fs_LinuxNativeDispatcher_fremovexattr0; Java_sun_nio_fs_LinuxNativeDispatcher_fremovexattr0;
Java_sun_nio_fs_LinuxNativeDispatcher_setmntent0; Java_sun_nio_fs_LinuxNativeDispatcher_setmntent0;
Java_sun_nio_fs_LinuxNativeDispatcher_endmntent; Java_sun_nio_fs_LinuxNativeDispatcher_endmntent;
Java_sun_nio_fs_UnixNativeDispatcher_initIDs; Java_sun_nio_fs_UnixNativeDispatcher_init;
Java_sun_nio_fs_UnixNativeDispatcher_getcwd; Java_sun_nio_fs_UnixNativeDispatcher_getcwd;
Java_sun_nio_fs_UnixNativeDispatcher_strerror; Java_sun_nio_fs_UnixNativeDispatcher_strerror;
Java_sun_nio_fs_UnixNativeDispatcher_dup; Java_sun_nio_fs_UnixNativeDispatcher_dup;
......
...@@ -120,7 +120,7 @@ SUNWprivate_1.1 { ...@@ -120,7 +120,7 @@ SUNWprivate_1.1 {
Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGio; Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGio;
Java_sun_nio_fs_GnomeFileTypeDetector_initializeGnomeVfs; Java_sun_nio_fs_GnomeFileTypeDetector_initializeGnomeVfs;
Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGnomeVfs; Java_sun_nio_fs_GnomeFileTypeDetector_probeUsingGnomeVfs;
Java_sun_nio_fs_UnixNativeDispatcher_initIDs; Java_sun_nio_fs_UnixNativeDispatcher_init;
Java_sun_nio_fs_UnixNativeDispatcher_getcwd; Java_sun_nio_fs_UnixNativeDispatcher_getcwd;
Java_sun_nio_fs_UnixNativeDispatcher_strerror; Java_sun_nio_fs_UnixNativeDispatcher_strerror;
Java_sun_nio_fs_UnixNativeDispatcher_dup; Java_sun_nio_fs_UnixNativeDispatcher_dup;
......
...@@ -51,6 +51,7 @@ SUNWprivate_1.1 { ...@@ -51,6 +51,7 @@ SUNWprivate_1.1 {
Java_java_util_zip_Inflater_reset; Java_java_util_zip_Inflater_reset;
Java_java_util_zip_Inflater_setDictionary; Java_java_util_zip_Inflater_setDictionary;
Java_java_util_zip_ZipFile_close; Java_java_util_zip_ZipFile_close;
Java_java_util_zip_ZipFile_getCommentBytes;
Java_java_util_zip_ZipFile_freeEntry; Java_java_util_zip_ZipFile_freeEntry;
Java_java_util_zip_ZipFile_getEntry; Java_java_util_zip_ZipFile_getEntry;
Java_java_util_zip_ZipFile_getEntryBytes; Java_java_util_zip_ZipFile_getEntryBytes;
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
# #
FILES_java = \ FILES_java = \
sun/net/ApplicationProxy.java \
sun/net/InetAddressCachePolicy.java \ sun/net/InetAddressCachePolicy.java \
sun/net/URLCanonicalizer.java \ sun/net/URLCanonicalizer.java \
sun/net/NetworkClient.java \ sun/net/NetworkClient.java \
...@@ -67,6 +66,9 @@ FILES_java = \ ...@@ -67,6 +66,9 @@ FILES_java = \
sun/net/www/protocol/file/Handler.java \ sun/net/www/protocol/file/Handler.java \
sun/net/www/protocol/file/FileURLConnection.java \ sun/net/www/protocol/file/FileURLConnection.java \
sun/net/www/http/HttpClient.java \ sun/net/www/http/HttpClient.java \
sun/net/www/http/HttpCapture.java \
sun/net/www/http/HttpCaptureInputStream.java \
sun/net/www/http/HttpCaptureOutputStream.java \
sun/net/www/http/PosterOutputStream.java \ sun/net/www/http/PosterOutputStream.java \
sun/net/www/http/ChunkedInputStream.java \ sun/net/www/http/ChunkedInputStream.java \
sun/net/www/http/ChunkedOutputStream.java \ sun/net/www/http/ChunkedOutputStream.java \
...@@ -76,6 +78,7 @@ FILES_java = \ ...@@ -76,6 +78,7 @@ FILES_java = \
sun/net/www/http/Hurryable.java \ sun/net/www/http/Hurryable.java \
sun/net/www/protocol/http/Handler.java \ sun/net/www/protocol/http/Handler.java \
sun/net/www/protocol/http/HttpURLConnection.java \ sun/net/www/protocol/http/HttpURLConnection.java \
sun/net/www/protocol/http/HttpLogFormatter.java \
sun/net/www/protocol/http/HttpAuthenticator.java \ sun/net/www/protocol/http/HttpAuthenticator.java \
sun/net/www/protocol/http/AuthenticationHeader.java \ sun/net/www/protocol/http/AuthenticationHeader.java \
sun/net/www/protocol/http/AuthenticationInfo.java \ sun/net/www/protocol/http/AuthenticationInfo.java \
......
...@@ -151,7 +151,6 @@ FILES_src = \ ...@@ -151,7 +151,6 @@ FILES_src = \
sun/io/ByteToCharJISAutoDetect.java \ sun/io/ByteToCharJISAutoDetect.java \
sun/io/ByteToCharJohab.java \ sun/io/ByteToCharJohab.java \
sun/io/ByteToCharMS874.java \ sun/io/ByteToCharMS874.java \
sun/io/ByteToCharMS932DB.java \
sun/io/ByteToCharMS932.java \ sun/io/ByteToCharMS932.java \
sun/io/ByteToCharMS936.java \ sun/io/ByteToCharMS936.java \
sun/io/ByteToCharMS949.java \ sun/io/ByteToCharMS949.java \
...@@ -283,7 +282,6 @@ FILES_src = \ ...@@ -283,7 +282,6 @@ FILES_src = \
sun/io/CharToByteISO8859_8.java \ sun/io/CharToByteISO8859_8.java \
sun/io/CharToByteJohab.java \ sun/io/CharToByteJohab.java \
sun/io/CharToByteMS874.java \ sun/io/CharToByteMS874.java \
sun/io/CharToByteMS932DB.java \
sun/io/CharToByteMS932.java \ sun/io/CharToByteMS932.java \
sun/io/CharToByteMS936.java \ sun/io/CharToByteMS936.java \
sun/io/CharToByteMS949.java \ sun/io/CharToByteMS949.java \
...@@ -388,7 +386,15 @@ FILES_gen_extcs = \ ...@@ -388,7 +386,15 @@ FILES_gen_extcs = \
sun/nio/cs/ext/IBM948.java \ sun/nio/cs/ext/IBM948.java \
sun/nio/cs/ext/IBM949.java \ sun/nio/cs/ext/IBM949.java \
sun/nio/cs/ext/IBM950.java \ sun/nio/cs/ext/IBM950.java \
sun/nio/cs/ext/IBM970.java sun/nio/cs/ext/IBM970.java \
sun/nio/cs/ext/EUC_CN.java \
sun/nio/cs/ext/EUC_KR.java \
sun/nio/cs/ext/Johab.java \
sun/nio/cs/ext/MS932.java \
sun/nio/cs/ext/MS936.java \
sun/nio/cs/ext/MS949.java \
sun/nio/cs/ext/MS950.java \
sun/nio/cs/ext/GBK.java
FILES_java = $(FILES_src) $(FILES_gen_extcs) FILES_java = $(FILES_src) $(FILES_gen_extcs)
...@@ -105,7 +105,7 @@ $(CLASSDESTDIR)/$(SERVICE_DESCRIPTION_PATH): \ ...@@ -105,7 +105,7 @@ $(CLASSDESTDIR)/$(SERVICE_DESCRIPTION_PATH): \
$(install-file) $(install-file)
$(CHARSETS_JAR): $(FILES_class) $(CLASSDESTDIR)/$(SERVICE_DESCRIPTION_PATH) $(FILES_DAT) $(CHARSETS_JAR): $(FILES_class) $(CLASSDESTDIR)/$(SERVICE_DESCRIPTION_PATH) $(FILES_DAT)
$(BOOT_JAR_CMD) cf $(CHARSETS_JAR) \ $(BOOT_JAR_CMD) cf0 $(CHARSETS_JAR) \
-C $(CLASSDESTDIR) sun \ -C $(CLASSDESTDIR) sun \
-C $(CLASSDESTDIR) $(SERVICE_DESCRIPTION_PATH) \ -C $(CLASSDESTDIR) $(SERVICE_DESCRIPTION_PATH) \
$(BOOT_JAR_JFLAGS) $(BOOT_JAR_JFLAGS)
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
#
# (1)entries that exist only in MS932DB.c2b.private
# (diff result of MS932DB.b2c.private and MS932DB.c2b.private)
# (2)added the jis0201 c->b only entries
# u+203e -> 0x7e
# u+00a5 -> 0x5c
#
0x7e 0x203e
0x5c 0x00a5
#
0x8143 0x00b8 # CEDILLA
0x8145 0x00b7 # MIDDLE DOT
0x8150 0x00af # MACRON
0x8191 0x00a2 # CENT SIGN
0x8192 0x00a3 # POUND SIGN
0x81ca 0x00ac # NOT SIGN
0x81e1 0x00ab # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
0x81e2 0x00bb # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
0x8394 0x3094 # HIRAGANA LETTER VU
0x83ca 0x00b5 # MICRO SIGN
此差异已折叠。
#
# These are the entries exist only in MS932DB.b2c.private
# (diff result of MS932DB.b2c.private and MS932DB.c2b.private)
#
0x8790 0x2252 # APPROXIMATELY EQUAL TO OR THE IMAGE OF
0x8791 0x2261 # IDENTICAL TO
0x8792 0x222b # INTEGRAL
0x8795 0x221a # SQUARE ROOT
0x8796 0x22a5 # UP TACK
0x8797 0x2220 # ANGLE
0x879a 0x2235 # BECAUSE
0x879b 0x2229 # INTERSECTION
0x879c 0x222a # UNION
0xed40 0x7e8a # CJK UNIFIED IDEOGRAPH-7E8A
0xed41 0x891c # CJK UNIFIED IDEOGRAPH-891C
0xed42 0x9348 # CJK UNIFIED IDEOGRAPH-9348
0xed43 0x9288 # CJK UNIFIED IDEOGRAPH-9288
0xed44 0x84dc # CJK UNIFIED IDEOGRAPH-84DC
0xed45 0x4fc9 # CJK UNIFIED IDEOGRAPH-4FC9
0xed46 0x70bb # CJK UNIFIED IDEOGRAPH-70BB
0xed47 0x6631 # CJK UNIFIED IDEOGRAPH-6631
0xed48 0x68c8 # CJK UNIFIED IDEOGRAPH-68C8
0xed49 0x92f9 # CJK UNIFIED IDEOGRAPH-92F9
0xed4a 0x66fb # CJK UNIFIED IDEOGRAPH-66FB
0xed4b 0x5f45 # CJK UNIFIED IDEOGRAPH-5F45
0xed4c 0x4e28 # CJK UNIFIED IDEOGRAPH-4E28
0xed4d 0x4ee1 # CJK UNIFIED IDEOGRAPH-4EE1
0xed4e 0x4efc # CJK UNIFIED IDEOGRAPH-4EFC
0xed4f 0x4f00 # CJK UNIFIED IDEOGRAPH-4F00
0xed50 0x4f03 # CJK UNIFIED IDEOGRAPH-4F03
0xed51 0x4f39 # CJK UNIFIED IDEOGRAPH-4F39
0xed52 0x4f56 # CJK UNIFIED IDEOGRAPH-4F56
0xed53 0x4f92 # CJK UNIFIED IDEOGRAPH-4F92
0xed54 0x4f8a # CJK UNIFIED IDEOGRAPH-4F8A
0xed55 0x4f9a # CJK UNIFIED IDEOGRAPH-4F9A
0xed56 0x4f94 # CJK UNIFIED IDEOGRAPH-4F94
0xed57 0x4fcd # CJK UNIFIED IDEOGRAPH-4FCD
0xed58 0x5040 # CJK UNIFIED IDEOGRAPH-5040
0xed59 0x5022 # CJK UNIFIED IDEOGRAPH-5022
0xed5a 0x4fff # CJK UNIFIED IDEOGRAPH-4FFF
0xed5b 0x501e # CJK UNIFIED IDEOGRAPH-501E
0xed5c 0x5046 # CJK UNIFIED IDEOGRAPH-5046
0xed5d 0x5070 # CJK UNIFIED IDEOGRAPH-5070
0xed5e 0x5042 # CJK UNIFIED IDEOGRAPH-5042
0xed5f 0x5094 # CJK UNIFIED IDEOGRAPH-5094
0xed60 0x50f4 # CJK UNIFIED IDEOGRAPH-50F4
0xed61 0x50d8 # CJK UNIFIED IDEOGRAPH-50D8
0xed62 0x514a # CJK UNIFIED IDEOGRAPH-514A
0xed63 0x5164 # CJK UNIFIED IDEOGRAPH-5164
0xed64 0x519d # CJK UNIFIED IDEOGRAPH-519D
0xed65 0x51be # CJK UNIFIED IDEOGRAPH-51BE
0xed66 0x51ec # CJK UNIFIED IDEOGRAPH-51EC
0xed67 0x5215 # CJK UNIFIED IDEOGRAPH-5215
0xed68 0x529c # CJK UNIFIED IDEOGRAPH-529C
0xed69 0x52a6 # CJK UNIFIED IDEOGRAPH-52A6
0xed6a 0x52c0 # CJK UNIFIED IDEOGRAPH-52C0
0xed6b 0x52db # CJK UNIFIED IDEOGRAPH-52DB
0xed6c 0x5300 # CJK UNIFIED IDEOGRAPH-5300
0xed6d 0x5307 # CJK UNIFIED IDEOGRAPH-5307
0xed6e 0x5324 # CJK UNIFIED IDEOGRAPH-5324
0xed6f 0x5372 # CJK UNIFIED IDEOGRAPH-5372
0xed70 0x5393 # CJK UNIFIED IDEOGRAPH-5393
0xed71 0x53b2 # CJK UNIFIED IDEOGRAPH-53B2
0xed72 0x53dd # CJK UNIFIED IDEOGRAPH-53DD
0xed73 0xfa0e # CJK COMPATIBILITY IDEOGRAPH-FA0E
0xed74 0x549c # CJK UNIFIED IDEOGRAPH-549C
0xed75 0x548a # CJK UNIFIED IDEOGRAPH-548A
0xed76 0x54a9 # CJK UNIFIED IDEOGRAPH-54A9
0xed77 0x54ff # CJK UNIFIED IDEOGRAPH-54FF
0xed78 0x5586 # CJK UNIFIED IDEOGRAPH-5586
0xed79 0x5759 # CJK UNIFIED IDEOGRAPH-5759
0xed7a 0x5765 # CJK UNIFIED IDEOGRAPH-5765
0xed7b 0x57ac # CJK UNIFIED IDEOGRAPH-57AC
0xed7c 0x57c8 # CJK UNIFIED IDEOGRAPH-57C8
0xed7d 0x57c7 # CJK UNIFIED IDEOGRAPH-57C7
0xed7e 0xfa0f # CJK COMPATIBILITY IDEOGRAPH-FA0F
0xed80 0xfa10 # CJK COMPATIBILITY IDEOGRAPH-FA10
0xed81 0x589e # CJK UNIFIED IDEOGRAPH-589E
0xed82 0x58b2 # CJK UNIFIED IDEOGRAPH-58B2
0xed83 0x590b # CJK UNIFIED IDEOGRAPH-590B
0xed84 0x5953 # CJK UNIFIED IDEOGRAPH-5953
0xed85 0x595b # CJK UNIFIED IDEOGRAPH-595B
0xed86 0x595d # CJK UNIFIED IDEOGRAPH-595D
0xed87 0x5963 # CJK UNIFIED IDEOGRAPH-5963
0xed88 0x59a4 # CJK UNIFIED IDEOGRAPH-59A4
0xed89 0x59ba # CJK UNIFIED IDEOGRAPH-59BA
0xed8a 0x5b56 # CJK UNIFIED IDEOGRAPH-5B56
0xed8b 0x5bc0 # CJK UNIFIED IDEOGRAPH-5BC0
0xed8c 0x752f # CJK UNIFIED IDEOGRAPH-752F
0xed8d 0x5bd8 # CJK UNIFIED IDEOGRAPH-5BD8
0xed8e 0x5bec # CJK UNIFIED IDEOGRAPH-5BEC
0xed8f 0x5c1e # CJK UNIFIED IDEOGRAPH-5C1E
0xed90 0x5ca6 # CJK UNIFIED IDEOGRAPH-5CA6
0xed91 0x5cba # CJK UNIFIED IDEOGRAPH-5CBA
0xed92 0x5cf5 # CJK UNIFIED IDEOGRAPH-5CF5
0xed93 0x5d27 # CJK UNIFIED IDEOGRAPH-5D27
0xed94 0x5d53 # CJK UNIFIED IDEOGRAPH-5D53
0xed95 0xfa11 # CJK COMPATIBILITY IDEOGRAPH-FA11
0xed96 0x5d42 # CJK UNIFIED IDEOGRAPH-5D42
0xed97 0x5d6d # CJK UNIFIED IDEOGRAPH-5D6D
0xed98 0x5db8 # CJK UNIFIED IDEOGRAPH-5DB8
0xed99 0x5db9 # CJK UNIFIED IDEOGRAPH-5DB9
0xed9a 0x5dd0 # CJK UNIFIED IDEOGRAPH-5DD0
0xed9b 0x5f21 # CJK UNIFIED IDEOGRAPH-5F21
0xed9c 0x5f34 # CJK UNIFIED IDEOGRAPH-5F34
0xed9d 0x5f67 # CJK UNIFIED IDEOGRAPH-5F67
0xed9e 0x5fb7 # CJK UNIFIED IDEOGRAPH-5FB7
0xed9f 0x5fde # CJK UNIFIED IDEOGRAPH-5FDE
0xeda0 0x605d # CJK UNIFIED IDEOGRAPH-605D
0xeda1 0x6085 # CJK UNIFIED IDEOGRAPH-6085
0xeda2 0x608a # CJK UNIFIED IDEOGRAPH-608A
0xeda3 0x60de # CJK UNIFIED IDEOGRAPH-60DE
0xeda4 0x60d5 # CJK UNIFIED IDEOGRAPH-60D5
0xeda5 0x6120 # CJK UNIFIED IDEOGRAPH-6120
0xeda6 0x60f2 # CJK UNIFIED IDEOGRAPH-60F2
0xeda7 0x6111 # CJK UNIFIED IDEOGRAPH-6111
0xeda8 0x6137 # CJK UNIFIED IDEOGRAPH-6137
0xeda9 0x6130 # CJK UNIFIED IDEOGRAPH-6130
0xedaa 0x6198 # CJK UNIFIED IDEOGRAPH-6198
0xedab 0x6213 # CJK UNIFIED IDEOGRAPH-6213
0xedac 0x62a6 # CJK UNIFIED IDEOGRAPH-62A6
0xedad 0x63f5 # CJK UNIFIED IDEOGRAPH-63F5
0xedae 0x6460 # CJK UNIFIED IDEOGRAPH-6460
0xedaf 0x649d # CJK UNIFIED IDEOGRAPH-649D
0xedb0 0x64ce # CJK UNIFIED IDEOGRAPH-64CE
0xedb1 0x654e # CJK UNIFIED IDEOGRAPH-654E
0xedb2 0x6600 # CJK UNIFIED IDEOGRAPH-6600
0xedb3 0x6615 # CJK UNIFIED IDEOGRAPH-6615
0xedb4 0x663b # CJK UNIFIED IDEOGRAPH-663B
0xedb5 0x6609 # CJK UNIFIED IDEOGRAPH-6609
0xedb6 0x662e # CJK UNIFIED IDEOGRAPH-662E
0xedb7 0x661e # CJK UNIFIED IDEOGRAPH-661E
0xedb8 0x6624 # CJK UNIFIED IDEOGRAPH-6624
0xedb9 0x6665 # CJK UNIFIED IDEOGRAPH-6665
0xedba 0x6657 # CJK UNIFIED IDEOGRAPH-6657
0xedbb 0x6659 # CJK UNIFIED IDEOGRAPH-6659
0xedbc 0xfa12 # CJK COMPATIBILITY IDEOGRAPH-FA12
0xedbd 0x6673 # CJK UNIFIED IDEOGRAPH-6673
0xedbe 0x6699 # CJK UNIFIED IDEOGRAPH-6699
0xedbf 0x66a0 # CJK UNIFIED IDEOGRAPH-66A0
0xedc0 0x66b2 # CJK UNIFIED IDEOGRAPH-66B2
0xedc1 0x66bf # CJK UNIFIED IDEOGRAPH-66BF
0xedc2 0x66fa # CJK UNIFIED IDEOGRAPH-66FA
0xedc3 0x670e # CJK UNIFIED IDEOGRAPH-670E
0xedc4 0xf929 # CJK COMPATIBILITY IDEOGRAPH-F929
0xedc5 0x6766 # CJK UNIFIED IDEOGRAPH-6766
0xedc6 0x67bb # CJK UNIFIED IDEOGRAPH-67BB
0xedc7 0x6852 # CJK UNIFIED IDEOGRAPH-6852
0xedc8 0x67c0 # CJK UNIFIED IDEOGRAPH-67C0
0xedc9 0x6801 # CJK UNIFIED IDEOGRAPH-6801
0xedca 0x6844 # CJK UNIFIED IDEOGRAPH-6844
0xedcb 0x68cf # CJK UNIFIED IDEOGRAPH-68CF
0xedcc 0xfa13 # CJK COMPATIBILITY IDEOGRAPH-FA13
0xedcd 0x6968 # CJK UNIFIED IDEOGRAPH-6968
0xedce 0xfa14 # CJK COMPATIBILITY IDEOGRAPH-FA14
0xedcf 0x6998 # CJK UNIFIED IDEOGRAPH-6998
0xedd0 0x69e2 # CJK UNIFIED IDEOGRAPH-69E2
0xedd1 0x6a30 # CJK UNIFIED IDEOGRAPH-6A30
0xedd2 0x6a6b # CJK UNIFIED IDEOGRAPH-6A6B
0xedd3 0x6a46 # CJK UNIFIED IDEOGRAPH-6A46
0xedd4 0x6a73 # CJK UNIFIED IDEOGRAPH-6A73
0xedd5 0x6a7e # CJK UNIFIED IDEOGRAPH-6A7E
0xedd6 0x6ae2 # CJK UNIFIED IDEOGRAPH-6AE2
0xedd7 0x6ae4 # CJK UNIFIED IDEOGRAPH-6AE4
0xedd8 0x6bd6 # CJK UNIFIED IDEOGRAPH-6BD6
0xedd9 0x6c3f # CJK UNIFIED IDEOGRAPH-6C3F
0xedda 0x6c5c # CJK UNIFIED IDEOGRAPH-6C5C
0xeddb 0x6c86 # CJK UNIFIED IDEOGRAPH-6C86
0xeddc 0x6c6f # CJK UNIFIED IDEOGRAPH-6C6F
0xeddd 0x6cda # CJK UNIFIED IDEOGRAPH-6CDA
0xedde 0x6d04 # CJK UNIFIED IDEOGRAPH-6D04
0xeddf 0x6d87 # CJK UNIFIED IDEOGRAPH-6D87
0xede0 0x6d6f # CJK UNIFIED IDEOGRAPH-6D6F
0xede1 0x6d96 # CJK UNIFIED IDEOGRAPH-6D96
0xede2 0x6dac # CJK UNIFIED IDEOGRAPH-6DAC
0xede3 0x6dcf # CJK UNIFIED IDEOGRAPH-6DCF
0xede4 0x6df8 # CJK UNIFIED IDEOGRAPH-6DF8
0xede5 0x6df2 # CJK UNIFIED IDEOGRAPH-6DF2
0xede6 0x6dfc # CJK UNIFIED IDEOGRAPH-6DFC
0xede7 0x6e39 # CJK UNIFIED IDEOGRAPH-6E39
0xede8 0x6e5c # CJK UNIFIED IDEOGRAPH-6E5C
0xede9 0x6e27 # CJK UNIFIED IDEOGRAPH-6E27
0xedea 0x6e3c # CJK UNIFIED IDEOGRAPH-6E3C
0xedeb 0x6ebf # CJK UNIFIED IDEOGRAPH-6EBF
0xedec 0x6f88 # CJK UNIFIED IDEOGRAPH-6F88
0xeded 0x6fb5 # CJK UNIFIED IDEOGRAPH-6FB5
0xedee 0x6ff5 # CJK UNIFIED IDEOGRAPH-6FF5
0xedef 0x7005 # CJK UNIFIED IDEOGRAPH-7005
0xedf0 0x7007 # CJK UNIFIED IDEOGRAPH-7007
0xedf1 0x7028 # CJK UNIFIED IDEOGRAPH-7028
0xedf2 0x7085 # CJK UNIFIED IDEOGRAPH-7085
0xedf3 0x70ab # CJK UNIFIED IDEOGRAPH-70AB
0xedf4 0x710f # CJK UNIFIED IDEOGRAPH-710F
0xedf5 0x7104 # CJK UNIFIED IDEOGRAPH-7104
0xedf6 0x715c # CJK UNIFIED IDEOGRAPH-715C
0xedf7 0x7146 # CJK UNIFIED IDEOGRAPH-7146
0xedf8 0x7147 # CJK UNIFIED IDEOGRAPH-7147
0xedf9 0xfa15 # CJK COMPATIBILITY IDEOGRAPH-FA15
0xedfa 0x71c1 # CJK UNIFIED IDEOGRAPH-71C1
0xedfb 0x71fe # CJK UNIFIED IDEOGRAPH-71FE
0xedfc 0x72b1 # CJK UNIFIED IDEOGRAPH-72B1
0xee40 0x72be # CJK UNIFIED IDEOGRAPH-72BE
0xee41 0x7324 # CJK UNIFIED IDEOGRAPH-7324
0xee42 0xfa16 # CJK COMPATIBILITY IDEOGRAPH-FA16
0xee43 0x7377 # CJK UNIFIED IDEOGRAPH-7377
0xee44 0x73bd # CJK UNIFIED IDEOGRAPH-73BD
0xee45 0x73c9 # CJK UNIFIED IDEOGRAPH-73C9
0xee46 0x73d6 # CJK UNIFIED IDEOGRAPH-73D6
0xee47 0x73e3 # CJK UNIFIED IDEOGRAPH-73E3
0xee48 0x73d2 # CJK UNIFIED IDEOGRAPH-73D2
0xee49 0x7407 # CJK UNIFIED IDEOGRAPH-7407
0xee4a 0x73f5 # CJK UNIFIED IDEOGRAPH-73F5
0xee4b 0x7426 # CJK UNIFIED IDEOGRAPH-7426
0xee4c 0x742a # CJK UNIFIED IDEOGRAPH-742A
0xee4d 0x7429 # CJK UNIFIED IDEOGRAPH-7429
0xee4e 0x742e # CJK UNIFIED IDEOGRAPH-742E
0xee4f 0x7462 # CJK UNIFIED IDEOGRAPH-7462
0xee50 0x7489 # CJK UNIFIED IDEOGRAPH-7489
0xee51 0x749f # CJK UNIFIED IDEOGRAPH-749F
0xee52 0x7501 # CJK UNIFIED IDEOGRAPH-7501
0xee53 0x756f # CJK UNIFIED IDEOGRAPH-756F
0xee54 0x7682 # CJK UNIFIED IDEOGRAPH-7682
0xee55 0x769c # CJK UNIFIED IDEOGRAPH-769C
0xee56 0x769e # CJK UNIFIED IDEOGRAPH-769E
0xee57 0x769b # CJK UNIFIED IDEOGRAPH-769B
0xee58 0x76a6 # CJK UNIFIED IDEOGRAPH-76A6
0xee59 0xfa17 # CJK COMPATIBILITY IDEOGRAPH-FA17
0xee5a 0x7746 # CJK UNIFIED IDEOGRAPH-7746
0xee5b 0x52af # CJK UNIFIED IDEOGRAPH-52AF
0xee5c 0x7821 # CJK UNIFIED IDEOGRAPH-7821
0xee5d 0x784e # CJK UNIFIED IDEOGRAPH-784E
0xee5e 0x7864 # CJK UNIFIED IDEOGRAPH-7864
0xee5f 0x787a # CJK UNIFIED IDEOGRAPH-787A
0xee60 0x7930 # CJK UNIFIED IDEOGRAPH-7930
0xee61 0xfa18 # CJK COMPATIBILITY IDEOGRAPH-FA18
0xee62 0xfa19 # CJK COMPATIBILITY IDEOGRAPH-FA19
0xee63 0xfa1a # CJK COMPATIBILITY IDEOGRAPH-FA1A
0xee64 0x7994 # CJK UNIFIED IDEOGRAPH-7994
0xee65 0xfa1b # CJK COMPATIBILITY IDEOGRAPH-FA1B
0xee66 0x799b # CJK UNIFIED IDEOGRAPH-799B
0xee67 0x7ad1 # CJK UNIFIED IDEOGRAPH-7AD1
0xee68 0x7ae7 # CJK UNIFIED IDEOGRAPH-7AE7
0xee69 0xfa1c # CJK COMPATIBILITY IDEOGRAPH-FA1C
0xee6a 0x7aeb # CJK UNIFIED IDEOGRAPH-7AEB
0xee6b 0x7b9e # CJK UNIFIED IDEOGRAPH-7B9E
0xee6c 0xfa1d # CJK COMPATIBILITY IDEOGRAPH-FA1D
0xee6d 0x7d48 # CJK UNIFIED IDEOGRAPH-7D48
0xee6e 0x7d5c # CJK UNIFIED IDEOGRAPH-7D5C
0xee6f 0x7db7 # CJK UNIFIED IDEOGRAPH-7DB7
0xee70 0x7da0 # CJK UNIFIED IDEOGRAPH-7DA0
0xee71 0x7dd6 # CJK UNIFIED IDEOGRAPH-7DD6
0xee72 0x7e52 # CJK UNIFIED IDEOGRAPH-7E52
0xee73 0x7f47 # CJK UNIFIED IDEOGRAPH-7F47
0xee74 0x7fa1 # CJK UNIFIED IDEOGRAPH-7FA1
0xee75 0xfa1e # CJK COMPATIBILITY IDEOGRAPH-FA1E
0xee76 0x8301 # CJK UNIFIED IDEOGRAPH-8301
0xee77 0x8362 # CJK UNIFIED IDEOGRAPH-8362
0xee78 0x837f # CJK UNIFIED IDEOGRAPH-837F
0xee79 0x83c7 # CJK UNIFIED IDEOGRAPH-83C7
0xee7a 0x83f6 # CJK UNIFIED IDEOGRAPH-83F6
0xee7b 0x8448 # CJK UNIFIED IDEOGRAPH-8448
0xee7c 0x84b4 # CJK UNIFIED IDEOGRAPH-84B4
0xee7d 0x8553 # CJK UNIFIED IDEOGRAPH-8553
0xee7e 0x8559 # CJK UNIFIED IDEOGRAPH-8559
0xee80 0x856b # CJK UNIFIED IDEOGRAPH-856B
0xee81 0xfa1f # CJK COMPATIBILITY IDEOGRAPH-FA1F
0xee82 0x85b0 # CJK UNIFIED IDEOGRAPH-85B0
0xee83 0xfa20 # CJK COMPATIBILITY IDEOGRAPH-FA20
0xee84 0xfa21 # CJK COMPATIBILITY IDEOGRAPH-FA21
0xee85 0x8807 # CJK UNIFIED IDEOGRAPH-8807
0xee86 0x88f5 # CJK UNIFIED IDEOGRAPH-88F5
0xee87 0x8a12 # CJK UNIFIED IDEOGRAPH-8A12
0xee88 0x8a37 # CJK UNIFIED IDEOGRAPH-8A37
0xee89 0x8a79 # CJK UNIFIED IDEOGRAPH-8A79
0xee8a 0x8aa7 # CJK UNIFIED IDEOGRAPH-8AA7
0xee8b 0x8abe # CJK UNIFIED IDEOGRAPH-8ABE
0xee8c 0x8adf # CJK UNIFIED IDEOGRAPH-8ADF
0xee8d 0xfa22 # CJK COMPATIBILITY IDEOGRAPH-FA22
0xee8e 0x8af6 # CJK UNIFIED IDEOGRAPH-8AF6
0xee8f 0x8b53 # CJK UNIFIED IDEOGRAPH-8B53
0xee90 0x8b7f # CJK UNIFIED IDEOGRAPH-8B7F
0xee91 0x8cf0 # CJK UNIFIED IDEOGRAPH-8CF0
0xee92 0x8cf4 # CJK UNIFIED IDEOGRAPH-8CF4
0xee93 0x8d12 # CJK UNIFIED IDEOGRAPH-8D12
0xee94 0x8d76 # CJK UNIFIED IDEOGRAPH-8D76
0xee95 0xfa23 # CJK COMPATIBILITY IDEOGRAPH-FA23
0xee96 0x8ecf # CJK UNIFIED IDEOGRAPH-8ECF
0xee97 0xfa24 # CJK COMPATIBILITY IDEOGRAPH-FA24
0xee98 0xfa25 # CJK COMPATIBILITY IDEOGRAPH-FA25
0xee99 0x9067 # CJK UNIFIED IDEOGRAPH-9067
0xee9a 0x90de # CJK UNIFIED IDEOGRAPH-90DE
0xee9b 0xfa26 # CJK COMPATIBILITY IDEOGRAPH-FA26
0xee9c 0x9115 # CJK UNIFIED IDEOGRAPH-9115
0xee9d 0x9127 # CJK UNIFIED IDEOGRAPH-9127
0xee9e 0x91da # CJK UNIFIED IDEOGRAPH-91DA
0xee9f 0x91d7 # CJK UNIFIED IDEOGRAPH-91D7
0xeea0 0x91de # CJK UNIFIED IDEOGRAPH-91DE
0xeea1 0x91ed # CJK UNIFIED IDEOGRAPH-91ED
0xeea2 0x91ee # CJK UNIFIED IDEOGRAPH-91EE
0xeea3 0x91e4 # CJK UNIFIED IDEOGRAPH-91E4
0xeea4 0x91e5 # CJK UNIFIED IDEOGRAPH-91E5
0xeea5 0x9206 # CJK UNIFIED IDEOGRAPH-9206
0xeea6 0x9210 # CJK UNIFIED IDEOGRAPH-9210
0xeea7 0x920a # CJK UNIFIED IDEOGRAPH-920A
0xeea8 0x923a # CJK UNIFIED IDEOGRAPH-923A
0xeea9 0x9240 # CJK UNIFIED IDEOGRAPH-9240
0xeeaa 0x923c # CJK UNIFIED IDEOGRAPH-923C
0xeeab 0x924e # CJK UNIFIED IDEOGRAPH-924E
0xeeac 0x9259 # CJK UNIFIED IDEOGRAPH-9259
0xeead 0x9251 # CJK UNIFIED IDEOGRAPH-9251
0xeeae 0x9239 # CJK UNIFIED IDEOGRAPH-9239
0xeeaf 0x9267 # CJK UNIFIED IDEOGRAPH-9267
0xeeb0 0x92a7 # CJK UNIFIED IDEOGRAPH-92A7
0xeeb1 0x9277 # CJK UNIFIED IDEOGRAPH-9277
0xeeb2 0x9278 # CJK UNIFIED IDEOGRAPH-9278
0xeeb3 0x92e7 # CJK UNIFIED IDEOGRAPH-92E7
0xeeb4 0x92d7 # CJK UNIFIED IDEOGRAPH-92D7
0xeeb5 0x92d9 # CJK UNIFIED IDEOGRAPH-92D9
0xeeb6 0x92d0 # CJK UNIFIED IDEOGRAPH-92D0
0xeeb7 0xfa27 # CJK COMPATIBILITY IDEOGRAPH-FA27
0xeeb8 0x92d5 # CJK UNIFIED IDEOGRAPH-92D5
0xeeb9 0x92e0 # CJK UNIFIED IDEOGRAPH-92E0
0xeeba 0x92d3 # CJK UNIFIED IDEOGRAPH-92D3
0xeebb 0x9325 # CJK UNIFIED IDEOGRAPH-9325
0xeebc 0x9321 # CJK UNIFIED IDEOGRAPH-9321
0xeebd 0x92fb # CJK UNIFIED IDEOGRAPH-92FB
0xeebe 0xfa28 # CJK COMPATIBILITY IDEOGRAPH-FA28
0xeebf 0x931e # CJK UNIFIED IDEOGRAPH-931E
0xeec0 0x92ff # CJK UNIFIED IDEOGRAPH-92FF
0xeec1 0x931d # CJK UNIFIED IDEOGRAPH-931D
0xeec2 0x9302 # CJK UNIFIED IDEOGRAPH-9302
0xeec3 0x9370 # CJK UNIFIED IDEOGRAPH-9370
0xeec4 0x9357 # CJK UNIFIED IDEOGRAPH-9357
0xeec5 0x93a4 # CJK UNIFIED IDEOGRAPH-93A4
0xeec6 0x93c6 # CJK UNIFIED IDEOGRAPH-93C6
0xeec7 0x93de # CJK UNIFIED IDEOGRAPH-93DE
0xeec8 0x93f8 # CJK UNIFIED IDEOGRAPH-93F8
0xeec9 0x9431 # CJK UNIFIED IDEOGRAPH-9431
0xeeca 0x9445 # CJK UNIFIED IDEOGRAPH-9445
0xeecb 0x9448 # CJK UNIFIED IDEOGRAPH-9448
0xeecc 0x9592 # CJK UNIFIED IDEOGRAPH-9592
0xeecd 0xf9dc # CJK COMPATIBILITY IDEOGRAPH-F9DC
0xeece 0xfa29 # CJK COMPATIBILITY IDEOGRAPH-FA29
0xeecf 0x969d # CJK UNIFIED IDEOGRAPH-969D
0xeed0 0x96af # CJK UNIFIED IDEOGRAPH-96AF
0xeed1 0x9733 # CJK UNIFIED IDEOGRAPH-9733
0xeed2 0x973b # CJK UNIFIED IDEOGRAPH-973B
0xeed3 0x9743 # CJK UNIFIED IDEOGRAPH-9743
0xeed4 0x974d # CJK UNIFIED IDEOGRAPH-974D
0xeed5 0x974f # CJK UNIFIED IDEOGRAPH-974F
0xeed6 0x9751 # CJK UNIFIED IDEOGRAPH-9751
0xeed7 0x9755 # CJK UNIFIED IDEOGRAPH-9755
0xeed8 0x9857 # CJK UNIFIED IDEOGRAPH-9857
0xeed9 0x9865 # CJK UNIFIED IDEOGRAPH-9865
0xeeda 0xfa2a # CJK COMPATIBILITY IDEOGRAPH-FA2A
0xeedb 0xfa2b # CJK COMPATIBILITY IDEOGRAPH-FA2B
0xeedc 0x9927 # CJK UNIFIED IDEOGRAPH-9927
0xeedd 0xfa2c # CJK COMPATIBILITY IDEOGRAPH-FA2C
0xeede 0x999e # CJK UNIFIED IDEOGRAPH-999E
0xeedf 0x9a4e # CJK UNIFIED IDEOGRAPH-9A4E
0xeee0 0x9ad9 # CJK UNIFIED IDEOGRAPH-9AD9
0xeee1 0x9adc # CJK UNIFIED IDEOGRAPH-9ADC
0xeee2 0x9b75 # CJK UNIFIED IDEOGRAPH-9B75
0xeee3 0x9b72 # CJK UNIFIED IDEOGRAPH-9B72
0xeee4 0x9b8f # CJK UNIFIED IDEOGRAPH-9B8F
0xeee5 0x9bb1 # CJK UNIFIED IDEOGRAPH-9BB1
0xeee6 0x9bbb # CJK UNIFIED IDEOGRAPH-9BBB
0xeee7 0x9c00 # CJK UNIFIED IDEOGRAPH-9C00
0xeee8 0x9d70 # CJK UNIFIED IDEOGRAPH-9D70
0xeee9 0x9d6b # CJK UNIFIED IDEOGRAPH-9D6B
0xeeea 0xfa2d # CJK COMPATIBILITY IDEOGRAPH-FA2D
0xeeeb 0x9e19 # CJK UNIFIED IDEOGRAPH-9E19
0xeeec 0x9ed1 # CJK UNIFIED IDEOGRAPH-9ED1
0xeeef 0x2170 # SMALL ROMAN NUMERAL ONE
0xeef0 0x2171 # SMALL ROMAN NUMERAL TWO
0xeef1 0x2172 # SMALL ROMAN NUMERAL THREE
0xeef2 0x2173 # SMALL ROMAN NUMERAL FOUR
0xeef3 0x2174 # SMALL ROMAN NUMERAL FIVE
0xeef4 0x2175 # SMALL ROMAN NUMERAL SIX
0xeef5 0x2176 # SMALL ROMAN NUMERAL SEVEN
0xeef6 0x2177 # SMALL ROMAN NUMERAL EIGHT
0xeef7 0x2178 # SMALL ROMAN NUMERAL NINE
0xeef8 0x2179 # SMALL ROMAN NUMERAL TEN
0xeef9 0xffe2 # FULLWIDTH NOT SIGN
0xeefa 0xffe4 # FULLWIDTH BROKEN BAR
0xeefb 0xff07 # FULLWIDTH APOSTROPHE
0xeefc 0xff02 # FULLWIDTH QUOTATION MARK
0xfa4a 0x2160 # ROMAN NUMERAL ONE
0xfa4b 0x2161 # ROMAN NUMERAL TWO
0xfa4c 0x2162 # ROMAN NUMERAL THREE
0xfa4d 0x2163 # ROMAN NUMERAL FOUR
0xfa4e 0x2164 # ROMAN NUMERAL FIVE
0xfa4f 0x2165 # ROMAN NUMERAL SIX
0xfa50 0x2166 # ROMAN NUMERAL SEVEN
0xfa51 0x2167 # ROMAN NUMERAL EIGHT
0xfa52 0x2168 # ROMAN NUMERAL NINE
0xfa53 0x2169 # ROMAN NUMERAL TEN
0xfa54 0xffe2 # FULLWIDTH NOT SIGN
0xfa58 0x3231 # PARENTHESIZED IDEOGRAPH STOCK
0xfa59 0x2116 # NUMERO SIGN
0xfa5a 0x2121 # TELEPHONE SIGN
0xfa5b 0x2235 # BECAUSE
此差异已折叠。
此差异已折叠。
此差异已折叠。
#
# copy/paste of MS950.b2c-irreversible
#
# removed the entries of MS950.c2b-irreversible etries, this .nr
# table only includes "b->c only" entries
# (we don't need a MS950.c2b, the entries of MS950.c2b-irreversible
# are added in MS950.b2c already)
#
0xF9FA 0x256D
0xF9FB 0x256E
0xF9FC 0x2570
0xF9FD 0x256F
0xA2CC 0x5341
0xA2CE 0x5345
0xF9F9 0x2550
0xF9E9 0x255E
0xF9EA 0x256A
0xF9EB 0x2561
# #
#clzName csName hisName dbtype pkg ascii b1min b1max b2min b2max #clzName csName hisName dbtype pkg ascii b1min b1max b2min b2max
# #
Johab x-Johab x-Johab basic sun.nio.cs.ext true 0x84 0xf9 0x31 0xfe
EUC_CN GB2312 EUC_CN basic sun.nio.cs.ext true 0xa1 0xf7 0xa1 0xfe
EUC_KR EUC-KR EUC_KR basic sun.nio.cs.ext true 0xa1 0xfd 0xa1 0xfe
MS932 windows-31j MS932 basic sun.nio.cs.ext true 0x81 0xfc 0x40 0xfc
MS936 x-mswin-936 MS936 basic sun.nio.cs.ext true 0x81 0xfe 0x40 0xfe
MS949 x-windows-949 MS949 basic sun.nio.cs.ext true 0x81 0xfe 0x41 0xfe
MS950 x-windows-950 MS950 basic sun.nio.cs.ext true 0x81 0xfe 0x40 0xfe
GBK GBK GBK basic sun.nio.cs.ext true 0x81 0xfe 0x40 0xfe
IBM1381 x-IBM1381 Cp1381 basic sun.nio.cs.ext true 0x8c 0xf7 0xa1 0xfe IBM1381 x-IBM1381 Cp1381 basic sun.nio.cs.ext true 0x8c 0xf7 0xa1 0xfe
IBM1383 x-IBM1383 Cp1383 euc_sim sun.nio.cs.ext true 0xa1 0xfe 0xa1 0xfe IBM1383 x-IBM1383 Cp1383 euc_sim sun.nio.cs.ext true 0xa1 0xfe 0xa1 0xfe
IBM930 x-IBM930 Cp930 ebcdic sun.nio.cs.ext false 0x40 0x7f 0x40 0xfe IBM930 x-IBM930 Cp930 ebcdic sun.nio.cs.ext false 0x40 0x7f 0x40 0xfe
......
...@@ -35,7 +35,7 @@ import static build.tools.charsetmapping.CharsetMapping.*; ...@@ -35,7 +35,7 @@ import static build.tools.charsetmapping.CharsetMapping.*;
public class GenerateDBCS { public class GenerateDBCS {
// pattern used by this class to read in mapping table // pattern used by this class to read in mapping table
static Pattern mPattern = Pattern.compile("(\\p{XDigit}++)\\s++(\\p{XDigit}++)(\\s++#.*)?"); static Pattern mPattern = Pattern.compile("(?:0x)?(\\p{XDigit}++)\\s++(?:0x)?(\\p{XDigit}++)(?:\\s++#.*)?");
public static void genDBCS(String args[]) throws Exception { public static void genDBCS(String args[]) throws Exception {
Scanner s = new Scanner(new File(args[0], args[2])); Scanner s = new Scanner(new File(args[0], args[2]));
...@@ -260,10 +260,12 @@ public class GenerateDBCS { ...@@ -260,10 +260,12 @@ public class GenerateDBCS {
"StandardCharsets.aliases_" + clzName : "StandardCharsets.aliases_" + clzName :
"ExtendedCharsets.aliasesFor(\"" + csName + "\")") "ExtendedCharsets.aliasesFor(\"" + csName + "\")")
.replace("$NAME_CS$" , csName) .replace("$NAME_CS$" , csName)
.replace("$CONTAINS$", isASCII ? .replace("$CONTAINS$",
" return ((cs.name().equals(\"US-ASCII\")) || (cs instanceof " "MS932".equals(clzName)?
+ clzName + "));": "return ((cs.name().equals(\"US-ASCII\")) || (cs instanceof JIS_X_0201) || (cs instanceof " + clzName + "));":
" return (cs instanceof " + clzName + ");") (isASCII ?
"return ((cs.name().equals(\"US-ASCII\")) || (cs instanceof " + clzName + "));":
"return (cs instanceof " + clzName + ");"))
.replace("$HISTORICALNAME$", .replace("$HISTORICALNAME$",
(hisName == null)? "" : (hisName == null)? "" :
" public String historicalName() { return \"" + hisName + "\"; }") " public String historicalName() { return \"" + hisName + "\"; }")
......
...@@ -683,10 +683,16 @@ static void ...@@ -683,10 +683,16 @@ static void
SetClassPath(const char *s) SetClassPath(const char *s)
{ {
char *def; char *def;
const char *orig = s;
static const char format[] = "-Djava.class.path=%s";
s = JLI_WildcardExpandClasspath(s); s = JLI_WildcardExpandClasspath(s);
def = JLI_MemAlloc(JLI_StrLen(s) + 40); def = JLI_MemAlloc(sizeof(format)
sprintf(def, "-Djava.class.path=%s", s); - 2 /* strlen("%s") */
+ JLI_StrLen(s));
sprintf(def, format, s);
AddOption(def, NULL); AddOption(def, NULL);
if (s != orig)
JLI_MemFree((char *) s);
} }
/* /*
......
...@@ -30,15 +30,15 @@ import java.net.URI; ...@@ -30,15 +30,15 @@ import java.net.URI;
import java.net.URL; import java.net.URL;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.*; import java.util.List;
import java.nio.file.*; import java.util.ArrayList;
import java.nio.file.attribute.*;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileAttribute;
import sun.security.action.GetPropertyAction; import sun.security.action.GetPropertyAction;
/** /**
* An abstract representation of file and directory pathnames. * An abstract representation of file and directory pathnames.
* *
...@@ -787,7 +787,7 @@ public class File ...@@ -787,7 +787,7 @@ public class File
* java.lang.SecurityManager#checkRead(java.lang.String)}</code> * java.lang.SecurityManager#checkRead(java.lang.String)}</code>
* method denies read access to the file * method denies read access to the file
* *
* @see Attributes#readBasicFileAttributes * @see java.nio.file.attribute.Attributes#readBasicFileAttributes
*/ */
public boolean isDirectory() { public boolean isDirectory() {
SecurityManager security = System.getSecurityManager(); SecurityManager security = System.getSecurityManager();
...@@ -813,7 +813,7 @@ public class File ...@@ -813,7 +813,7 @@ public class File
* java.lang.SecurityManager#checkRead(java.lang.String)}</code> * java.lang.SecurityManager#checkRead(java.lang.String)}</code>
* method denies read access to the file * method denies read access to the file
* *
* @see Attributes#readBasicFileAttributes * @see java.nio.file.attribute.Attributes#readBasicFileAttributes
*/ */
public boolean isFile() { public boolean isFile() {
SecurityManager security = System.getSecurityManager(); SecurityManager security = System.getSecurityManager();
...@@ -863,7 +863,7 @@ public class File ...@@ -863,7 +863,7 @@ public class File
* java.lang.SecurityManager#checkRead(java.lang.String)}</code> * java.lang.SecurityManager#checkRead(java.lang.String)}</code>
* method denies read access to the file * method denies read access to the file
* *
* @see Attributes#readBasicFileAttributes * @see java.nio.file.attribute.Attributes#readBasicFileAttributes
*/ */
public long lastModified() { public long lastModified() {
SecurityManager security = System.getSecurityManager(); SecurityManager security = System.getSecurityManager();
...@@ -887,7 +887,7 @@ public class File ...@@ -887,7 +887,7 @@ public class File
* java.lang.SecurityManager#checkRead(java.lang.String)}</code> * java.lang.SecurityManager#checkRead(java.lang.String)}</code>
* method denies read access to the file * method denies read access to the file
* *
* @see Attributes#readBasicFileAttributes * @see java.nio.file.attribute.Attributes#readBasicFileAttributes
*/ */
public long length() { public long length() {
SecurityManager security = System.getSecurityManager(); SecurityManager security = System.getSecurityManager();
...@@ -1369,9 +1369,10 @@ public class File ...@@ -1369,9 +1369,10 @@ public class File
* Sets the owner's or everybody's write permission for this abstract * Sets the owner's or everybody's write permission for this abstract
* pathname. * pathname.
* *
* <p> The {@link Attributes Attributes} class defines methods that operate * <p> The {@link java.nio.file.attribute.Attributes Attributes} class
* on file attributes including file permissions. This may be used when * defines methods that operate on file attributes including file
* finer manipulation of file permissions is required. * permissions. This may be used when finer manipulation of file permissions
* is required.
* *
* @param writable * @param writable
* If <code>true</code>, sets the access permission to allow write * If <code>true</code>, sets the access permission to allow write
...@@ -1436,9 +1437,10 @@ public class File ...@@ -1436,9 +1437,10 @@ public class File
* Sets the owner's or everybody's read permission for this abstract * Sets the owner's or everybody's read permission for this abstract
* pathname. * pathname.
* *
* <p> The {@link Attributes Attributes} class defines methods that operate * <p> The {@link java.nio.file.attribute.Attributes Attributes} class
* on file attributes including file permissions. This may be used when * defines methods that operate on file attributes including file
* finer manipulation of file permissions is required. * permissions. This may be used when finer manipulation of file permissions
* is required.
* *
* @param readable * @param readable
* If <code>true</code>, sets the access permission to allow read * If <code>true</code>, sets the access permission to allow read
...@@ -1509,9 +1511,10 @@ public class File ...@@ -1509,9 +1511,10 @@ public class File
* Sets the owner's or everybody's execute permission for this abstract * Sets the owner's or everybody's execute permission for this abstract
* pathname. * pathname.
* *
* <p> The {@link Attributes Attributes} class defines methods that operate * <p> The {@link java.nio.file.attribute.Attributes Attributes} class
* on file attributes including file permissions. This may be used when * defines methods that operate on file attributes including file
* finer manipulation of file permissions is required. * permissions. This may be used when finer manipulation of file permissions
* is required.
* *
* @param executable * @param executable
* If <code>true</code>, sets the access permission to allow execute * If <code>true</code>, sets the access permission to allow execute
...@@ -1748,16 +1751,17 @@ public class File ...@@ -1748,16 +1751,17 @@ public class File
return fs.getSpace(this, FileSystem.SPACE_USABLE); return fs.getSpace(this, FileSystem.SPACE_USABLE);
} }
/* -- Temporary files -- */ /* -- Temporary files -- */
private static class TemporaryDirectory { static class TempDirectory {
private TemporaryDirectory() { } private TempDirectory() { }
static final String valueAsString = fs.normalize( // temporary directory location
AccessController.doPrivileged(new GetPropertyAction("java.io.tmpdir"))); private static final File tmpdir = new File(fs.normalize(AccessController
static final File valueAsFile = .doPrivileged(new GetPropertyAction("java.io.tmpdir"))));
new File(valueAsString, fs.prefixLength(valueAsString)); static File location() {
return tmpdir;
}
// file name generation // file name generation
private static final SecureRandom random = new SecureRandom(); private static final SecureRandom random = new SecureRandom();
...@@ -1770,25 +1774,6 @@ public class File ...@@ -1770,25 +1774,6 @@ public class File
} }
return new File(dir, prefix + Long.toString(n) + suffix); return new File(dir, prefix + Long.toString(n) + suffix);
} }
// default file permissions
static final FileAttribute<Set<PosixFilePermission>> defaultPosixFilePermissions =
PosixFilePermissions.asFileAttribute(EnumSet
.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE));
static final boolean isPosix = isPosix();
static boolean isPosix() {
return AccessController.doPrivileged(
new PrivilegedAction<Boolean>() {
public Boolean run() {
try {
return FileSystems.getDefault().getPath(valueAsString)
.getFileStore().supportsFileAttributeView("posix");
} catch (IOException e) {
throw new IOError(e);
}
}
});
}
} }
/** /**
...@@ -1869,12 +1854,11 @@ public class File ...@@ -1869,12 +1854,11 @@ public class File
if (suffix == null) if (suffix == null)
suffix = ".tmp"; suffix = ".tmp";
File tmpdir = (directory != null) ? File tmpdir = (directory != null) ? directory : TempDirectory.location();
directory : TemporaryDirectory.valueAsFile;
SecurityManager sm = System.getSecurityManager(); SecurityManager sm = System.getSecurityManager();
File f; File f;
do { do {
f = TemporaryDirectory.generateFile(prefix, suffix, tmpdir); f = TempDirectory.generateFile(prefix, suffix, tmpdir);
if (sm != null) { if (sm != null) {
try { try {
sm.checkWrite(f.getPath()); sm.checkWrite(f.getPath());
...@@ -1891,11 +1875,17 @@ public class File ...@@ -1891,11 +1875,17 @@ public class File
/** /**
* Creates an empty file in the default temporary-file directory, using * Creates an empty file in the default temporary-file directory, using
* the given prefix and suffix to generate its name. Invoking this method * the given prefix and suffix to generate its name. Invoking this method
* is equivalent to invoking <code>{@link #createTempFile(java.lang.String, * is equivalent to invoking <code>{@link #createTempFile(java.lang.String,
* java.lang.String, java.io.File) * java.lang.String, java.io.File)
* createTempFile(prefix,&nbsp;suffix,&nbsp;null)}</code>. * createTempFile(prefix,&nbsp;suffix,&nbsp;null)}</code>.
* *
* <p> The {@link #createTemporaryFile(String,String,FileAttribute[])} method
* provides an alternative method to create an empty file in the
* temporary-file directory. Files created by that method may have more
* restrictive access permissions to files created by this method and so
* may be more suited to security-sensitive applications.
*
* @param prefix The prefix string to be used in generating the file's * @param prefix The prefix string to be used in generating the file's
* name; must be at least three characters long * name; must be at least three characters long
* *
...@@ -1926,17 +1916,7 @@ public class File ...@@ -1926,17 +1916,7 @@ public class File
/** /**
* Creates an empty file in the default temporary-file directory, using * Creates an empty file in the default temporary-file directory, using
* the given prefix and suffix to generate its name. This method is * the given prefix and suffix to generate its name.
* equivalent to invoking the {@link #createTempFile(String,String)
* createTempFile(prefix,&nbsp;suffix)} method with the addition that the
* resulting pathname may be requested to be deleted when the Java virtual
* machine terminates, and the initial file attributes to set atomically
* when creating the file may be specified.
*
* <p> When the value of the {@code deleteOnExit} method is {@code true}
* then the resulting file is requested to be deleted when the Java virtual
* machine terminates as if by invoking the {@link #deleteOnExit deleteOnExit}
* method.
* *
* <p> The {@code attrs} parameter is an optional array of {@link FileAttribute * <p> The {@code attrs} parameter is an optional array of {@link FileAttribute
* attributes} to set atomically when creating the file. Each attribute is * attributes} to set atomically when creating the file. Each attribute is
...@@ -1944,6 +1924,12 @@ public class File ...@@ -1944,6 +1924,12 @@ public class File
* of the same name is included in the array then all but the last occurrence * of the same name is included in the array then all but the last occurrence
* is ignored. * is ignored.
* *
* <p> Where the {@code attrs} parameter does not specify <i>access
* permissions</i> to set atomically when creating the file, then the
* resulting file may have more restrictive access permissions than files
* created by the {@link #createTempFile(java.lang.String, java.lang.String)}
* method.
*
* @param prefix * @param prefix
* The prefix string to be used in generating the file's * The prefix string to be used in generating the file's
* name; must be at least three characters long * name; must be at least three characters long
...@@ -1951,9 +1937,6 @@ public class File ...@@ -1951,9 +1937,6 @@ public class File
* The suffix string to be used in generating the file's * The suffix string to be used in generating the file's
* name; may be {@code null}, in which case the suffix * name; may be {@code null}, in which case the suffix
* {@code ".tmp"} will be used * {@code ".tmp"} will be used
* @param deleteOnExit
* {@code true} if the file denoted by resulting pathname be
* deleted when the Java virtual machine terminates
* @param attrs * @param attrs
* An optional list of file attributes to set atomically when creating * An optional list of file attributes to set atomically when creating
* the file * the file
...@@ -1961,7 +1944,7 @@ public class File ...@@ -1961,7 +1944,7 @@ public class File
* @return An abstract pathname denoting a newly-created empty file * @return An abstract pathname denoting a newly-created empty file
* *
* @throws IllegalArgumentException * @throws IllegalArgumentException
* If the <code>prefix</code> argument contains fewer than three * If the {@code prefix} argument contains fewer than three
* characters * characters
* @throws UnsupportedOperationException * @throws UnsupportedOperationException
* If the array contains an attribute that cannot be set atomically * If the array contains an attribute that cannot be set atomically
...@@ -1971,74 +1954,19 @@ public class File ...@@ -1971,74 +1954,19 @@ public class File
* @throws SecurityException * @throws SecurityException
* If a security manager exists and its <code>{@link * If a security manager exists and its <code>{@link
* java.lang.SecurityManager#checkWrite(java.lang.String)}</code> * java.lang.SecurityManager#checkWrite(java.lang.String)}</code>
* method does not allow a file to be created. When the {@code * method does not allow a file to be created.
* deleteOnExit} parameter has the value {@code true} then the *
* security manager's {@link
* java.lang.SecurityManager#checkDelete(java.lang.String)} is
* invoked to check delete access to the file.
* @since 1.7 * @since 1.7
*/ */
public static File createTempFile(String prefix, public static File createTemporaryFile(String prefix,
String suffix, String suffix,
boolean deleteOnExit, FileAttribute<?>... attrs)
FileAttribute<?>... attrs)
throws IOException throws IOException
{ {
if (prefix.length() < 3) if (prefix.length() < 3)
throw new IllegalArgumentException("Prefix string too short"); throw new IllegalArgumentException("Prefix string too short");
suffix = (suffix == null) ? ".tmp" : suffix; suffix = (suffix == null) ? ".tmp" : suffix;
return TempFileHelper.createFile(prefix, suffix, attrs);
// special case POSIX environments so that 0600 is used as the file mode
if (TemporaryDirectory.isPosix) {
if (attrs.length == 0) {
// no attributes so use default permissions
attrs = new FileAttribute<?>[1];
attrs[0] = TemporaryDirectory.defaultPosixFilePermissions;
} else {
// check if posix permissions given; if not use default
boolean hasPermissions = false;
for (int i=0; i<attrs.length; i++) {
if (attrs[i].name().equals("posix:permissions")) {
hasPermissions = true;
break;
}
}
if (!hasPermissions) {
FileAttribute<?>[] copy = new FileAttribute<?>[attrs.length+1];
System.arraycopy(attrs, 0, copy, 0, attrs.length);
attrs = copy;
attrs[attrs.length-1] =
TemporaryDirectory.defaultPosixFilePermissions;
}
}
}
// use Path#createFile to create file
SecurityManager sm = System.getSecurityManager();
for (;;) {
File f = TemporaryDirectory
.generateFile(prefix, suffix, TemporaryDirectory.valueAsFile);
if (sm != null && deleteOnExit)
sm.checkDelete(f.getPath());
try {
f.toPath().createFile(attrs);
if (deleteOnExit)
DeleteOnExitHook.add(f.getPath());
return f;
} catch (InvalidPathException e) {
// don't reveal temporary directory location
if (sm != null)
throw new IllegalArgumentException("Invalid prefix or suffix");
throw e;
} catch (SecurityException e) {
// don't reveal temporary directory location
if (sm != null)
throw new SecurityException("Unable to create temporary file");
throw e;
} catch (FileAlreadyExistsException e) {
// ignore
}
}
} }
/* -- Basic infrastructure -- */ /* -- Basic infrastructure -- */
...@@ -2153,40 +2081,45 @@ public class File ...@@ -2153,40 +2081,45 @@ public class File
/** /**
* Returns a {@link Path java.nio.file.Path} object constructed from the * Returns a {@link Path java.nio.file.Path} object constructed from the
* this abstract path. The first invocation of this method works as if * this abstract path. The resulting {@code Path} is associated with the
* invoking it were equivalent to evaluating the expression: * {@link java.nio.file.FileSystems#getDefault default-filesystem}.
*
* <p> The first invocation of this method works as if invoking it were
* equivalent to evaluating the expression:
* <blockquote><pre> * <blockquote><pre>
* {@link FileSystems#getDefault FileSystems.getDefault}().{@link FileSystem#getPath getPath}(this.{@link #getPath getPath}()); * {@link java.nio.file.FileSystems#getDefault FileSystems.getDefault}().{@link
* java.nio.file.FileSystem#getPath getPath}(this.{@link #getPath getPath}());
* </pre></blockquote> * </pre></blockquote>
* Subsequent invocations of this method return the same {@code Path}. * Subsequent invocations of this method return the same {@code Path}.
* *
* <p> If this abstract pathname is the empty abstract pathname then this * <p> If this abstract pathname is the empty abstract pathname then this
* method returns a {@code Path} that may be used to access to the current * method returns a {@code Path} that may be used to access the current
* user directory. * user directory.
* *
* @return A {@code Path} constructed from this abstract path. The resulting * @return a {@code Path} constructed from this abstract path
* {@code Path} is associated with the {@link FileSystems#getDefault
* default-filesystem}.
* *
* @throws InvalidPathException * @throws InvalidPathException
* If a {@code Path} object cannot be constructed from the abstract * if a {@code Path} object cannot be constructed from the abstract
* path (see {@link java.nio.file.FileSystem#getPath FileSystem.getPath}) * path (see {@link java.nio.file.FileSystem#getPath FileSystem.getPath})
* *
* @since 1.7 * @since 1.7
*/ */
public Path toPath() { public Path toPath() {
if (filePath == null) { Path result = filePath;
if (result == null) {
synchronized (this) { synchronized (this) {
if (filePath == null) { result = filePath;
if (result == null) {
if (path.length() == 0) { if (path.length() == 0) {
// assume default file system treats "." as current directory // assume default file system treats "." as current directory
filePath = Paths.get("."); result = Paths.get(".");
} else { } else {
filePath = Paths.get(path); result = Paths.get(path);
} }
filePath = result;
} }
} }
} }
return filePath; return result;
} }
} }
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package java.io;
import java.nio.file.FileSystems;
import java.nio.file.InvalidPathException;
import java.nio.file.FileAlreadyExistsException;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import static java.nio.file.attribute.PosixFilePermission.*;
import java.util.Set;
import java.util.EnumSet;
/**
* Helper class to support creation of temporary files and directory with
* initial attributes.
*/
class TempFileHelper {
private TempFileHelper() { }
// default file and directory permissions (lazily initialized)
private static class PermissionsHolder {
static final boolean hasPosixPermissions = FileSystems.getDefault()
.supportedFileAttributeViews().contains("posix");
static final FileAttribute<Set<PosixFilePermission>> filePermissions =
PosixFilePermissions.asFileAttribute(EnumSet.of(OWNER_READ, OWNER_WRITE));
static final FileAttribute<Set<PosixFilePermission>> directoryPermissions =
PosixFilePermissions.asFileAttribute(EnumSet
.of(OWNER_READ, OWNER_WRITE, OWNER_EXECUTE));
}
/**
* Creates a file or directory in the temporary directory.
*/
private static File create(String prefix,
String suffix,
FileAttribute[] attrs,
boolean isDirectory)
throws IOException
{
// in POSIX environments use default file and directory permissions
// if initial permissions not given by caller.
if (PermissionsHolder.hasPosixPermissions) {
if (attrs.length == 0) {
// no attributes so use default permissions
attrs = new FileAttribute<?>[1];
attrs[0] = (isDirectory) ? PermissionsHolder.directoryPermissions :
PermissionsHolder.filePermissions;
} else {
// check if posix permissions given; if not use default
boolean hasPermissions = false;
for (int i=0; i<attrs.length; i++) {
if (attrs[i].name().equals("posix:permissions")) {
hasPermissions = true;
break;
}
}
if (!hasPermissions) {
FileAttribute<?>[] copy = new FileAttribute<?>[attrs.length+1];
System.arraycopy(attrs, 0, copy, 0, attrs.length);
attrs = copy;
attrs[attrs.length-1] = (isDirectory) ?
PermissionsHolder.directoryPermissions :
PermissionsHolder.filePermissions;
}
}
}
// loop generating random names until file or directory can be created
SecurityManager sm = System.getSecurityManager();
for (;;) {
File tmpdir = File.TempDirectory.location();
File f = File.TempDirectory.generateFile(prefix, suffix, tmpdir);
try {
if (isDirectory) {
f.toPath().createDirectory(attrs);
} else {
f.toPath().createFile(attrs);
}
return f;
} catch (InvalidPathException e) {
// don't reveal temporary directory location
if (sm != null)
throw new IllegalArgumentException("Invalid prefix or suffix");
throw e;
} catch (SecurityException e) {
// don't reveal temporary directory location
if (sm != null)
throw new SecurityException("Unable to create temporary file");
throw e;
} catch (FileAlreadyExistsException e) {
// ignore
}
}
}
/**
* Creates a file in the temporary directory.
*/
static File createFile(String prefix, String suffix, FileAttribute[] attrs)
throws IOException
{
return create(prefix, suffix, attrs, false);
}
/**
* Creates a directory in the temporary directory.
*/
static File createDirectory(String prefix, FileAttribute[] attrs)
throws IOException
{
return create(prefix, "", attrs, true);
}
}
/* /*
* Copyright 2003-2004 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -40,6 +40,12 @@ public enum ElementType { ...@@ -40,6 +40,12 @@ public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */ /** Class, interface (including annotation type), or enum declaration */
TYPE, TYPE,
/** Uses of a type */
TYPE_USE,
/** type parameters */
TYPE_PARAMETER,
/** Field declaration (includes enum constants) */ /** Field declaration (includes enum constants) */
FIELD, FIELD,
......
...@@ -34,7 +34,6 @@ import java.util.logging.LoggingMXBean; ...@@ -34,7 +34,6 @@ import java.util.logging.LoggingMXBean;
import java.util.logging.LogManager; import java.util.logging.LogManager;
import java.nio.BufferPoolMXBean; import java.nio.BufferPoolMXBean;
import javax.management.MBeanServerConnection; import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName; import javax.management.ObjectName;
import com.sun.management.HotSpotDiagnosticMXBean; import com.sun.management.HotSpotDiagnosticMXBean;
...@@ -198,10 +197,7 @@ enum PlatformComponent { ...@@ -198,10 +197,7 @@ enum PlatformComponent {
"java.nio", "BufferPool", keyProperties("name"), "java.nio", "BufferPool", keyProperties("name"),
new MXBeanFetcher<BufferPoolMXBean>() { new MXBeanFetcher<BufferPoolMXBean>() {
public List<BufferPoolMXBean> getMXBeans() { public List<BufferPoolMXBean> getMXBeans() {
List<BufferPoolMXBean> pools = new ArrayList<BufferPoolMXBean>(2); return ManagementFactoryHelper.getBufferPoolMXBeans();
pools.add( sun.misc.SharedSecrets.getJavaNioAccess().getDirectBufferPoolMXBean() );
pools.add( sun.nio.ch.FileChannelImpl.getMappedBufferPoolMXBean() );
return pools;
} }
}), }),
......
...@@ -1101,7 +1101,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> { ...@@ -1101,7 +1101,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
// See "Hacker's Delight" section 2-12 for explanation of // See "Hacker's Delight" section 2-12 for explanation of
// the overflow test. // the overflow test.
if ( (((sum ^ xs) & (sum ^ ys))) >= 0L) // not overflowed if ( (((sum ^ xs) & (sum ^ ys))) >= 0L) // not overflowed
return new BigDecimal(null, sum, rscale, 0); return BigDecimal.valueOf(sum, rscale);
} }
if (fst == null) if (fst == null)
fst = BigInteger.valueOf(xs); fst = BigInteger.valueOf(xs);
...@@ -1311,9 +1311,9 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> { ...@@ -1311,9 +1311,9 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
* would occur since division is expensive on most CPUs. * would occur since division is expensive on most CPUs.
*/ */
long product = x * y; long product = x * y;
int prec = this.precision() + multiplicand.precision(); long prec = this.precision() + multiplicand.precision();
if (prec < 19 || (prec < 21 && (y == 0 || product / y == x))) if (prec < 19 || (prec < 21 && (y == 0 || product / y == x)))
return new BigDecimal(null, product, productScale, 0); return BigDecimal.valueOf(product, productScale);
return new BigDecimal(BigInteger.valueOf(x).multiply(y), INFLATED, return new BigDecimal(BigInteger.valueOf(x).multiply(y), INFLATED,
productScale, 0); productScale, 0);
} }
...@@ -1584,7 +1584,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> { ...@@ -1584,7 +1584,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
return (preferredScale >= 0 && return (preferredScale >= 0 &&
preferredScale < ZERO_SCALED_BY.length) ? preferredScale < ZERO_SCALED_BY.length) ?
ZERO_SCALED_BY[preferredScale] : ZERO_SCALED_BY[preferredScale] :
new BigDecimal(null, 0, preferredScale, 1); BigDecimal.valueOf(0, preferredScale);
else { else {
this.inflate(); this.inflate();
divisor.inflate(); divisor.inflate();
......
...@@ -29,7 +29,6 @@ import java.io.OutputStream; ...@@ -29,7 +29,6 @@ import java.io.OutputStream;
import java.io.BufferedOutputStream; import java.io.BufferedOutputStream;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedExceptionAction; import java.security.PrivilegedExceptionAction;
import java.util.prefs.Preferences;
import sun.net.www.ParseUtil; import sun.net.www.ParseUtil;
/* import org.ietf.jgss.*; */ /* import org.ietf.jgss.*; */
...@@ -41,7 +40,7 @@ import sun.net.www.ParseUtil; ...@@ -41,7 +40,7 @@ import sun.net.www.ParseUtil;
class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
private String server = null; private String server = null;
private int port = DEFAULT_PORT; private int serverPort = DEFAULT_PORT;
private InetSocketAddress external_address; private InetSocketAddress external_address;
private boolean useV4 = false; private boolean useV4 = false;
private Socket cmdsock = null; private Socket cmdsock = null;
...@@ -57,7 +56,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -57,7 +56,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
SocksSocketImpl(String server, int port) { SocksSocketImpl(String server, int port) {
this.server = server; this.server = server;
this.port = (port == -1 ? DEFAULT_PORT : port); this.serverPort = (port == -1 ? DEFAULT_PORT : port);
} }
SocksSocketImpl(Proxy proxy) { SocksSocketImpl(Proxy proxy) {
...@@ -66,8 +65,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -66,8 +65,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
InetSocketAddress ad = (InetSocketAddress) a; InetSocketAddress ad = (InetSocketAddress) a;
// Use getHostString() to avoid reverse lookups // Use getHostString() to avoid reverse lookups
server = ad.getHostString(); server = ad.getHostString();
port = ad.getPort(); serverPort = ad.getPort();
applicationSetProxy = true;
} }
} }
...@@ -117,16 +115,12 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -117,16 +115,12 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
*/ */
private boolean authenticate(byte method, InputStream in, private boolean authenticate(byte method, InputStream in,
BufferedOutputStream out) throws IOException { BufferedOutputStream out) throws IOException {
byte[] data = null;
int i;
// No Authentication required. We're done then! // No Authentication required. We're done then!
if (method == NO_AUTH) if (method == NO_AUTH)
return true; return true;
/** /**
* User/Password authentication. Try, in that order : * User/Password authentication. Try, in that order :
* - The application provided Authenticator, if any * - The application provided Authenticator, if any
* - The user preferences java.net.socks.username &
* java.net.socks.password
* - the user.name & no password (backward compatibility behavior). * - the user.name & no password (backward compatibility behavior).
*/ */
if (method == USER_PASSW) { if (method == USER_PASSW) {
...@@ -138,39 +132,15 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -138,39 +132,15 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
new java.security.PrivilegedAction<PasswordAuthentication>() { new java.security.PrivilegedAction<PasswordAuthentication>() {
public PasswordAuthentication run() { public PasswordAuthentication run() {
return Authenticator.requestPasswordAuthentication( return Authenticator.requestPasswordAuthentication(
server, addr, port, "SOCKS5", "SOCKS authentication", null); server, addr, serverPort, "SOCKS5", "SOCKS authentication", null);
} }
}); });
if (pw != null) { if (pw != null) {
userName = pw.getUserName(); userName = pw.getUserName();
password = new String(pw.getPassword()); password = new String(pw.getPassword());
} else { } else {
final Preferences prefs = Preferences.userRoot().node("/java/net/socks"); userName = java.security.AccessController.doPrivileged(
try { new sun.security.action.GetPropertyAction("user.name"));
userName = AccessController.doPrivileged(
new java.security.PrivilegedExceptionAction<String>() {
public String run() throws IOException {
return prefs.get("username", null);
}
});
} catch (java.security.PrivilegedActionException pae) {
throw (IOException) pae.getException();
}
if (userName != null) {
try {
password = AccessController.doPrivileged(
new java.security.PrivilegedExceptionAction<String>() {
public String run() throws IOException {
return prefs.get("password", null);
}
});
} catch (java.security.PrivilegedActionException pae) {
throw (IOException) pae.getException();
}
} else {
userName = getUserName();
}
} }
if (userName == null) if (userName == null)
return false; return false;
...@@ -191,8 +161,8 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -191,8 +161,8 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
} else } else
out.write(0); out.write(0);
out.flush(); out.flush();
data = new byte[2]; byte[] data = new byte[2];
i = readSocksReply(in, data); int i = readSocksReply(in, data);
if (i != 2 || data[1] != 0) { if (i != 2 || data[1] != 0) {
/* RFC 1929 specifies that the connection MUST be closed if /* RFC 1929 specifies that the connection MUST be closed if
authentication fails */ authentication fails */
...@@ -324,6 +294,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -324,6 +294,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
* @throws IllegalArgumentException if endpoint is null or a * @throws IllegalArgumentException if endpoint is null or a
* SocketAddress subclass not supported by this socket * SocketAddress subclass not supported by this socket
*/ */
@Override
protected void connect(SocketAddress endpoint, int timeout) throws IOException { protected void connect(SocketAddress endpoint, int timeout) throws IOException {
SecurityManager security = System.getSecurityManager(); SecurityManager security = System.getSecurityManager();
if (endpoint == null || !(endpoint instanceof InetSocketAddress)) if (endpoint == null || !(endpoint instanceof InetSocketAddress))
...@@ -354,7 +325,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -354,7 +325,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
super.connect(epoint, timeout); super.connect(epoint, timeout);
return; return;
} }
URI uri = null; URI uri;
// Use getHostString() to avoid reverse lookups // Use getHostString() to avoid reverse lookups
String host = epoint.getHostString(); String host = epoint.getHostString();
// IPv6 litteral? // IPv6 litteral?
...@@ -367,6 +338,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -367,6 +338,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
} catch (URISyntaxException e) { } catch (URISyntaxException e) {
// This shouldn't happen // This shouldn't happen
assert false : e; assert false : e;
uri = null;
} }
Proxy p = null; Proxy p = null;
IOException savedExc = null; IOException savedExc = null;
...@@ -388,18 +360,18 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -388,18 +360,18 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
throw new SocketException("Unknow address type for proxy: " + p); throw new SocketException("Unknow address type for proxy: " + p);
// Use getHostString() to avoid reverse lookups // Use getHostString() to avoid reverse lookups
server = ((InetSocketAddress) p.address()).getHostString(); server = ((InetSocketAddress) p.address()).getHostString();
port = ((InetSocketAddress) p.address()).getPort(); serverPort = ((InetSocketAddress) p.address()).getPort();
// Connects to the SOCKS server // Connects to the SOCKS server
try { try {
privilegedConnect(server, port, timeout); privilegedConnect(server, serverPort, timeout);
// Worked, let's get outta here // Worked, let's get outta here
break; break;
} catch (IOException e) { } catch (IOException e) {
// Ooops, let's notify the ProxySelector // Ooops, let's notify the ProxySelector
sel.connectFailed(uri,p.address(),e); sel.connectFailed(uri,p.address(),e);
server = null; server = null;
port = -1; serverPort = -1;
savedExc = e; savedExc = e;
// Will continue the while loop and try the next proxy // Will continue the while loop and try the next proxy
} }
...@@ -416,7 +388,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -416,7 +388,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
} else { } else {
// Connects to the SOCKS server // Connects to the SOCKS server
try { try {
privilegedConnect(server, port, timeout); privilegedConnect(server, serverPort, timeout);
} catch (IOException e) { } catch (IOException e) {
throw new SocketException(e.getMessage()); throw new SocketException(e.getMessage());
} }
...@@ -489,7 +461,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -489,7 +461,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
if (i != 4) if (i != 4)
throw new SocketException("Reply from SOCKS server has bad length"); throw new SocketException("Reply from SOCKS server has bad length");
SocketException ex = null; SocketException ex = null;
int nport, len; int len;
byte[] addr; byte[] addr;
switch (data[1]) { switch (data[1]) {
case REQUEST_OK: case REQUEST_OK:
...@@ -504,8 +476,6 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -504,8 +476,6 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
i = readSocksReply(in, data); i = readSocksReply(in, data);
if (i != 2) if (i != 2)
throw new SocketException("Reply from SOCKS server badly formatted"); throw new SocketException("Reply from SOCKS server badly formatted");
nport = ((int)data[0] & 0xff) << 8;
nport += ((int)data[1] & 0xff);
break; break;
case DOMAIN_NAME: case DOMAIN_NAME:
len = data[1]; len = data[1];
...@@ -517,8 +487,6 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -517,8 +487,6 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
i = readSocksReply(in, data); i = readSocksReply(in, data);
if (i != 2) if (i != 2)
throw new SocketException("Reply from SOCKS server badly formatted"); throw new SocketException("Reply from SOCKS server badly formatted");
nport = ((int)data[0] & 0xff) << 8;
nport += ((int)data[1] & 0xff);
break; break;
case IPV6: case IPV6:
len = data[1]; len = data[1];
...@@ -530,8 +498,6 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -530,8 +498,6 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
i = readSocksReply(in, data); i = readSocksReply(in, data);
if (i != 2) if (i != 2)
throw new SocketException("Reply from SOCKS server badly formatted"); throw new SocketException("Reply from SOCKS server badly formatted");
nport = ((int)data[0] & 0xff) << 8;
nport += ((int)data[1] & 0xff);
break; break;
default: default:
ex = new SocketException("Reply from SOCKS server contains wrong code"); ex = new SocketException("Reply from SOCKS server contains wrong code");
...@@ -664,7 +630,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -664,7 +630,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
*/ */
return; return;
} }
URI uri = null; URI uri;
// Use getHostString() to avoid reverse lookups // Use getHostString() to avoid reverse lookups
String host = saddr.getHostString(); String host = saddr.getHostString();
// IPv6 litteral? // IPv6 litteral?
...@@ -677,6 +643,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -677,6 +643,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
} catch (URISyntaxException e) { } catch (URISyntaxException e) {
// This shouldn't happen // This shouldn't happen
assert false : e; assert false : e;
uri = null;
} }
Proxy p = null; Proxy p = null;
Exception savedExc = null; Exception savedExc = null;
...@@ -696,7 +663,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -696,7 +663,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
throw new SocketException("Unknow address type for proxy: " + p); throw new SocketException("Unknow address type for proxy: " + p);
// Use getHostString() to avoid reverse lookups // Use getHostString() to avoid reverse lookups
server = ((InetSocketAddress) p.address()).getHostString(); server = ((InetSocketAddress) p.address()).getHostString();
port = ((InetSocketAddress) p.address()).getPort(); serverPort = ((InetSocketAddress) p.address()).getPort();
// Connects to the SOCKS server // Connects to the SOCKS server
try { try {
...@@ -704,7 +671,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -704,7 +671,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
new PrivilegedExceptionAction<Void>() { new PrivilegedExceptionAction<Void>() {
public Void run() throws Exception { public Void run() throws Exception {
cmdsock = new Socket(new PlainSocketImpl()); cmdsock = new Socket(new PlainSocketImpl());
cmdsock.connect(new InetSocketAddress(server, port)); cmdsock.connect(new InetSocketAddress(server, serverPort));
cmdIn = cmdsock.getInputStream(); cmdIn = cmdsock.getInputStream();
cmdOut = cmdsock.getOutputStream(); cmdOut = cmdsock.getOutputStream();
return null; return null;
...@@ -714,7 +681,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -714,7 +681,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
// Ooops, let's notify the ProxySelector // Ooops, let's notify the ProxySelector
sel.connectFailed(uri,p.address(),new SocketException(e.getMessage())); sel.connectFailed(uri,p.address(),new SocketException(e.getMessage()));
server = null; server = null;
port = -1; serverPort = -1;
cmdsock = null; cmdsock = null;
savedExc = e; savedExc = e;
// Will continue the while loop and try the next proxy // Will continue the while loop and try the next proxy
...@@ -735,7 +702,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -735,7 +702,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
new PrivilegedExceptionAction<Void>() { new PrivilegedExceptionAction<Void>() {
public Void run() throws Exception { public Void run() throws Exception {
cmdsock = new Socket(new PlainSocketImpl()); cmdsock = new Socket(new PlainSocketImpl());
cmdsock.connect(new InetSocketAddress(server, port)); cmdsock.connect(new InetSocketAddress(server, serverPort));
cmdIn = cmdsock.getInputStream(); cmdIn = cmdsock.getInputStream();
cmdOut = cmdsock.getOutputStream(); cmdOut = cmdsock.getOutputStream();
return null; return null;
...@@ -810,7 +777,6 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -810,7 +777,6 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
switch (data[1]) { switch (data[1]) {
case REQUEST_OK: case REQUEST_OK:
// success! // success!
InetSocketAddress real_end = null;
switch(data[3]) { switch(data[3]) {
case IPV4: case IPV4:
addr = new byte[4]; addr = new byte[4];
...@@ -1017,6 +983,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -1017,6 +983,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
* @return the value of this socket's <code>address</code> field. * @return the value of this socket's <code>address</code> field.
* @see java.net.SocketImpl#address * @see java.net.SocketImpl#address
*/ */
@Override
protected InetAddress getInetAddress() { protected InetAddress getInetAddress() {
if (external_address != null) if (external_address != null)
return external_address.getAddress(); return external_address.getAddress();
...@@ -1030,6 +997,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -1030,6 +997,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
* @return the value of this socket's <code>port</code> field. * @return the value of this socket's <code>port</code> field.
* @see java.net.SocketImpl#port * @see java.net.SocketImpl#port
*/ */
@Override
protected int getPort() { protected int getPort() {
if (external_address != null) if (external_address != null)
return external_address.getPort(); return external_address.getPort();
...@@ -1037,6 +1005,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -1037,6 +1005,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
return super.getPort(); return super.getPort();
} }
@Override
protected int getLocalPort() { protected int getLocalPort() {
if (socket != null) if (socket != null)
return super.getLocalPort(); return super.getLocalPort();
...@@ -1046,6 +1015,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts { ...@@ -1046,6 +1015,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
return super.getLocalPort(); return super.getLocalPort();
} }
@Override
protected void close() throws IOException { protected void close() throws IOException {
if (cmdsock != null) if (cmdsock != null)
cmdsock.close(); cmdsock.close();
......
...@@ -26,11 +26,8 @@ ...@@ -26,11 +26,8 @@
package java.nio; package java.nio;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction;
import sun.misc.Unsafe; import sun.misc.Unsafe;
import sun.misc.VM; import sun.misc.VM;
import javax.management.ObjectName;
import javax.management.MalformedObjectNameException;
/** /**
* Access to bits, native and otherwise. * Access to bits, native and otherwise.
...@@ -676,55 +673,34 @@ class Bits { // package-private ...@@ -676,55 +673,34 @@ class Bits { // package-private
} }
} }
// -- Management interface for monitoring of direct buffer usage -- // -- Monitoring of direct buffer usage --
static { static {
// setup access to this package in SharedSecrets // setup access to this package in SharedSecrets
sun.misc.SharedSecrets.setJavaNioAccess( sun.misc.SharedSecrets.setJavaNioAccess(
new sun.misc.JavaNioAccess() { new sun.misc.JavaNioAccess() {
@Override @Override
public BufferPoolMXBean getDirectBufferPoolMXBean() { public sun.misc.JavaNioAccess.BufferPool getDirectBufferPool() {
return LazyInitialization.directBufferPoolMXBean; return new sun.misc.JavaNioAccess.BufferPool() {
@Override
public String getName() {
return "direct";
}
@Override
public long getCount() {
return Bits.count;
}
@Override
public long getTotalCapacity() {
return Bits.usedMemory;
}
@Override
public long getMemoryUsed() {
return Bits.reservedMemory;
}
};
} }
} });
);
}
// Lazy initialization of management interface
private static class LazyInitialization {
static final BufferPoolMXBean directBufferPoolMXBean = directBufferPoolMXBean();
private static BufferPoolMXBean directBufferPoolMXBean() {
final String pool = "direct";
final ObjectName obj;
try {
obj = new ObjectName("java.nio:type=BufferPool,name=" + pool);
} catch (MalformedObjectNameException x) {
throw new AssertionError(x);
}
return new BufferPoolMXBean() {
@Override
public ObjectName getObjectName() {
return obj;
}
@Override
public String getName() {
return pool;
}
@Override
public long getCount() {
return Bits.count;
}
@Override
public long getTotalCapacity() {
return Bits.usedMemory;
}
@Override
public long getMemoryUsed() {
return Bits.reservedMemory;
}
};
}
} }
// -- Bulk get/put acceleration -- // -- Bulk get/put acceleration --
......
...@@ -30,7 +30,6 @@ package java.nio; ...@@ -30,7 +30,6 @@ package java.nio;
import sun.misc.Cleaner; import sun.misc.Cleaner;
import sun.misc.Unsafe; import sun.misc.Unsafe;
import sun.nio.ch.DirectBuffer; import sun.nio.ch.DirectBuffer;
import sun.nio.ch.FileChannelImpl;
class Direct$Type$Buffer$RW$$BO$ class Direct$Type$Buffer$RW$$BO$
......
...@@ -47,7 +47,7 @@ import java.io.IOException; ...@@ -47,7 +47,7 @@ import java.io.IOException;
* so that method invocations on the implementation class can be chained. * so that method invocations on the implementation class can be chained.
* *
* @since 1.7 * @since 1.7
* @see java.nio.file.FileRef#newByteChannel * @see java.nio.file.Path#newByteChannel
*/ */
public interface SeekableByteChannel public interface SeekableByteChannel
......
...@@ -30,7 +30,7 @@ package java.nio.file; ...@@ -30,7 +30,7 @@ package java.nio.file;
* *
* @since 1.7 * @since 1.7
* *
* @see FileRef#checkAccess * @see Path#checkAccess
*/ */
public enum AccessMode { public enum AccessMode {
......
...@@ -27,6 +27,7 @@ package java.nio.file; ...@@ -27,6 +27,7 @@ package java.nio.file;
import java.util.Iterator; import java.util.Iterator;
import java.io.Closeable; import java.io.Closeable;
import java.io.IOException;
/** /**
* An object to iterate over the entries in a directory. A directory stream * An object to iterate over the entries in a directory. A directory stream
...@@ -50,13 +51,10 @@ import java.io.Closeable; ...@@ -50,13 +51,10 @@ import java.io.Closeable;
* *
* <p> A {@code DirectoryStream} is opened upon creation and is closed by * <p> A {@code DirectoryStream} is opened upon creation and is closed by
* invoking the {@link #close close} method. Closing the directory stream * invoking the {@link #close close} method. Closing the directory stream
* releases any resources associated with the stream. The {@link * releases any resources associated with the stream. Once a directory stream
* Files#withDirectory Files.withDirectory} utility method is useful for cases * is closed, all further method invocations on the iterator throw {@link
* where a task is performed on entries in a directory. This method automatically * java.util.concurrent.ConcurrentModificationException} with cause {@link
* closes the directory stream when iteration is complete (or an error occurs). * ClosedDirectoryStreamException}.
* Once a directory stream is closed, all further method invocations on the
* iterator throw {@link java.util.concurrent.ConcurrentModificationException}
* with cause {@link ClosedDirectoryStreamException}.
* *
* <p> A directory stream is not required to be <i>asynchronously closeable</i>. * <p> A directory stream is not required to be <i>asynchronously closeable</i>.
* If a thread is blocked on the directory stream's iterator reading from the * If a thread is blocked on the directory stream's iterator reading from the
...@@ -79,7 +77,7 @@ import java.io.Closeable; ...@@ -79,7 +77,7 @@ import java.io.Closeable;
* *
* <p> The iterator's {@link Iterator#remove() remove} method removes the * <p> The iterator's {@link Iterator#remove() remove} method removes the
* directory entry for the last element returned by the iterator, as if by * directory entry for the last element returned by the iterator, as if by
* invoking the {@link FileRef#delete delete} method. If an I/O error or * invoking the {@link Path#delete delete} method. If an I/O error or
* security exception occurs then {@code ConcurrentModificationException} is * security exception occurs then {@code ConcurrentModificationException} is
* thrown with the cause. * thrown with the cause.
* *
...@@ -104,10 +102,6 @@ public interface DirectoryStream<T> ...@@ -104,10 +102,6 @@ public interface DirectoryStream<T>
* newDirectoryStream} method when opening a directory to iterate over the * newDirectoryStream} method when opening a directory to iterate over the
* entries in the directory. * entries in the directory.
* *
* <p> The {@link DirectoryStreamFilters} class defines factory methods to
* create filters for a number of common usages and also methods to combine
* filters.
*
* @param <T> the type of the directory entry * @param <T> the type of the directory entry
* *
* @since 1.7 * @since 1.7
...@@ -120,8 +114,11 @@ public interface DirectoryStream<T> ...@@ -120,8 +114,11 @@ public interface DirectoryStream<T>
* the directory entry to be tested * the directory entry to be tested
* *
* @return {@code true} if the directory entry should be accepted * @return {@code true} if the directory entry should be accepted
*
* @throws IOException
* If an I/O error occurs
*/ */
boolean accept(T entry); boolean accept(T entry) throws IOException;
} }
/** /**
......
/*
* Copyright 2007-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package java.nio.file;
import java.io.IOException;
import java.io.IOError;
import sun.nio.fs.MimeType;
/**
* This class consists exclusively of static methods that construct or combine
* filters.
*
* @since 1.7
*/
public final class DirectoryStreamFilters {
private DirectoryStreamFilters() { }
/**
* Constructs a directory stream filter that filters directory entries by
* their <a href="http://www.ietf.org/rfc/rfc2045.txt">MIME</a> content
* type. The directory stream filter's {@link
* java.nio.file.DirectoryStream.Filter#accept accept} method returns {@code
* true} if the content type of the directory entry can be determined by
* invoking the {@link Files#probeContentType probeContentType} method, and
* the content type matches the given content type.
*
* <p> The {@code type} parameter is the value of a Multipurpose Internet
* Mail Extension (MIME) content type as defined by <a
* href="http://www.ietf.org/rfc/rfc2045.txt"><i>RFC&nbsp;2045: Multipurpose
* Internet Mail Extensions (MIME) Part One: Format of Internet Message
* Bodies</i></a>. It is parsable according to the grammar in the RFC. Any
* space characters (<code>'&#92;u0020'</code>) surrounding its components are
* ignored. The {@code type} parameter is parsed into its primary and subtype
* components which are used to match the primary and subtype components of
* each directory entry's content type. Parameters are not allowed. The
* primary type matches if it has value {@code '*'} or is equal to the
* primary type of the directory entry's content type without regard to
* case. The subtype matches if has the value {@code '*'} or is equal to the
* subtype of the directory entry's content type without regard to case. If
* both the primary and subtype match then the filter's {@code accept} method
* returns {@code true}. If the content type of a directory entry cannot be
* determined then the entry is filtered.
*
* <p> The {@code accept} method of the resulting directory stream filter
* throws {@link IOError} if the probing of the content type fails by
* throwing an {@link IOException}. Security exceptions are also propogated
* to the caller of the {@code accept} method.
*
* <p> <b>Usage Example:</b>
* Suppose we require to list only the HTML files in a directory.
* <pre>
* DirectoryStream.Filter&lt;FileRef&gt; filter =
* DirectoryStreamFilters.newContentTypeFilter("text/html");
* </pre>
*
* @param type
* the content type
*
* @return a new directory stream filter
*
* @throws IllegalArgumentException
* if the {@code type} parameter cannot be parsed as a MIME type
* or it has parameters
*/
public static <T extends FileRef> DirectoryStream.Filter<T>
newContentTypeFilter(String type)
{
final MimeType matchType = MimeType.parse(type);
if (matchType.hasParameters())
throw new IllegalArgumentException("Parameters not allowed");
return new DirectoryStream.Filter<T>() {
@Override
public boolean accept(T entry) {
String fileType;
try {
fileType = Files.probeContentType(entry);
} catch (IOException x) {
throw new IOError(x);
}
if (fileType != null) {
return matchType.match(fileType);
}
return false;
}
};
}
/**
* Returns a directory stream filter that {@link DirectoryStream.Filter#accept
* accepts} a directory entry if the entry is accepted by all of the given
* filters.
*
* <p> This method returns a filter that invokes, in iterator order, the
* {@code accept} method of each of the filters. If {@code false} is returned
* by any of the filters then the directory entry is filtered. If the
* directory entry is not filtered then the resulting filter accepts the
* entry. If the iterator returns zero elements then the resulting filter
* accepts all directory entries.
*
* <p> <b>Usage Example:</b>
* <pre>
* List&lt;DirectoryStream.Filter&lt;? super Path&gt;&gt; filters = ...
* DirectoryStream.Filter&lt;Path&gt; filter = DirectoryStreamFilters.allOf(filters);
* </pre>
*
* @param filters
* the sequence of filters
*
* @return the resulting filter
*/
public static <T> DirectoryStream.Filter<T>
allOf(final Iterable<? extends DirectoryStream.Filter<? super T>> filters)
{
if (filters == null)
throw new NullPointerException("'filters' is null");
return new DirectoryStream.Filter<T>() {
@Override
public boolean accept(T entry) {
for (DirectoryStream.Filter<? super T> filter: filters) {
if (!filter.accept(entry))
return false;
}
return true;
}
};
}
/**
* Returns a directory stream filter that {@link DirectoryStream.Filter#accept
* accepts} a directory entry if the entry is accepted by one or more of
* the given filters.
*
* <p> This method returns a filter that invokes, in iteration order, the
* {@code accept} method of each of filter. If {@code true} is returned by
* any of the filters then the directory entry is accepted. If none of the
* filters accepts the directory entry then it is filtered. If the iterator
* returns zero elements then the resulting filter filters all directory
* entries.
*
* @param filters
* the sequence of filters
*
* @return the resulting filter
*/
public static <T> DirectoryStream.Filter<T>
anyOf(final Iterable<? extends DirectoryStream.Filter<? super T>> filters)
{
if (filters == null)
throw new NullPointerException("'filters' is null");
return new DirectoryStream.Filter<T>() {
@Override
public boolean accept(T entry) {
for (DirectoryStream.Filter<? super T> filter: filters) {
if (filter.accept(entry))
return true;
}
return false;
}
};
}
/**
* Returns a directory stream filter that is the <em>complement</em> of the
* given filter. The resulting filter {@link
* java.nio.file.DirectoryStream.Filter#accept accepts} a directory entry
* if filtered by the given filter, and filters any entries that are accepted
* by the given filter.
*
* @param filter
* the given filter
*
* @return the resulting filter that is the complement of the given filter
*/
public static <T> DirectoryStream.Filter<T>
complementOf(final DirectoryStream.Filter<T> filter)
{
if (filter == null)
throw new NullPointerException("'filter' is null");
return new DirectoryStream.Filter<T>() {
@Override
public boolean accept(T entry) {
return !filter.accept(entry);
}
};
}
}
...@@ -26,12 +26,13 @@ ...@@ -26,12 +26,13 @@
package java.nio.file; package java.nio.file;
import java.nio.file.attribute.*; import java.nio.file.attribute.*;
import java.io.IOException;
/** /**
* Storage for files. A {@code FileStore} represents a storage pool, device, * Storage for files. A {@code FileStore} represents a storage pool, device,
* partition, volume, concrete file system or other implementation specific means * partition, volume, concrete file system or other implementation specific means
* of file storage. The {@code FileStore} for where a file is stored is obtained * of file storage. The {@code FileStore} for where a file is stored is obtained
* by invoking the {@link FileRef#getFileStore getFileStore} method, or all file * by invoking the {@link Path#getFileStore getFileStore} method, or all file
* stores can be enumerated by invoking the {@link FileSystem#getFileStores * stores can be enumerated by invoking the {@link FileSystem#getFileStores
* getFileStores} method. * getFileStores} method.
* *
...@@ -146,24 +147,41 @@ public abstract class FileStore { ...@@ -146,24 +147,41 @@ public abstract class FileStore {
getFileStoreAttributeView(Class<V> type); getFileStoreAttributeView(Class<V> type);
/** /**
* Returns a {@code FileStoreAttributeView} of the given name. * Reads the value of a file store attribute.
* *
* <p> This method is intended to be used where <em>dynamic access</em> to * <p> The {@code attribute} parameter identifies the attribute to be read
* file store attributes is required. The {@code name} parameter specifies * and takes the form:
* the {@link FileAttributeView#name name} of the file store attribute view * <blockquote>
* and this method returns an instance of that view if supported. * <i>view-name</i><b>:</b><i>attribute-name</i>
* </blockquote>
* where the character {@code ':'} stands for itself.
*
* <p> <i>view-name</i> is the {@link FileStoreAttributeView#name name} of
* a {@link FileStore AttributeView} that identifies a set of file attributes.
* <i>attribute-name</i> is the name of the attribute.
* *
* <p> For {@code FileStore} objects created by the default provider, then * <p> For {@code FileStore} objects created by the default provider, then
* the file stores support the {@link FileStoreSpaceAttributeView} that * the file stores support the {@link FileStoreSpaceAttributeView} that
* provides access to space attributes. In that case invoking this method * provides access to space attributes.
* with a parameter value of {@code "space"} will always return an instance
* of that class.
* *
* @param name * <p> <b>Usage Example:</b>
* the name of the attribute view * Suppose we want to know if ZFS compression is enabled (assuming the "zfs"
* view is supported):
* <pre>
* boolean compression = (Boolean)fs.getAttribute("zfs:compression");
* </pre>
* *
* @return a file store attribute view of the given name, or {@code null} * @param attribute
* if the attribute view is not available * the attribute to read
* @return the attribute value; {@code null} may be a valid valid for some
* attributes
*
* @throws UnsupportedOperationException
* if the attribute view is not available or it does not support
* reading the attribute
* @throws IOException
* if an I/O error occurs
*/ */
public abstract FileStoreAttributeView getFileStoreAttributeView(String name); public abstract Object getAttribute(String attribute) throws IOException;
} }
...@@ -50,8 +50,6 @@ class FileTreeWalker { ...@@ -50,8 +50,6 @@ class FileTreeWalker {
case FOLLOW_LINKS : fl = true; break; case FOLLOW_LINKS : fl = true; break;
case DETECT_CYCLES : dc = true; break; case DETECT_CYCLES : dc = true; break;
default: default:
if (option == null)
throw new NullPointerException("Visit options contains 'null'");
throw new AssertionError("Should not get here"); throw new AssertionError("Should not get here");
} }
} }
...@@ -239,13 +237,13 @@ class FileTreeWalker { ...@@ -239,13 +237,13 @@ class FileTreeWalker {
} }
private static class AncestorDirectory { private static class AncestorDirectory {
private final FileRef dir; private final Path dir;
private final Object key; private final Object key;
AncestorDirectory(FileRef dir, Object key) { AncestorDirectory(Path dir, Object key) {
this.dir = dir; this.dir = dir;
this.key = key; this.key = key;
} }
FileRef file() { Path file() {
return dir; return dir;
} }
Object fileKey() { Object fileKey() {
......
...@@ -42,9 +42,9 @@ import java.io.IOException; ...@@ -42,9 +42,9 @@ import java.io.IOException;
* &#64;Override * &#64;Override
* public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { * public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
* try { * try {
* file.delete(false); * file.delete();
* } catch (IOException exc) { * } catch (IOException exc) {
* // failed to delete * // failed to delete, do error handling here
* } * }
* return FileVisitResult.CONTINUE; * return FileVisitResult.CONTINUE;
* } * }
...@@ -52,9 +52,9 @@ import java.io.IOException; ...@@ -52,9 +52,9 @@ import java.io.IOException;
* public FileVisitResult postVisitDirectory(Path dir, IOException e) { * public FileVisitResult postVisitDirectory(Path dir, IOException e) {
* if (e == null) { * if (e == null) {
* try { * try {
* dir.delete(false); * dir.delete();
* } catch (IOException exc) { * } catch (IOException exc) {
* // failed to delete * // failed to delete, do error handling here
* } * }
* } else { * } else {
* // directory iteration failed * // directory iteration failed
...@@ -80,7 +80,8 @@ import java.io.IOException; ...@@ -80,7 +80,8 @@ import java.io.IOException;
* } catch (FileAlreadyExistsException e) { * } catch (FileAlreadyExistsException e) {
* // ignore * // ignore
* } catch (IOException e) { * } catch (IOException e) {
* // copy failed, skip rest of directory and descendants * // copy failed, do error handling here
* // skip rest of directory and descendants
* return SKIP_SUBTREE; * return SKIP_SUBTREE;
* } * }
* return CONTINUE; * return CONTINUE;
...@@ -90,7 +91,7 @@ import java.io.IOException; ...@@ -90,7 +91,7 @@ import java.io.IOException;
* try { * try {
* file.copyTo(target.resolve(source.relativize(file))); * file.copyTo(target.resolve(source.relativize(file)));
* } catch (IOException e) { * } catch (IOException e) {
* // copy failed * // copy failed, do error handling here
* } * }
* return CONTINUE; * return CONTINUE;
* } * }
...@@ -100,7 +101,7 @@ import java.io.IOException; ...@@ -100,7 +101,7 @@ import java.io.IOException;
* @since 1.7 * @since 1.7
*/ */
public interface FileVisitor<T extends FileRef> { public interface FileVisitor<T> {
/** /**
* Invoked for a directory before entries in the directory are visited. * Invoked for a directory before entries in the directory are visited.
......
...@@ -26,13 +26,15 @@ ...@@ -26,13 +26,15 @@
package java.nio.file; package java.nio.file;
import java.nio.file.spi.FileTypeDetector; import java.nio.file.spi.FileTypeDetector;
import java.nio.file.attribute.*;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
/** /**
* Utility methods for files and directories. * This class consists exclusively of static methods that operate on files or
* directories.
* *
* @since 1.7 * @since 1.7
*/ */
...@@ -109,8 +111,6 @@ public final class Files { ...@@ -109,8 +111,6 @@ public final class Files {
* @throws SecurityException * @throws SecurityException
* If a security manager is installed and it denies an unspecified * If a security manager is installed and it denies an unspecified
* permission required by a file type detector implementation. * permission required by a file type detector implementation.
*
* @see DirectoryStreamFilters#newContentTypeFilter
*/ */
public static String probeContentType(FileRef file) public static String probeContentType(FileRef file)
throws IOException throws IOException
...@@ -127,158 +127,6 @@ public final class Files { ...@@ -127,158 +127,6 @@ public final class Files {
.probeContentType(file); .probeContentType(file);
} }
/**
* Invokes a {@link FileAction} for each entry in a directory accepted
* by a given {@link java.nio.file.DirectoryStream.Filter filter}.
*
* <p> This method opens the given directory and invokes the file action's
* {@link FileAction#invoke invoke} method for each entry accepted by the
* filter. When iteration is completed then the directory is closed. If the
* {@link DirectoryStream#close close} method throws an {@code IOException}
* then it is silently ignored.
*
* <p> If the {@code FileAction}'s {@code invoke} method terminates due
* to an uncaught {@link IOException}, {@code Error} or {@code RuntimeException}
* then the exception is propagated by this method after closing the
* directory.
*
* @param dir
* The directory
* @param filter
* The filter
* @param action
* The {@code FileAction} to invoke for each accepted entry
*
* @throws NotDirectoryException
* If the {@code dir} parameter is not a directory <i>(optional
* specific exception)</i>
* @throws IOException
* If an I/O error occurs or the {@code invoke} method terminates
* due to an uncaught {@code IOException}
* @throws SecurityException
* In the case of the default provider, the {@link
* SecurityManager#checkRead(String) checkRead} method is invoked
* to check read access to the directory.
*/
public static void withDirectory(Path dir,
DirectoryStream.Filter<? super Path> filter,
FileAction<? super Path> action)
throws IOException
{
// explicit null check required in case directory is empty
if (action == null)
throw new NullPointerException();
DirectoryStream<Path> stream = dir.newDirectoryStream(filter);
try {
// set to true when invoking the action so as to distinguish a
// CME thrown by the iteration from a CME thrown by the invoke
boolean inAction = false;
try {
for (Path entry: stream) {
inAction = true;
action.invoke(entry);
inAction = false;
}
} catch (ConcurrentModificationException cme) {
if (!inAction) {
Throwable cause = cme.getCause();
if (cause instanceof IOException)
throw (IOException)cause;
}
throw cme;
}
} finally {
try {
stream.close();
} catch (IOException x) { }
}
}
/**
* Invokes a {@link FileAction} for each entry in a directory with a
* file name that matches a given pattern.
*
* <p> This method opens the given directory and invokes the file action's
* {@link FileAction#invoke invoke} method for each entry that matches the
* given pattern. When iteration is completed then the directory is closed.
* If the {@link DirectoryStream#close close} method throws an {@code
* IOException} then it is silently ignored.
*
* <p> If the {@code FileAction}'s {@code invoke} method terminates due
* to an uncaught {@link IOException}, {@code Error} or {@code RuntimeException}
* then the exception is propagated by this method after closing the
* directory.
*
* <p> The globbing pattern language supported by this method is as
* specified by the {@link FileSystem#getPathMatcher getPathMatcher} method.
*
* @param dir
* The directory
* @param glob
* The globbing pattern
* @param action
* The {@code FileAction} to invoke for each entry
*
* @throws NotDirectoryException
* If the {@code dir} parameter is not a directory <i>(optional
* specific exception)</i>
* @throws IOException
* If an I/O error occurs or the {@code invoke} method terminates
* due to an uncaught {@code IOException}
* @throws SecurityException
* In the case of the default provider, the {@link
* SecurityManager#checkRead(String) checkRead} method is invoked
* to check read access to the directory.
*/
public static void withDirectory(Path dir,
String glob,
FileAction<? super Path> action)
throws IOException
{
if (glob == null)
throw new NullPointerException("'glob' is null");
final PathMatcher matcher = dir.getFileSystem().getPathMatcher("glob:" + glob);
DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
@Override
public boolean accept(Path entry) {
return matcher.matches(entry.getName());
}
};
withDirectory(dir, filter, action);
}
/**
* Invokes a {@link FileAction} for all entries in a directory.
*
* <p> This method works as if invoking it were equivalent to evaluating the
* expression:
* <blockquote><pre>
* withDirectory(dir, "*", action)
* </pre></blockquote>
*
* @param dir
* The directory
* @param action
* The {@code FileAction} to invoke for each entry
*
* @throws NotDirectoryException
* If the {@code dir} parameter is not a directory <i>(optional
* specific exception)</i>
* @throws IOException
* If an I/O error occurs or the {@code invoke} method terminates
* due to an uncaught {@code IOException}
* @throws SecurityException
* In the case of the default provider, the {@link
* SecurityManager#checkRead(String) checkRead} method is invoked
* to check read access to the directory.
*/
public static void withDirectory(Path dir, FileAction<? super Path> action)
throws IOException
{
withDirectory(dir, "*", action);
}
/** /**
* Walks a file tree. * Walks a file tree.
* *
...@@ -328,7 +176,7 @@ public final class Files { ...@@ -328,7 +176,7 @@ public final class Files {
* arises when there is an entry in a directory that is an ancestor of the * arises when there is an entry in a directory that is an ancestor of the
* directory. Cycle detection is done by recording the {@link * directory. Cycle detection is done by recording the {@link
* java.nio.file.attribute.BasicFileAttributes#fileKey file-key} of directories, * java.nio.file.attribute.BasicFileAttributes#fileKey file-key} of directories,
* or if file keys are not available, by invoking the {@link FileRef#isSameFile * or if file keys are not available, by invoking the {@link Path#isSameFile
* isSameFile} method to test if a directory is the same file as an * isSameFile} method to test if a directory is the same file as an
* ancestor. When a cycle is detected the {@link FileVisitor#visitFile * ancestor. When a cycle is detected the {@link FileVisitor#visitFile
* visitFile} is invoked with the attributes of the directory. The {@link * visitFile} is invoked with the attributes of the directory. The {@link
...@@ -403,4 +251,108 @@ public final class Files { ...@@ -403,4 +251,108 @@ public final class Files {
Integer.MAX_VALUE, Integer.MAX_VALUE,
visitor); visitor);
} }
/**
* Creates a directory by creating all nonexistent parent directories first.
*
* <p> The {@code attrs} parameter is an optional array of {@link FileAttribute
* file-attributes} to set atomically when creating the nonexistent
* directories. Each file attribute is identified by its {@link
* FileAttribute#name name}. If more than one attribute of the same name is
* included in the array then all but the last occurrence is ignored.
*
* <p> If this method fails, then it may do so after creating some, but not
* all, of the parent directories.
*
* @param dir
* the directory to create
*
* @param attrs
* an optional list of file attributes to set atomically when
* creating the directory
*
* @throws UnsupportedOperationException
* if the array contains an attribute that cannot be set atomically
* when creating the directory
* @throws FileAlreadyExistsException
* if {@code dir} exists but is not a directory <i>(optional specific
* exception)</i>
* @throws IOException
* if an I/O error occurs
* @throws SecurityException
* in the case of the default provider, and a security manager is
* installed, the {@link SecurityManager#checkWrite(String) checkWrite}
* method is invoked prior to attempting to create a directory and
* its {@link SecurityManager#checkRead(String) checkRead} is
* invoked for each parent directory that is checked. If {@code
* dir} is not an absolute path then its {@link Path#toAbsolutePath
* toAbsolutePath} may need to be invoked to get its absolute path.
* This may invoke the security manager's {@link
* SecurityManager#checkPropertyAccess(String) checkPropertyAccess}
* method to check access to the system property {@code user.dir}
*
*/
public static void createDirectories(Path dir, FileAttribute<?>... attrs)
throws IOException
{
// attempt to create the directory
try {
createAndCheckIsDirectory(dir, attrs);
return;
} catch (FileAlreadyExistsException x) {
// file exists and is not a directory
throw x;
} catch (IOException x) {
// parent may not exist or other reason
}
// find existing parent (may require absolute path)
SecurityException se = null;
try {
dir = dir.toAbsolutePath();
} catch (SecurityException x) {
// don't have permission to get absolute path
se = x;
}
Path parent = dir.getParent();
while (parent != null) {
try {
parent.checkAccess();
break;
} catch (NoSuchFileException x) {
// does not exist
}
parent = parent.getParent();
}
if (parent == null) {
// unable to find existing parent
if (se != null)
throw se;
throw new IOException("Root directory does not exist");
}
// create directories
Path child = parent;
for (Path name: parent.relativize(dir)) {
child = child.resolve(name);
createAndCheckIsDirectory(child, attrs);
}
}
/**
* Attempts to create a directory. Does nothing if the directory already
* exists.
*/
private static void createAndCheckIsDirectory(Path dir, FileAttribute<?>... attrs)
throws IOException
{
try {
dir.createDirectory(attrs);
} catch (FileAlreadyExistsException x) {
boolean isDirectory = Attributes
.readBasicFileAttributes(dir, LinkOption.NOFOLLOW_LINKS).isDirectory();
if (!isDirectory)
throw x;
}
}
} }
...@@ -95,7 +95,7 @@ public final class LinkPermission extends BasicPermission { ...@@ -95,7 +95,7 @@ public final class LinkPermission extends BasicPermission {
* {@code null} * {@code null}
* *
* @throws IllegalArgumentException * @throws IllegalArgumentException
* if name is empty or invalid * if name is empty or invalid, or actions is a non-empty string
*/ */
public LinkPermission(String name, String actions) { public LinkPermission(String name, String actions) {
super(name); super(name);
......
...@@ -30,7 +30,7 @@ package java.nio.file; ...@@ -30,7 +30,7 @@ package java.nio.file;
* *
* <p> Objects of this type are used by methods such as {@link * <p> Objects of this type are used by methods such as {@link
* Path#newOutputStream(OpenOption[]) newOutputStream}, {@link * Path#newOutputStream(OpenOption[]) newOutputStream}, {@link
* FileRef#newByteChannel newByteChannel}, {@link * Path#newByteChannel newByteChannel}, {@link
* java.nio.channels.FileChannel#open FileChannel.open}, and {@link * java.nio.channels.FileChannel#open FileChannel.open}, and {@link
* java.nio.channels.AsynchronousFileChannel#open AsynchronousFileChannel.open} * java.nio.channels.AsynchronousFileChannel#open AsynchronousFileChannel.open}
* when opening or creating a file. * when opening or creating a file.
......
...@@ -35,7 +35,7 @@ import java.net.URI; ...@@ -35,7 +35,7 @@ import java.net.URI;
* @since 1.7 * @since 1.7
*/ */
public class Paths { public final class Paths {
private Paths() { } private Paths() { }
/** /**
...@@ -106,8 +106,9 @@ public class Paths { ...@@ -106,8 +106,9 @@ public class Paths {
* if preconditions on the {@code uri} parameter do not hold. The * if preconditions on the {@code uri} parameter do not hold. The
* format of the URI is provider specific. * format of the URI is provider specific.
* @throws FileSystemNotFoundException * @throws FileSystemNotFoundException
* if the file system identified by the URI does not exist or the * The file system, identified by the URI, does not exist and
* provider identified by the URI's scheme component is not installed * cannot be created automatically, or the provider identified by
* the URI's scheme component is not installed
* @throws SecurityException * @throws SecurityException
* if a security manager is installed and it denies an unspecified * if a security manager is installed and it denies an unspecified
* permission to access the file system * permission to access the file system
......
...@@ -36,7 +36,7 @@ import java.io.IOException; ...@@ -36,7 +36,7 @@ import java.io.IOException;
* traverse file trees or otherwise operate on directories in a race-free manner. * traverse file trees or otherwise operate on directories in a race-free manner.
* Race conditions can arise when a sequence of file operations cannot be * Race conditions can arise when a sequence of file operations cannot be
* carried out in isolation. Each of the file operations defined by this * carried out in isolation. Each of the file operations defined by this
* interface specify a relative {@link Path}. All access to the file is relative * interface specify a relative path. All access to the file is relative
* to the open directory irrespective of if the directory is moved or replaced * to the open directory irrespective of if the directory is moved or replaced
* by an attacker while the directory is open. A {@code SecureDirectoryStream} * by an attacker while the directory is open. A {@code SecureDirectoryStream}
* may also be used as a virtual <em>working directory</em>. * may also be used as a virtual <em>working directory</em>.
...@@ -65,8 +65,8 @@ import java.io.IOException; ...@@ -65,8 +65,8 @@ import java.io.IOException;
* @since 1.7 * @since 1.7
*/ */
public abstract class SecureDirectoryStream public abstract class SecureDirectoryStream<T>
implements DirectoryStream<Path> implements DirectoryStream<T>
{ {
/** /**
* Initialize a new instance of this class. * Initialize a new instance of this class.
...@@ -78,13 +78,12 @@ public abstract class SecureDirectoryStream ...@@ -78,13 +78,12 @@ public abstract class SecureDirectoryStream
* SecureDirectoryStream} to iterate over the entries in the directory. * SecureDirectoryStream} to iterate over the entries in the directory.
* *
* <p> This method works in exactly the manner specified by the {@link * <p> This method works in exactly the manner specified by the {@link
* Path#newDirectoryStream newDirectoryStream} method for the case that * Path#newDirectoryStream() newDirectoryStream} method for the case that
* the {@code path} parameter is an {@link Path#isAbsolute absolute} path. * the {@code path} parameter is an {@link Path#isAbsolute absolute} path.
* When the parameter is a relative path then the directory to open is * When the parameter is a relative path then the directory to open is
* relative to this open directory. The {@code followLinks} parameter * relative to this open directory. The {@link
* determines if links should be followed. If this parameter is {@code * LinkOption#NOFOLLOW_LINKS NOFOLLOW_LINKS} option may be used to
* false} and the file is a symbolic link then this method fails (by * ensure that this method fails if the file is a symbolic link.
* throwing an I/O exception).
* *
* <p> The new directory stream, once created, is not dependent upon the * <p> The new directory stream, once created, is not dependent upon the
* directory stream used to create it. Closing this directory stream has no * directory stream used to create it. Closing this directory stream has no
...@@ -92,10 +91,8 @@ public abstract class SecureDirectoryStream ...@@ -92,10 +91,8 @@ public abstract class SecureDirectoryStream
* *
* @param path * @param path
* the path to the directory to open * the path to the directory to open
* @param followLinks * @param options
* {@code true} if the links should be followed * options indicating how symbolic links are handled
* @param filter
* the directory stream filter or {@code null}.
* *
* @return a new and open {@code SecureDirectoryStream} object * @return a new and open {@code SecureDirectoryStream} object
* *
...@@ -111,9 +108,8 @@ public abstract class SecureDirectoryStream ...@@ -111,9 +108,8 @@ public abstract class SecureDirectoryStream
* installed, the {@link SecurityManager#checkRead(String) checkRead} * installed, the {@link SecurityManager#checkRead(String) checkRead}
* method is invoked to check read access to the directory. * method is invoked to check read access to the directory.
*/ */
public abstract SecureDirectoryStream newDirectoryStream(Path path, public abstract SecureDirectoryStream<T> newDirectoryStream(T path,
boolean followLinks, LinkOption... options)
DirectoryStream.Filter<? super Path> filter)
throws IOException; throws IOException;
/** /**
...@@ -162,7 +158,7 @@ public abstract class SecureDirectoryStream ...@@ -162,7 +158,7 @@ public abstract class SecureDirectoryStream
* checkWrite} method is invoked to check write access to the path * checkWrite} method is invoked to check write access to the path
* if the file is opened for writing. * if the file is opened for writing.
*/ */
public abstract SeekableByteChannel newByteChannel(Path path, public abstract SeekableByteChannel newByteChannel(T path,
Set<? extends OpenOption> options, Set<? extends OpenOption> options,
FileAttribute<?>... attrs) FileAttribute<?>... attrs)
throws IOException; throws IOException;
...@@ -170,7 +166,7 @@ public abstract class SecureDirectoryStream ...@@ -170,7 +166,7 @@ public abstract class SecureDirectoryStream
/** /**
* Deletes a file. * Deletes a file.
* *
* <p> Unlike the {@link FileRef#delete delete()} method, this method * <p> Unlike the {@link Path#delete delete()} method, this method
* does not first examine the file to determine if the file is a directory. * does not first examine the file to determine if the file is a directory.
* Whether a directory is deleted by this method is system dependent and * Whether a directory is deleted by this method is system dependent and
* therefore not specified. If the file is a symbolic-link then the link is * therefore not specified. If the file is a symbolic-link then the link is
...@@ -191,12 +187,12 @@ public abstract class SecureDirectoryStream ...@@ -191,12 +187,12 @@ public abstract class SecureDirectoryStream
* installed, the {@link SecurityManager#checkDelete(String) checkDelete} * installed, the {@link SecurityManager#checkDelete(String) checkDelete}
* method is invoked to check delete access to the file * method is invoked to check delete access to the file
*/ */
public abstract void deleteFile(Path path) throws IOException; public abstract void deleteFile(T path) throws IOException;
/** /**
* Deletes a directory. * Deletes a directory.
* *
* <p> Unlike the {@link FileRef#delete delete()} method, this method * <p> Unlike the {@link Path#delete delete()} method, this method
* does not first examine the file to determine if the file is a directory. * does not first examine the file to determine if the file is a directory.
* Whether non-directories are deleted by this method is system dependent and * Whether non-directories are deleted by this method is system dependent and
* therefore not specified. When the parameter is a relative path then the * therefore not specified. When the parameter is a relative path then the
...@@ -219,7 +215,7 @@ public abstract class SecureDirectoryStream ...@@ -219,7 +215,7 @@ public abstract class SecureDirectoryStream
* installed, the {@link SecurityManager#checkDelete(String) checkDelete} * installed, the {@link SecurityManager#checkDelete(String) checkDelete}
* method is invoked to check delete access to the directory * method is invoked to check delete access to the directory
*/ */
public abstract void deleteDirectory(Path path) throws IOException; public abstract void deleteDirectory(T path) throws IOException;
/** /**
* Move a file from this directory to another directory. * Move a file from this directory to another directory.
...@@ -259,7 +255,7 @@ public abstract class SecureDirectoryStream ...@@ -259,7 +255,7 @@ public abstract class SecureDirectoryStream
* method is invoked to check write access to both the source and * method is invoked to check write access to both the source and
* target file. * target file.
*/ */
public abstract void move(Path srcpath, SecureDirectoryStream targetdir, Path targetpath) public abstract void move(T srcpath, SecureDirectoryStream<T> targetdir, T targetpath)
throws IOException; throws IOException;
/** /**
...@@ -318,7 +314,7 @@ public abstract class SecureDirectoryStream ...@@ -318,7 +314,7 @@ public abstract class SecureDirectoryStream
* type is not available * type is not available
* *
*/ */
public abstract <V extends FileAttributeView> V getFileAttributeView(Path path, public abstract <V extends FileAttributeView> V getFileAttributeView(T path,
Class<V> type, Class<V> type,
LinkOption... options); LinkOption... options);
} }
...@@ -40,7 +40,7 @@ import java.io.IOError; ...@@ -40,7 +40,7 @@ import java.io.IOError;
* @since 1.7 * @since 1.7
*/ */
public class SimpleFileVisitor<T extends FileRef> implements FileVisitor<T> { public class SimpleFileVisitor<T> implements FileVisitor<T> {
/** /**
* Initializes a new instance of this class. * Initializes a new instance of this class.
*/ */
......
...@@ -31,7 +31,7 @@ package java.nio.file; ...@@ -31,7 +31,7 @@ package java.nio.file;
* @since 1.7 * @since 1.7
*/ */
public class StandardWatchEventKind { public final class StandardWatchEventKind {
private StandardWatchEventKind() { } private StandardWatchEventKind() { }
/** /**
......
...@@ -103,7 +103,7 @@ public abstract class WatchKey { ...@@ -103,7 +103,7 @@ public abstract class WatchKey {
* *
* <p> Note that this method does not wait if there are no events pending. * <p> Note that this method does not wait if there are no events pending.
* *
* @return the list of the events retrieved * @return the list of the events retrieved; may be empty
*/ */
public abstract List<WatchEvent<?>> pollEvents(); public abstract List<WatchEvent<?>> pollEvents();
...@@ -128,7 +128,7 @@ public abstract class WatchKey { ...@@ -128,7 +128,7 @@ public abstract class WatchKey {
* will be invalid. If the watch key is enqueued, waiting to be retrieved * will be invalid. If the watch key is enqueued, waiting to be retrieved
* from the watch service, then it will remain in the queue until it is * from the watch service, then it will remain in the queue until it is
* removed. Pending events, if any, remain pending and may be retrieved by * removed. Pending events, if any, remain pending and may be retrieved by
* invoking the {@link #pollEvents pollEvents} method event after the key is * invoking the {@link #pollEvents pollEvents} method after the key is
* cancelled. * cancelled.
* *
* <p> If this watch key has already been cancelled then invoking this * <p> If this watch key has already been cancelled then invoking this
......
...@@ -110,13 +110,13 @@ import java.io.IOException; ...@@ -110,13 +110,13 @@ import java.io.IOException;
* </table> * </table>
* </blockquote> * </blockquote>
* *
* <p> The {@link #getAttribute getAttribute} or {@link #readAttributes * <p> The {@link FileRef#getAttribute getAttribute} method may be used to read
* readAttributes} methods may be used to read the ACL or owner attributes as if * the ACL or owner attributes as if by invoking the {@link #getAcl getAcl} or
* by invoking the {@link #getAcl getAcl} or {@link #getOwner getOwner} methods. * {@link #getOwner getOwner} methods.
* *
* <p> The {@link #setAttribute setAttribute} method may be used to update the * <p> The {@link FileRef#setAttribute setAttribute} method may be used to
* ACL or owner attributes as if by invoking the {@link #setAcl setAcl} or {@link * update the ACL or owner attributes as if by invoking the {@link #setAcl setAcl}
* #setOwner setOwner} methods. * or {@link #setOwner setOwner} methods.
* *
* <h4> Setting the ACL when creating a file </h4> * <h4> Setting the ACL when creating a file </h4>
* *
......
...@@ -25,20 +25,12 @@ ...@@ -25,20 +25,12 @@
package java.nio.file.attribute; package java.nio.file.attribute;
import java.util.*;
import java.io.IOException;
/** /**
* An object that provides a read-only or updatable <em>view</em> of non-opaque * An object that provides a read-only or updatable <em>view</em> of non-opaque
* values associated with an object in a filesystem. This interface is extended * values associated with an object in a filesystem. This interface is extended
* or implemented by specific attribute views that define the attributes * or implemented by specific attribute views that define the attributes
* supported by the view. A specific attribute view will typically define * supported by the view. A specific attribute view will typically define
* type-safe methods to read or update the attributes that it supports. It also * type-safe methods to read or update the attributes that it supports.
* provides <em>dynamic access</em> where the {@link #readAttributes
* readAttributes}, {@link #getAttribute getAttribute} and {@link #setAttribute
* setAttributs} methods are used to access the attributes by names defined
* by the attribute view. Implementations must ensure that the attribute names
* do not contain the colon (':') or comma (',') characters.
* *
* @since 1.7 * @since 1.7
*/ */
...@@ -48,71 +40,4 @@ public interface AttributeView { ...@@ -48,71 +40,4 @@ public interface AttributeView {
* Returns the name of the attribute view. * Returns the name of the attribute view.
*/ */
String name(); String name();
/**
* Reads the value of an attribute.
*
* @param attribute
* the attribute name (case sensitive)
*
* @return the value of the attribute, or {@code null} if the attribute is
* not supported
*
* @throws IOException
* if an I/O error occurs
* @throws SecurityException
* if a security manager is set and it denies access
*/
Object getAttribute(String attribute) throws IOException;
/**
* Sets/updates the value of an attribute.
*
* @param attribute
* the attribute name (case sensitive)
* @param value
* the attribute value
*
* @throws UnsupportedOperationException
* if the attribute is not supported or this attribute view does
* not support updating the value of the attribute
* @throws IllegalArgumentException
* if the attribute value is of the correct type but has an
* inappropriate value
* @throws ClassCastException
* if the attribute value is not of the expected type or is a
* collection containing elements that are not of the expected
* type
* @throws IOException
* if an I/O error occurs
* @throws SecurityException
* if a security manager is set and it denies access
*/
void setAttribute(String attribute, Object value) throws IOException;
/**
* Reads all, or a subset, of the attributes supported by this file attribute
* view.
*
* <p> The {@code first} and {@code rest} parameters are the names of the
* attributes to read. If any of the parameters has the value {@code "*"}
* then all attributes are read. Attributes that are not supported are
* ignored and will not be present in the returned map. It is implementation
* specific if all attributes are read as an atomic operation with respect
* to other file system operations.
*
* @param first
* the name of an attribute to read (case sensitive)
* @param rest
* the names of other attributes to read (case sensitive)
*
* @return an unmodifiable map of the attributes; may be empty. Its keys are
* the attribute names, its values are the attribute values
*
* @throws IOException
* if an I/O error occurs
* @throws SecurityException
* if a security manager is set and it denies access
*/
Map<String,?> readAttributes(String first, String... rest) throws IOException;
} }
...@@ -28,7 +28,6 @@ package java.nio.file.attribute; ...@@ -28,7 +28,6 @@ package java.nio.file.attribute;
import java.nio.file.*; import java.nio.file.*;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
/** /**
* This class consists exclusively of static methods that operate on or return * This class consists exclusively of static methods that operate on or return
...@@ -39,245 +38,7 @@ import java.util.concurrent.TimeUnit; ...@@ -39,245 +38,7 @@ import java.util.concurrent.TimeUnit;
*/ */
public final class Attributes { public final class Attributes {
private Attributes() { private Attributes() { }
}
/**
* Splits the given attribute name into the name of an attribute view and
* the attribute. If the attribute view is not identified then it assumed
* to be "basic".
*/
private static String[] split(String attribute) {
String[] s = new String[2];
int pos = attribute.indexOf(':');
if (pos == -1) {
s[0] = "basic";
s[1] = attribute;
} else {
s[0] = attribute.substring(0, pos++);
s[1] = (pos == attribute.length()) ? "" : attribute.substring(pos);
}
return s;
}
/**
* Sets the value of a file attribute.
*
* <p> The {@code attribute} parameter identifies the attribute to be set
* and takes the form:
* <blockquote>
* [<i>view-name</i><b>:</b>]<i>attribute-name</i>
* </blockquote>
* where square brackets [...] delineate an optional component and the
* character {@code ':'} stands for itself.
*
* <p> <i>view-name</i> is the {@link FileAttributeView#name name} of a {@link
* FileAttributeView} that identifies a set of file attributes. If not
* specified then it defaults to {@code "basic"}, the name of the file
* attribute view that identifies the basic set of file attributes common to
* many file systems. <i>attribute-name</i> is the name of the attribute
* within the set.
*
* <p> <b>Usage Example:</b>
* Suppose we want to set the DOS "hidden" attribute:
* <pre>
* Attributes.setAttribute(file, "dos:hidden", true);
* </pre>
*
* @param file
* A file reference that locates the file
* @param attribute
* The attribute to set
* @param value
* The attribute value
*
* @throws UnsupportedOperationException
* If the attribute view is not available or it does not
* support updating the attribute
* @throws IllegalArgumentException
* If the attribute value is of the correct type but has an
* inappropriate value
* @throws ClassCastException
* If the attribute value is not of the expected type or is a
* collection containing elements that are not of the expected
* type
* @throws IOException
* If an I/O error occurs
* @throws SecurityException
* In the case of the default provider, and a security manager is
* installed, its {@link SecurityManager#checkWrite(String) checkWrite}
* method denies write access to the file. If this method is invoked
* to set security sensitive attributes then the security manager
* may be invoked to check for additional permissions.
*/
public static void setAttribute(FileRef file, String attribute, Object value)
throws IOException
{
String[] s = split(attribute);
FileAttributeView view = file.getFileAttributeView(s[0]);
if (view == null)
throw new UnsupportedOperationException("View '" + s[0] + "' not available");
view.setAttribute(s[1], value);
}
/**
* Reads the value of a file attribute.
*
* <p> The {@code attribute} parameter identifies the attribute to be read
* and takes the form:
* <blockquote>
* [<i>view-name</i><b>:</b>]<i>attribute-name</i>
* </blockquote>
* where square brackets [...] delineate an optional component and the
* character {@code ':'} stands for itself.
*
* <p> <i>view-name</i> is the {@link FileAttributeView#name name} of a {@link
* FileAttributeView} that identifies a set of file attributes. If not
* specified then it defaults to {@code "basic"}, the name of the file
* attribute view that identifies the basic set of file attributes common to
* many file systems. <i>attribute-name</i> is the name of the attribute.
*
* <p> The {@code options} array may be used to indicate how symbolic links
* are handled for the case that the file is a symbolic link. By default,
* symbolic links are followed and the file attribute of the final target
* of the link is read. If the option {@link LinkOption#NOFOLLOW_LINKS
* NOFOLLOW_LINKS} is present then symbolic links are not followed and so
* the method returns the file attribute of the symbolic link.
*
* <p> <b>Usage Example:</b>
* Suppose we require the user ID of the file owner on a system that
* supports a "{@code unix}" view:
* <pre>
* int uid = (Integer)Attributes.getAttribute(file, "unix:uid");
* </pre>
*
* @param file
* A file reference that locates the file
* @param attribute
* The attribute to read
* @param options
* Options indicating how symbolic links are handled
*
* @return The attribute value, or {@code null} if the attribute view
* is not available or it does not support reading the attribute
*
* @throws IOException
* If an I/O error occurs
* @throws SecurityException
* In the case of the default provider, and a security manager is
* installed, its {@link SecurityManager#checkRead(String) checkRead}
* method denies read access to the file. If this method is invoked
* to read security sensitive attributes then the security manager
* may be invoked to check for additional permissions.
*/
public static Object getAttribute(FileRef file,
String attribute,
LinkOption... options)
throws IOException
{
String[] s = split(attribute);
FileAttributeView view = file.getFileAttributeView(s[0], options);
if (view != null)
return view.getAttribute(s[1]);
// view not available
return null;
}
/**
* Reads a set of file attributes as a bulk operation.
*
* <p> The {@code attributes} parameter identifies the attributes to be read
* and takes the form:
* <blockquote>
* [<i>view-name</i><b>:</b>]<i>attribute-list</i>
* </blockquote>
* where square brackets [...] delineate an optional component and the
* character {@code ':'} stands for itself.
*
* <p> <i>view-name</i> is the {@link FileAttributeView#name name} of a {@link
* FileAttributeView} that identifies a set of file attributes. If not
* specified then it defaults to {@code "basic"}, the name of the file
* attribute view that identifies the basic set of file attributes common to
* many file systems.
*
* <p> The <i>attribute-list</i> component is a comma separated list of
* zero or more names of attributes to read. If the list contains the value
* {@code "*"} then all attributes are read. Attributes that are not supported
* are ignored and will not be present in the returned map. It is
* implementation specific if all attributes are read as an atomic operation
* with respect to other file system operations.
*
* <p> The following examples demonstrate possible values for the {@code
* attributes} parameter:
*
* <blockquote>
* <table border="0">
* <tr>
* <td> {@code "*"} </td>
* <td> Read all {@link BasicFileAttributes basic-file-attributes}. </td>
* </tr>
* <tr>
* <td> {@code "size,lastModifiedTime,lastAccessTime"} </td>
* <td> Reads the file size, last modified time, and last access time
* attributes. </td>
* </tr>
* <tr>
* <td> {@code "posix:*"} </td>
* <td> Read all {@link PosixFileAttributes POSIX-file-attributes}.. </td>
* </tr>
* <tr>
* <td> {@code "posix:permissions,owner,size"} </td>
* <td> Reads the POSX file permissions, owner, and file size. </td>
* </tr>
* </table>
* </blockquote>
*
* <p> The {@code options} array may be used to indicate how symbolic links
* are handled for the case that the file is a symbolic link. By default,
* symbolic links are followed and the file attributes of the final target
* of the link are read. If the option {@link LinkOption#NOFOLLOW_LINKS
* NOFOLLOW_LINKS} is present then symbolic links are not followed and so
* the method returns the file attributes of the symbolic link.
*
* @param file
* A file reference that locates the file
* @param attributes
* The attributes to read
* @param options
* Options indicating how symbolic links are handled
*
* @return A map of the attributes returned; may be empty. The map's keys
* are the attribute names, its values are the attribute values
*
* @throws IOException
* If an I/O error occurs
* @throws SecurityException
* In the case of the default provider, and a security manager is
* installed, its {@link SecurityManager#checkRead(String) checkRead}
* method denies read access to the file. If this method is invoked
* to read security sensitive attributes then the security manager
* may be invoke to check for additional permissions.
*/
public static Map<String,?> readAttributes(FileRef file,
String attributes,
LinkOption... options)
throws IOException
{
String[] s = split(attributes);
FileAttributeView view = file.getFileAttributeView(s[0], options);
if (view != null) {
// further split attributes into the first and rest.
String[] names = s[1].split(",");
int rem = names.length-1;
String first = names[0];
String[] rest = new String[rem];
if (rem > 0) System.arraycopy(names, 1, rest, 0, rem);
return view.readAttributes(first, rest);
}
// view not available
return Collections.emptyMap();
}
/** /**
* Reads the basic file attributes of a file. * Reads the basic file attributes of a file.
...@@ -551,29 +312,28 @@ public final class Attributes { ...@@ -551,29 +312,28 @@ public final class Attributes {
} }
/** /**
* Updates the value of a file's last modified time attribute. * Updates a file's last modified time attribute. The file time is converted
* to the epoch and precision supported by the file system. Converting from
* finer to coarser granularities result in precision loss. The behavior of
* this method when attempting to set a timestamp to a value that is outside
* the range supported by the underlying file store is not defined. It may
* or not fail by throwing an {@code IOException}.
* *
* <p> The time value is measured since the epoch * <p> If the file system does not support a last modified time attribute
* (00:00:00 GMT, January 1, 1970) and is converted to the precision supported * then this method has no effect.
* by the file system. Converting from finer to coarser granularities result
* in precision loss.
* *
* <p> If the file system does not support a last modified time attribute then * <p> <b>Usage Example:</b>
* this method has no effect. * Suppose we want to set the last modified time to the current time:
* <pre>
* FileTime now = FileTime.fromMillis(System.currentTimeMillis());
* Attributes.setLastModifiedTime(file, now);
* </pre>
* *
* @param file * @param file
* A file reference that locates the file * A file reference that locates the file
*
* @param lastModifiedTime * @param lastModifiedTime
* The new last modified time, or {@code -1L} to update it to * The new last modified time
* the current time *
* @param unit
* A {@code TimeUnit} determining how to interpret the
* {@code lastModifiedTime} parameter
*
* @throws IllegalArgumentException
* If the {@code lastModifiedime} parameter is a negative value other
* than {@code -1L}
* @throws IOException * @throws IOException
* If an I/O error occurs * If an I/O error occurs
* @throws SecurityException * @throws SecurityException
...@@ -584,35 +344,31 @@ public final class Attributes { ...@@ -584,35 +344,31 @@ public final class Attributes {
* @see BasicFileAttributeView#setTimes * @see BasicFileAttributeView#setTimes
*/ */
public static void setLastModifiedTime(FileRef file, public static void setLastModifiedTime(FileRef file,
long lastModifiedTime, FileTime lastModifiedTime)
TimeUnit unit)
throws IOException throws IOException
{ {
if (lastModifiedTime == null)
throw new NullPointerException("'lastModifiedTime' is null");
file.getFileAttributeView(BasicFileAttributeView.class) file.getFileAttributeView(BasicFileAttributeView.class)
.setTimes(lastModifiedTime, null, null, unit); .setTimes(lastModifiedTime, null, null);
} }
/** /**
* Updates the value of a file's last access time attribute. * Updates a file's last access time attribute. The file time is converted
* * to the epoch and precision supported by the file system. Converting from
* <p> The time value is measured since the epoch * finer to coarser granularities result in precision loss. The behavior of
* (00:00:00 GMT, January 1, 1970) and is converted to the precision supported * this method when attempting to set a timestamp to a value that is outside
* by the file system. Converting from finer to coarser granularities result * the range supported by the underlying file store is not defined. It may
* in precision loss. * or not fail by throwing an {@code IOException}.
* *
* <p> If the file system does not support a last access time attribute then * <p> If the file system does not support a last access time attribute then
* this method has no effect. * this method has no effect.
* *
* @param file
* A file reference that locates the file
* @param lastAccessTime * @param lastAccessTime
* The new last access time, or {@code -1L} to update it to * The new last access time
* the current time *
* @param unit
* A {@code TimeUnit} determining how to interpret the
* {@code lastModifiedTime} parameter
*
* @throws IllegalArgumentException
* If the {@code lastAccessTime} parameter is a negative value other
* than {@code -1L}
* @throws IOException * @throws IOException
* If an I/O error occurs * If an I/O error occurs
* @throws SecurityException * @throws SecurityException
...@@ -623,12 +379,13 @@ public final class Attributes { ...@@ -623,12 +379,13 @@ public final class Attributes {
* @see BasicFileAttributeView#setTimes * @see BasicFileAttributeView#setTimes
*/ */
public static void setLastAccessTime(FileRef file, public static void setLastAccessTime(FileRef file,
long lastAccessTime, FileTime lastAccessTime)
TimeUnit unit)
throws IOException throws IOException
{ {
if (lastAccessTime == null)
throw new NullPointerException("'lastAccessTime' is null");
file.getFileAttributeView(BasicFileAttributeView.class) file.getFileAttributeView(BasicFileAttributeView.class)
.setTimes(null, lastAccessTime, null, unit); .setTimes(null, lastAccessTime, null);
} }
/** /**
......
...@@ -25,7 +25,6 @@ ...@@ -25,7 +25,6 @@
package java.nio.file.attribute; package java.nio.file.attribute;
import java.util.concurrent.TimeUnit;
import java.io.IOException; import java.io.IOException;
/** /**
...@@ -49,19 +48,15 @@ import java.io.IOException; ...@@ -49,19 +48,15 @@ import java.io.IOException;
* </tr> * </tr>
* <tr> * <tr>
* <td> "lastModifiedTime" </td> * <td> "lastModifiedTime" </td>
* <td> {@link Long} </td> * <td> {@link FileTime} </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> "lastAccessTime" </td> * <td> "lastAccessTime" </td>
* <td> {@link Long} </td> * <td> {@link FileTime} </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> "creationTime" </td> * <td> "creationTime" </td>
* <td> {@link Long} </td> * <td> {@link FileTime} </td>
* </tr>
* <tr>
* <td> "resolution" </td>
* <td> {@link java.util.concurrent.TimeUnit} </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> "size" </td> * <td> "size" </td>
...@@ -84,26 +79,19 @@ import java.io.IOException; ...@@ -84,26 +79,19 @@ import java.io.IOException;
* <td> {@link Boolean} </td> * <td> {@link Boolean} </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> "linkCount" </td>
* <td> {@link Integer} </td>
* </tr>
* <tr>
* <td> "fileKey" </td> * <td> "fileKey" </td>
* <td> {@link Object} </td> * <td> {@link Object} </td>
* </tr> * </tr>
* </table> * </table>
* </blockquote> * </blockquote>
* *
* <p> The {@link #getAttribute getAttribute} or {@link * <p> The {@link java.nio.file.FileRef#getAttribute getAttribute} method may be
* #readAttributes(String,String[]) readAttributes(String,String[])} methods may * used to read any of these attributes as if by invoking the {@link
* be used to read any of these attributes as if by invoking the {@link
* #readAttributes() readAttributes()} method. * #readAttributes() readAttributes()} method.
* *
* <p> The {@link #setAttribute setAttribute} method may be used to update the * <p> The {@link java.nio.file.FileRef#setAttribute setAttribute} method may be
* file's last modified time, last access time or create time attributes as if * used to update the file's last modified time, last access time or create time
* by invoking the {@link #setTimes setTimes} method. In that case, the time * attributes as if by invoking the {@link #setTimes setTimes} method.
* value is interpreted in {@link TimeUnit#MILLISECONDS milliseconds} and
* converted to the precision supported by the file system.
* *
* @since 1.7 * @since 1.7
* @see Attributes * @see Attributes
...@@ -141,11 +129,11 @@ public interface BasicFileAttributeView ...@@ -141,11 +129,11 @@ public interface BasicFileAttributeView
* and create time attributes. * and create time attributes.
* *
* <p> This method updates the file's timestamp attributes. The values are * <p> This method updates the file's timestamp attributes. The values are
* measured since the epoch (00:00:00 GMT, January 1, 1970) and converted to * converted to the epoch and precision supported by the file system.
* the precision supported by the file system. Converting from finer to * Converting from finer to coarser granularities result in precision loss.
* coarser granularities result in precision loss. If a value is larger * The behavior of this method when attempting to set a timestamp to a value
* than the maximum supported by the file system then the corresponding * that is outside the range supported by the underlying file store is not
* timestamp is set to its maximum value. * defined. It may or not fail by throwing an {@code IOException}.
* *
* <p> If any of the {@code lastModifiedTime}, {@code lastAccessTime}, * <p> If any of the {@code lastModifiedTime}, {@code lastAccessTime},
* or {@code createTime} parameters has the value {@code null} then the * or {@code createTime} parameters has the value {@code null} then the
...@@ -153,25 +141,19 @@ public interface BasicFileAttributeView ...@@ -153,25 +141,19 @@ public interface BasicFileAttributeView
* read the existing values of the file attributes when only some, but not * read the existing values of the file attributes when only some, but not
* all, of the timestamp attributes are updated. Consequently, this method * all, of the timestamp attributes are updated. Consequently, this method
* may not be an atomic operation with respect to other file system * may not be an atomic operation with respect to other file system
* operations. If all of the {@code lastModifiedTime}, {@code * operations. Reading and re-writing existing values may also result in
* precision loss. If all of the {@code lastModifiedTime}, {@code
* lastAccessTime} and {@code createTime} parameters are {@code null} then * lastAccessTime} and {@code createTime} parameters are {@code null} then
* this method has no effect. * this method has no effect.
* *
* @param lastModifiedTime * @param lastModifiedTime
* the new last modified time, or {@code -1L} to update it to * the new last modified time, or {@code null} to not change the
* the current time, or {@code null} to not change the attribute * value
* @param lastAccessTime * @param lastAccessTime
* the last access time, or {@code -1L} to update it to * the last access time, or {@code null} to not change the value
* the current time, or {@code null} to not change the attribute.
* @param createTime * @param createTime
* the file's create time, or {@code -1L} to update it to * the file's create time, or {@code null} to not change the value
* the current time, or {@code null} to not change the attribute
* @param unit
* a {@code TimeUnit} determining how to interpret the time values
* *
* @throws IllegalArgumentException
* if any of the parameters is a negative value other than {@code
* -1L}
* @throws IOException * @throws IOException
* if an I/O error occurs * if an I/O error occurs
* @throws SecurityException * @throws SecurityException
...@@ -179,8 +161,7 @@ public interface BasicFileAttributeView ...@@ -179,8 +161,7 @@ public interface BasicFileAttributeView
* installed, its {@link SecurityManager#checkWrite(String) checkWrite} * installed, its {@link SecurityManager#checkWrite(String) checkWrite}
* method is invoked to check write access to the file * method is invoked to check write access to the file
*/ */
void setTimes(Long lastModifiedTime, void setTimes(FileTime lastModifiedTime,
Long lastAccessTime, FileTime lastAccessTime,
Long createTime, FileTime createTime) throws IOException;
TimeUnit unit) throws IOException;
} }
...@@ -25,8 +25,6 @@ ...@@ -25,8 +25,6 @@
package java.nio.file.attribute; package java.nio.file.attribute;
import java.util.concurrent.TimeUnit;
/** /**
* Basic attributes associated with a file in a file system. * Basic attributes associated with a file in a file system.
* *
...@@ -50,47 +48,27 @@ public interface BasicFileAttributes { ...@@ -50,47 +48,27 @@ public interface BasicFileAttributes {
/** /**
* Returns the time of last modification. * Returns the time of last modification.
* *
* <p> The {@link #resolution() resolution} method returns the {@link TimeUnit} * @return a {@code FileTime} representing the time the file was last
* to interpret the return value of this method. * modified or {@code null} if the attribute is not supported.
*
* @return a <code>long</code> value representing the time the file was
* last modified since the epoch (00:00:00 GMT, January 1, 1970),
* or {@code -1L} if the attribute is not supported.
*/ */
long lastModifiedTime(); FileTime lastModifiedTime();
/** /**
* Returns the time of last access if supported. * Returns the time of last access if supported.
* *
* <p> The {@link #resolution() resolution} method returns the {@link TimeUnit} * @return a {@code FileTime} representing the time of last access or
* to interpret the return value of this method. * {@code null} if the attribute is not supported.
*
* @return a <code>long</code> value representing the time of last access
* since the epoch (00:00:00 GMT, January 1, 1970), or {@code -1L}
* if the attribute is not supported.
*/ */
long lastAccessTime(); FileTime lastAccessTime();
/** /**
* Returns the creation time if supported. The creation time is the time * Returns the creation time if supported. The creation time is the time
* that the file was created. * that the file was created.
* *
* <p> The {@link #resolution() resolution} method returns the {@link TimeUnit} * @return a {@code FileTime} representing the time the file was created
* to interpret the return value of this method. * or {@code null} if the attribute is not supported.
*
* @return a <code>long</code> value representing the time the file was
* created since the epoch (00:00:00 GMT, January 1, 1970), or
* {@code -1L} if the attribute is not supported.
*/ */
long creationTime(); FileTime creationTime();
/**
* Returns the {@link TimeUnit} required to interpret the time of last
* modification, time of last access, and creation time.
*
* @return the {@code TimeUnit} required to interpret the file time stamps
*/
TimeUnit resolution();
/** /**
* Tells whether the file is a regular file with opaque content. * Tells whether the file is a regular file with opaque content.
...@@ -124,18 +102,6 @@ public interface BasicFileAttributes { ...@@ -124,18 +102,6 @@ public interface BasicFileAttributes {
*/ */
long size(); long size();
/**
* Returns the number of <em>links</em> to this file.
*
* <p> On file systems where the same file may be in several directories then
* the link count is the number of directory entries for the file. The return
* value is {@code 1} on file systems that only allow a file to have a
* single name in a single directory.
*
* @see java.nio.file.Path#createLink
*/
int linkCount();
/** /**
* Returns an object that uniquely identifies the given file, or {@code * Returns an object that uniquely identifies the given file, or {@code
* null} if a file key is not available. On some platforms or file systems * null} if a file key is not available. On some platforms or file systems
...@@ -154,7 +120,7 @@ public interface BasicFileAttributes { ...@@ -154,7 +120,7 @@ public interface BasicFileAttributes {
* *
* <p> File keys returned by this method can be compared for equality and are * <p> File keys returned by this method can be compared for equality and are
* suitable for use in collections. If the file system and files remain static, * suitable for use in collections. If the file system and files remain static,
* and two files are the {@link java.nio.file.FileRef#isSameFile same} with * and two files are the {@link java.nio.file.Path#isSameFile same} with
* non-{@code null} file keys, then their file keys are equal. * non-{@code null} file keys, then their file keys are equal.
* *
* @see java.nio.file.Files#walkFileTree * @see java.nio.file.Files#walkFileTree
......
...@@ -65,17 +65,17 @@ import java.io.IOException; ...@@ -65,17 +65,17 @@ import java.io.IOException;
* </table> * </table>
* </blockquote> * </blockquote>
* *
* <p> The {@link #getAttribute getAttribute} or {@link #readAttributes(String,String[]) * <p> The {@link java.nio.file.FileRef#getAttribute getAttribute} method may
* readAttributes(String,String[])} methods may be used to read any of these * be used to read any of these attributes, or any of the attributes defined by
* attributes, or any of the attributes defined by {@link BasicFileAttributeView} * {@link BasicFileAttributeView} as if by invoking the {@link #readAttributes
* as if by invoking the {@link #readAttributes readAttributes()} method. * readAttributes()} method.
* *
* <p> The {@link #setAttribute setAttribute} method may be used to update the * <p> The {@link java.nio.file.FileRef#setAttribute setAttribute} method may
* file's last modified time, last access time or create time attributes as * be used to update the file's last modified time, last access time or create
* defined by {@link BasicFileAttributeView}. It may also be used to update * time attributes as defined by {@link BasicFileAttributeView}. It may also be
* the DOS attributes as if by invoking the {@link #setReadOnly setReadOnly}, * used to update the DOS attributes as if by invoking the {@link #setReadOnly
* {@link #setHidden setHidden}, {@link #setSystem setSystem}, and {@link * setReadOnly}, {@link #setHidden setHidden}, {@link #setSystem setSystem}, and
* #setArchive setArchive} methods respectively. * {@link #setArchive setArchive} methods respectively.
* *
* @since 1.7 * @since 1.7
*/ */
......
...@@ -34,7 +34,6 @@ package java.nio.file.attribute; ...@@ -34,7 +34,6 @@ package java.nio.file.attribute;
* @since 1.7 * @since 1.7
* *
* @see java.nio.file.FileRef#getFileAttributeView(Class,java.nio.file.LinkOption[]) * @see java.nio.file.FileRef#getFileAttributeView(Class,java.nio.file.LinkOption[])
* @see java.nio.file.FileRef#getFileAttributeView(String,java.nio.file.LinkOption[])
*/ */
public interface FileAttributeView public interface FileAttributeView
......
...@@ -37,11 +37,11 @@ import java.io.IOException; ...@@ -37,11 +37,11 @@ import java.io.IOException;
* <p> The {@link #getOwner getOwner} or {@link #setOwner setOwner} methods may * <p> The {@link #getOwner getOwner} or {@link #setOwner setOwner} methods may
* be used to read or update the owner of the file. * be used to read or update the owner of the file.
* *
* <p> Where dynamic access to file attributes is required, the owner attribute * <p> The {@link java.nio.file.FileRef#getAttribute getAttribute} and
* is identified by the name {@code "owner"}, and the value of the attribute is * {@link java.nio.file.FileRef#setAttribute setAttribute} methods may also be
* a {@link UserPrincipal}. The {@link #readAttributes readAttributes}, {@link * used to read or update the owner. In that case, the owner attribute is
* #getAttribute getAttribute} and {@link #setAttribute setAttributes} methods * identified by the name {@code "owner"}, and the value of the attribute is
* may be used to read or update the file owner. * a {@link UserPrincipal}.
* *
* @since 1.7 * @since 1.7
*/ */
......
...@@ -52,10 +52,8 @@ import java.io.IOException; ...@@ -52,10 +52,8 @@ import java.io.IOException;
* </tr> * </tr>
* </table> * </table>
* </blockquote> * </blockquote>
* <p> The {@link #getAttribute getAttribute} or {@link #readAttributes * <p> The {@link java.nio.file.FileStore#getAttribute getAttribute} method may
* readAttributes(String,String[])} methods may be used to read any of these * be used to read any of these attributes.
* attributes as if by invoking the {@link #readAttributes readAttributes()}
* method.
* *
* @since 1.7 * @since 1.7
*/ */
......
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package java.nio.file.attribute;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Date;
import java.util.Formatter;
import java.util.Locale;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;
/**
* Represents the value of a file's time stamp attribute. For example, it may
* represent the time that the file was last modified, accessed, or created.
*
* <p> Instances of this class are immutable.
*
* @since 1.7
* @see BasicFileAttributes
* @see Attributes#setLastModifiedTime
*/
public final class FileTime implements Comparable<FileTime> {
private final long value;
private final TimeUnit unit;
private String valueAsString; // created lazily
private FileTime(long value, TimeUnit unit) {
if (unit == null)
throw new NullPointerException();
this.value = value;
this.unit = unit;
}
/**
* Returns a {@code FileTime} representing a value at the given unit of
* granularity.
*
* @param value
* the value since the epoch (1970-01-01T00:00:00Z); can be
* negative
* @param unit
* the unit of granularity to interpret the value
*
* @return a {@code FileTime} representing the given value
*/
public static FileTime from(long value, TimeUnit unit) {
return new FileTime(value, unit);
}
/**
* Returns a {@code FileTime} representing the given value in milliseconds.
*
* @param value
* the value, in milliseconds, since the epoch
* (1970-01-01T00:00:00Z); can be negative
*
* @return a {@code FileTime} representing the given value
*/
public static FileTime fromMillis(long value) {
return new FileTime(value, TimeUnit.MILLISECONDS);
}
/**
* Returns the value at the given unit of granularity.
*
* <p> Conversion from a coarser granularity that would numerically overflow
* saturate to {@code Long.MIN_VALUE} if negative or {@code Long.MAX_VALUE}
* if positive.
*
* @param unit
* the unit of granularity for the return value
*
* @return value in the given unit of granularity, since the epoch
* since the epoch (1970-01-01T00:00:00Z); can be negative
*/
public long to(TimeUnit unit) {
return unit.convert(this.value, this.unit);
}
/**
* Returns the value in milliseconds.
*
* <p> Conversion from a coarser granularity that would numerically overflow
* saturate to {@code Long.MIN_VALUE} if negative or {@code Long.MAX_VALUE}
* if positive.
*
* @return the value in milliseconds, since the epoch (1970-01-01T00:00:00Z)
*/
public long toMillis() {
return unit.toMillis(value);
}
/**
* Tests this {@code FileTime} for equality with the given object.
*
* <p> The result is {@code true} if and only if the argument is not {@code
* null} and is a {@code FileTime} that represents the same time. This
* method satisfies the general contract of the {@code Object.equals} method.
*
* @param obj
* the object to compare with
*
* @return {@code true} if, and only if, the given object is a {@code
* FileTime} that represents the same time
*/
@Override
public boolean equals(Object obj) {
return (obj instanceof FileTime) ? compareTo((FileTime)obj) == 0 : false;
}
/**
* Computes a hash code for this file time.
*
* <p> The hash code is based upon the value represented, and satisfies the
* general contract of the {@link Object#hashCode} method.
*
* @return the hash-code value
*/
@Override
public int hashCode() {
// hash value for fixed granularity to satisfy contract with equals
long ms = toMillis();
return (int)(ms ^ (ms >>> 32));
}
/**
* Compares the value of two {@code FileTime} objects for order.
*
* @param other
* the other {@code FileTime} to be compared
*
* @return {@code 0} if this {@code FileTime} is equal to {@code other}, a
* value less than 0 if this {@code FileTime} represents a time
* that is before {@code other}, and a value greater than 0 if this
* {@code FileTime} represents a time that is after {@code other}
*/
@Override
public int compareTo(FileTime other) {
// same granularity
if (unit == other.unit)
return (value < other.value) ? -1 : (value == other.value ? 0 : 1);
// compare in days
long thisValueInDays = unit.toDays(value);
long otherValueInDays = other.unit.toDays(other.value);
if (thisValueInDays != otherValueInDays)
return (thisValueInDays < otherValueInDays) ? -1 : 1;
// compare remainder in nanoseconds
long thisRemainder = remainderInNanos(thisValueInDays);
long otherRemainder = other.remainderInNanos(otherValueInDays);
return (thisRemainder < otherRemainder) ? -1 :
(thisRemainder == otherRemainder) ? 0 : 1;
}
private long remainderInNanos(long days) {
// constants for conversion
final long C0 = 1L;
final long C1 = C0 * 24L;
final long C2 = C1 * 60L;
final long C3 = C2 * 60L;
final long C4 = C3 * 1000L;
final long C5 = C4 * 1000L;
final long C6 = C5 * 1000L;
long scale;
switch (unit) {
case DAYS : scale = C0; break;
case HOURS : scale = C1; break;
case MINUTES : scale = C2; break;
case SECONDS : scale = C3; break;
case MILLISECONDS : scale = C4; break;
case MICROSECONDS : scale = C5; break;
case NANOSECONDS : scale = C6; break;
default:
throw new AssertionError("Unit not handled");
}
long rem = value - (days * scale);
return unit.toNanos(rem);
}
/**
* Returns the string representation of this {@code FileTime}. The string
* is returned in the <a
* href="http://www.w3.org/TR/NOTE-datetime">ISO&nbsp;8601</a> format:
* <pre>
* YYYY-MM-DDThh:mm:ss[.s+]Z
* </pre>
* where "{@code [.s+]}" represents a dot followed by one of more digits
* for the decimal fraction of a second. It is only present when the decimal
* fraction of a second is not zero. For example, {@code
* FileTime.fromMillis(1234567890000L).toString()} yields {@code
* "2009-02-13T23:31:30Z"}, and {@code FileTime.fromMillis(1234567890123L).toString()}
* yields {@code "2009-02-13T23:31:30.123Z"}.
*
* <p> A {@code FileTime} is primarly intended to represent the value of a
* file's time stamp. Where used to represent <i>extreme values</i>, where
* the year is less than "{@code 0001}" or greater than "{@code 9999}" then
* the year may be expanded to more than four digits and may be
* negative-signed. If more than four digits then leading zeros are not
* present. The year before "{@code 0001}" is "{@code -0001}".
*
* @return the string representation of this file time
*/
@Override
public String toString() {
String v = valueAsString;
if (v == null) {
// overflow saturates to Long.MIN_VALUE or Long.MAX_VALUE so this
// limits the range:
// [-292275056-05-16T16:47:04.192Z,292278994-08-17T07:12:55.807Z]
long ms = toMillis();
// nothing to do when seconds/minutes/hours/days
String fractionAsString = "";
if (unit.compareTo(TimeUnit.SECONDS) < 0) {
// constants for conversion
final long C0 = 1L;
final long C1 = C0 * 1000L;
final long C2 = C1 * 1000L;
final long C3 = C2 * 1000L;
long scale;
int width;
switch (unit) {
case MILLISECONDS : scale = C1; width = 3; break;
case MICROSECONDS : scale = C2; width = 6; break;
case NANOSECONDS : scale = C3; width = 9; break;
default:
throw new AssertionError("Unit not handled");
}
long fraction = value % scale;
if (fraction != 0L) {
// fraction must be positive
if (fraction < 0L) {
fraction += scale;
if (ms != Long.MIN_VALUE) ms--;
}
// convert to String, adding leading zeros as required and
// stripping any trailing zeros
String s = Long.toString(fraction);
int len = s.length();
width -= len;
StringBuilder sb = new StringBuilder(".");
while (width-- > 0) {
sb.append('0');
}
if (s.charAt(len-1) == '0') {
// drop trailing zeros
len--;
while (s.charAt(len-1) == '0')
len--;
sb.append(s.substring(0, len));
} else {
sb.append(s);
}
fractionAsString = sb.toString();
}
}
// create calendar to use with formatter.
GregorianCalendar cal =
new GregorianCalendar(TimeZone.getTimeZone("UTC"), Locale.ROOT);
if (value < 0L)
cal.setGregorianChange(new Date(Long.MIN_VALUE));
cal.setTimeInMillis(ms);
// years are negative before common era
String sign = (cal.get(Calendar.ERA) == GregorianCalendar.BC) ? "-" : "";
// [-]YYYY-MM-DDThh:mm:ss[.s]Z
v = new Formatter(Locale.ROOT)
.format("%s%tFT%tR:%tS%sZ", sign, cal, cal, cal, fractionAsString)
.toString();
valueAsString = v;
}
return v;
}
}
...@@ -90,14 +90,13 @@ import java.io.IOException; ...@@ -90,14 +90,13 @@ import java.io.IOException;
* </table> * </table>
* </blockquote> * </blockquote>
* *
* <p> The {@link #getAttribute getAttribute} or {@link * <p> The {@link FileRef#getAttribute getAttribute} method may be used to read
* #readAttributes(String,String[]) readAttributes(String,String[])} methods may * any of these attributes, or any of the attributes defined by {@link
* be used to read any of these attributes, or any of the attributes defined by * BasicFileAttributeView} as if by invoking the {@link #readAttributes
* {@link BasicFileAttributeView} as if by invoking the {@link #readAttributes
* readAttributes()} method. * readAttributes()} method.
* *
* <p> The {@link #setAttribute setAttribute} method may be used to update the * <p> The {@link FileRef#setAttribute setAttribute} method may be used to update
* file's last modified time, last access time or create time attributes as * the file's last modified time, last access time or create time attributes as
* defined by {@link BasicFileAttributeView}. It may also be used to update * defined by {@link BasicFileAttributeView}. It may also be used to update
* the permissions, owner, or group-owner as if by invoking the {@link * the permissions, owner, or group-owner as if by invoking the {@link
* #setPermissions setPermissions}, {@link #setOwner setOwner}, and {@link * #setPermissions setPermissions}, {@link #setOwner setOwner}, and {@link
......
...@@ -35,7 +35,7 @@ import java.util.*; ...@@ -35,7 +35,7 @@ import java.util.*;
* @since 1.7 * @since 1.7
*/ */
public class PosixFilePermissions { public final class PosixFilePermissions {
private PosixFilePermissions() { } private PosixFilePermissions() { }
// Write string representation of permission bits to {@code sb}. // Write string representation of permission bits to {@code sb}.
...@@ -58,7 +58,9 @@ public class PosixFilePermissions { ...@@ -58,7 +58,9 @@ public class PosixFilePermissions {
} }
/** /**
* Returns the {@code String} representation of a set of permissions. * Returns the {@code String} representation of a set of permissions. It
* is guaranteed that the returned {@code String} can be parsed by the
* {@link #fromString} method.
* *
* <p> If the set contains {@code null} or elements that are not of type * <p> If the set contains {@code null} or elements that are not of type
* {@code PosixFilePermission} then these elements are ignored. * {@code PosixFilePermission} then these elements are ignored.
...@@ -67,8 +69,6 @@ public class PosixFilePermissions { ...@@ -67,8 +69,6 @@ public class PosixFilePermissions {
* the set of permissions * the set of permissions
* *
* @return the string representation of the permission set * @return the string representation of the permission set
*
* @see #fromString
*/ */
public static String toString(Set<PosixFilePermission> perms) { public static String toString(Set<PosixFilePermission> perms) {
StringBuilder sb = new StringBuilder(9); StringBuilder sb = new StringBuilder(9);
......
...@@ -59,12 +59,11 @@ import java.io.IOException; ...@@ -59,12 +59,11 @@ import java.io.IOException;
* attributes. * attributes.
* *
* <p> Where dynamic access to file attributes is required, the {@link * <p> Where dynamic access to file attributes is required, the {@link
* #getAttribute getAttribute} or {@link #readAttributes(String,String[]) * java.nio.file.FileRef#getAttribute getAttribute} method may be used to read
* readAttributes(String,String[])} methods may be used to read the attribute * the attribute value. The attribute value is returned as a byte array (byte[]).
* value. The attribute value is returned as a byte array (byte[]). The {@link * The {@link java.nio.file.FileRef#setAttribute setAttribute} method may be used
* #setAttribute setAttribute} method may be used to write the value of a * to write the value of a user-defined attribute from a buffer (as if by
* user-defined attribute from a buffer (as if by invoking the {@link #write * invoking the {@link #write write} method), or byte array (byte[]).
* write} method), or byte array (byte[]).
* *
* @since 1.7 * @since 1.7
*/ */
...@@ -74,7 +73,7 @@ public interface UserDefinedFileAttributeView ...@@ -74,7 +73,7 @@ public interface UserDefinedFileAttributeView
{ {
/** /**
* Returns the name of this attribute view. Attribute views of this type * Returns the name of this attribute view. Attribute views of this type
* have the name {@code "xattr"}. * have the name {@code "user"}.
*/ */
@Override @Override
String name(); String name();
......
...@@ -89,7 +89,7 @@ public abstract class UserPrincipalLookupService { ...@@ -89,7 +89,7 @@ public abstract class UserPrincipalLookupService {
* @param group * @param group
* the string representation of the group to lookup * the string representation of the group to lookup
* *
* @return a user principal * @return a group principal
* *
* @throws UserPrincipalNotFoundException * @throws UserPrincipalNotFoundException
* the principal does not exist or is not a group * the principal does not exist or is not a group
......
...@@ -270,7 +270,9 @@ public abstract class FileSystemProvider { ...@@ -270,7 +270,9 @@ public abstract class FileSystemProvider {
public abstract FileSystem getFileSystem(URI uri); public abstract FileSystem getFileSystem(URI uri);
/** /**
* Return a {@code Path} object by converting the given {@link URI}. * Return a {@code Path} object by converting the given {@link URI}. The
* resulting {@code Path} is associated with a {@link FileSystem} that
* already exists or is constructed automatically.
* *
* <p> The exact form of the URI is file system provider dependent. In the * <p> The exact form of the URI is file system provider dependent. In the
* case of the default provider, the URI scheme is {@code "file"} and the * case of the default provider, the URI scheme is {@code "file"} and the
...@@ -290,7 +292,8 @@ public abstract class FileSystemProvider { ...@@ -290,7 +292,8 @@ public abstract class FileSystemProvider {
* If the URI scheme does not identify this provider or other * If the URI scheme does not identify this provider or other
* preconditions on the uri parameter do not hold * preconditions on the uri parameter do not hold
* @throws FileSystemNotFoundException * @throws FileSystemNotFoundException
* The file system, identified by the URI, does not exist * The file system, identified by the URI, does not exist and
* cannot be created automatically
* @throws SecurityException * @throws SecurityException
* If a security manager is installed and it denies an unspecified * If a security manager is installed and it denies an unspecified
* permission. * permission.
......
...@@ -690,7 +690,7 @@ public final class Scanner implements Iterator<String> { ...@@ -690,7 +690,7 @@ public final class Scanner implements Iterator<String> {
public Scanner(FileRef source) public Scanner(FileRef source)
throws IOException throws IOException
{ {
this(source.newByteChannel()); this(source.newInputStream());
} }
/** /**
...@@ -713,7 +713,7 @@ public final class Scanner implements Iterator<String> { ...@@ -713,7 +713,7 @@ public final class Scanner implements Iterator<String> {
public Scanner(FileRef source, String charsetName) public Scanner(FileRef source, String charsetName)
throws IOException throws IOException
{ {
this(source.newByteChannel(), charsetName); this(source.newInputStream(), charsetName);
} }
/** /**
......
...@@ -43,18 +43,18 @@ class Adler32 implements Checksum { ...@@ -43,18 +43,18 @@ class Adler32 implements Checksum {
public Adler32() { public Adler32() {
} }
/** /**
* Updates checksum with specified byte. * Updates the checksum with the specified byte (the low eight
* bits of the argument b).
* *
* @param b an array of bytes * @param b the byte to update the checksum with
*/ */
public void update(int b) { public void update(int b) {
adler = update(adler, b); adler = update(adler, b);
} }
/** /**
* Updates checksum with specified array of bytes. * Updates the checksum with the specified array of bytes.
*/ */
public void update(byte[] b, int off, int len) { public void update(byte[] b, int off, int len) {
if (b == null) { if (b == null) {
...@@ -67,21 +67,23 @@ class Adler32 implements Checksum { ...@@ -67,21 +67,23 @@ class Adler32 implements Checksum {
} }
/** /**
* Updates checksum with specified array of bytes. * Updates the checksum with the specified array of bytes.
*
* @param b the byte array to update the checksum with
*/ */
public void update(byte[] b) { public void update(byte[] b) {
adler = updateBytes(adler, b, 0, b.length); adler = updateBytes(adler, b, 0, b.length);
} }
/** /**
* Resets checksum to initial value. * Resets the checksum to initial value.
*/ */
public void reset() { public void reset() {
adler = 1; adler = 1;
} }
/** /**
* Returns checksum value. * Returns the checksum value.
*/ */
public long getValue() { public long getValue() {
return (long)adler & 0xffffffffL; return (long)adler & 0xffffffffL;
......
...@@ -43,14 +43,17 @@ class CRC32 implements Checksum { ...@@ -43,14 +43,17 @@ class CRC32 implements Checksum {
/** /**
* Updates CRC-32 with specified byte. * Updates the CRC-32 checksum with the specified byte (the low
* eight bits of the argument b).
*
* @param b the byte to update the checksum with
*/ */
public void update(int b) { public void update(int b) {
crc = update(crc, b); crc = update(crc, b);
} }
/** /**
* Updates CRC-32 with specified array of bytes. * Updates the CRC-32 checksum with the specified array of bytes.
*/ */
public void update(byte[] b, int off, int len) { public void update(byte[] b, int off, int len) {
if (b == null) { if (b == null) {
...@@ -63,7 +66,7 @@ class CRC32 implements Checksum { ...@@ -63,7 +66,7 @@ class CRC32 implements Checksum {
} }
/** /**
* Updates checksum with specified array of bytes. * Updates the CRC-32 checksum with the specified array of bytes.
* *
* @param b the array of bytes to update the checksum with * @param b the array of bytes to update the checksum with
*/ */
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
package java.util.zip; package java.util.zip;
import java.io.Closeable;
import java.io.InputStream; import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
import java.io.EOFException; import java.io.EOFException;
...@@ -47,7 +48,7 @@ import static java.util.zip.ZipConstants64.*; ...@@ -47,7 +48,7 @@ import static java.util.zip.ZipConstants64.*;
* @author David Connelly * @author David Connelly
*/ */
public public
class ZipFile implements ZipConstants { class ZipFile implements ZipConstants, Closeable {
private long jzfile; // address of jzfile data private long jzfile; // address of jzfile data
private String name; // zip file name private String name; // zip file name
private int total; // total number of entries private int total; // total number of entries
...@@ -248,6 +249,25 @@ class ZipFile implements ZipConstants { ...@@ -248,6 +249,25 @@ class ZipFile implements ZipConstants {
this(file, OPEN_READ, charset); this(file, OPEN_READ, charset);
} }
/**
* Returns the zip file comment, or null if none.
*
* @return the comment string for the zip file, or null if none
*
* @throws IllegalStateException if the zip file has been closed
*
* Since 1.7
*/
public String getComment() {
synchronized (this) {
ensureOpen();
byte[] bcomm = getCommentBytes(jzfile);
if (bcomm == null)
return null;
return zc.toString(bcomm, bcomm.length);
}
}
/** /**
* Returns the zip file entry for the specified name, or null * Returns the zip file entry for the specified name, or null
* if not found. * if not found.
...@@ -663,6 +683,7 @@ class ZipFile implements ZipConstants { ...@@ -663,6 +683,7 @@ class ZipFile implements ZipConstants {
private static native long getEntrySize(long jzentry); private static native long getEntrySize(long jzentry);
private static native int getEntryMethod(long jzentry); private static native int getEntryMethod(long jzentry);
private static native int getEntryFlag(long jzentry); private static native int getEntryFlag(long jzentry);
private static native byte[] getCommentBytes(long jzfile);
private static final int JZENTRY_NAME = 0; private static final int JZENTRY_NAME = 0;
private static final int JZENTRY_EXTRA = 1; private static final int JZENTRY_EXTRA = 1;
......
...@@ -34,6 +34,6 @@ public class ByteToCharMS950_HKSCS extends ByteToCharHKSCS { ...@@ -34,6 +34,6 @@ public class ByteToCharMS950_HKSCS extends ByteToCharHKSCS {
protected char getUnicode(int byte1, int byte2) { protected char getUnicode(int byte1, int byte2) {
char c = super.getUnicode(byte1, byte2); char c = super.getUnicode(byte1, byte2);
return (c != REPLACE_CHAR) ? c : bcMS950.getUnicode(byte1, byte2); return (c != REPLACE_CHAR) ? c : bcMS950.decodeDouble(byte1, byte2);
} }
} }
...@@ -34,6 +34,6 @@ public class CharToByteMS950_HKSCS extends CharToByteHKSCS { ...@@ -34,6 +34,6 @@ public class CharToByteMS950_HKSCS extends CharToByteHKSCS {
protected int getNative(char ch) { protected int getNative(char ch) {
int r = super.getNative(ch); int r = super.getNative(ch);
return (r != 0) ? r : cbMS950.getNative(ch); return (r != 0) ? r : cbMS950.encodeChar(ch);
} }
} }
...@@ -135,7 +135,9 @@ public class URLClassPath { ...@@ -135,7 +135,9 @@ public class URLClassPath {
* If the URL specified is null or is already in the list of * If the URL specified is null or is already in the list of
* URLs, then invoking this method has no effect. * URLs, then invoking this method has no effect.
*/ */
public void addURL(URL url) { public synchronized void addURL(URL url) {
if (closed)
return;
synchronized (urls) { synchronized (urls) {
if (url == null || path.contains(url)) if (url == null || path.contains(url))
return; return;
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册