Mercurial > hg > openjdk > jdk8 > jdk
changeset 8087:e11ed7187b0c
Merge
author | lana |
---|---|
date | Tue, 27 Aug 2013 21:46:00 -0700 |
parents | 4bfcf9c5ced3 (current diff) 9626ba160e3d (diff) |
children | 43de418f1345 |
files | src/share/classes/com/sun/security/auth/PolicyParser.java src/share/classes/com/sun/security/auth/SubjectCodeSource.java src/share/classes/java/util/jar/UnsupportedProfileException.java src/share/classes/sun/security/provider/ConfigSpiFile.java test/java/net/URLClassLoader/profiles/Basic.java test/java/net/URLClassLoader/profiles/Lib.java test/java/net/URLClassLoader/profiles/basic.sh test/tools/jar/AddAndUpdateProfile.java test/tools/launcher/profiles/Basic.java test/tools/launcher/profiles/Logging.java test/tools/launcher/profiles/Main.java test/tools/launcher/profiles/VersionCheck.java |
diffstat | 244 files changed, 20392 insertions(+), 6032 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgtags Tue Aug 27 13:37:38 2013 +0400 +++ b/.hgtags Tue Aug 27 21:46:00 2013 -0700 @@ -224,3 +224,5 @@ 5be9c5bfcfe9b2a40412b4fb364377d49de014eb jdk8-b100 6901612328239fbd471d20823113c1cf3fdaebee jdk8-b101 8ed8e2b4b90e0ac9aa5b3efef51cd576a9db96a9 jdk8-b102 +e0f6039c0290b7381042a6fec3100a69a5a67e37 jdk8-b103 +f1d8d15bfcb5ada858a942f8a31f6598f23214d1 jdk8-b104
--- a/make/java/java/Exportedfiles.gmk Tue Aug 27 13:37:38 2013 +0400 +++ b/make/java/java/Exportedfiles.gmk Tue Aug 27 21:46:00 2013 -0700 @@ -50,6 +50,7 @@ java/lang/SecurityManager.java \ java/lang/Shutdown.java \ java/lang/Package.java \ + java/lang/UNIXProcess.java \ java/lang/ref/Finalizer.java \ java/lang/reflect/AccessibleObject.java \ java/lang/reflect/Field.java \
--- a/make/java/java/Makefile Tue Aug 27 13:37:38 2013 +0400 +++ b/make/java/java/Makefile Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2013, Oracle and/or its affiliates. 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 @@ -87,6 +87,7 @@ java/util/prefs/FileSystemPreferencesFactory.java \ FILES_c += UNIXProcess_md.c \ + childproc.c \ UnixFileSystem_md.c \ canonicalize_md.c \ TimeZone.c \ @@ -468,3 +469,36 @@ clean:: $(RM) $(GENSRCDIR)/sun/util/CoreResourceBundleControl.java + +HELPER_EXE = $(LIBDIR)/$(LIBARCH)/jspawnhelper +BUILDHELPER = +ifeq ($(PLATFORM), solaris) + BUILDHELPER = 1 +endif +ifeq ($(PLATFORM), macosx) + HELPER_EXE = $(LIBDIR)/jspawnhelper + BUILDHELPER = 1 +endif + +ARCHFLAG = +ifeq ($(ARCH_DATA_MODEL), 64) +ARCHFLAG = -m64 +endif + +ifdef BUILDHELPER + +HELPER_EXE_FILES_c = jspawnhelper.c +HELPER_EXE_FILES_o = $(OBJDIR)/jspawnhelper.o \ + $(OBJDIR)/childproc.o + +$(HELPER_EXE): $(HELPER_EXE_FILES_o) + $(CC) $(ARCHFLAG) $(HELPER_EXE_FILES_o) \ + -o $(TEMPDIR)/jspawnhelper + $(CP) $(TEMPDIR)/jspawnhelper $(HELPER_EXE) + +build: $(HELPER_EXE) + +clean clobber:: + $(RM) $(HELPER_EXE_FILES_o) $(HELPER_EXE) + +endif #BUILDHELPER
--- a/make/java/java/mapfile-vers Tue Aug 27 13:37:38 2013 +0400 +++ b/make/java/java/mapfile-vers Tue Aug 27 21:46:00 2013 -0700 @@ -100,7 +100,7 @@ Java_java_io_RandomAccessFile_open; Java_java_io_RandomAccessFile_read; Java_java_io_RandomAccessFile_readBytes; - Java_java_io_RandomAccessFile_seek; + Java_java_io_RandomAccessFile_seek0; Java_java_io_RandomAccessFile_setLength; Java_java_io_RandomAccessFile_write; Java_java_io_RandomAccessFile_writeBytes;
--- a/make/sun/javazic/tzdata/VERSION Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/VERSION Tue Aug 27 21:46:00 2013 -0700 @@ -21,4 +21,4 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -tzdata2013c +tzdata2013d
--- a/make/sun/javazic/tzdata/africa Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/africa Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. @@ -875,12 +875,18 @@ # announced that year's Ramadan daylight-saving transitions would be # 2012-07-20 and 2012-08-20; see # <http://www.mmsp.gov.ma/fr/actualites.aspx?id=288>. -# + +# From Andrew Paprocki (2013-07-02): +# Morocco announced that the year's Ramadan daylight-savings +# transitions would be 2013-07-07 and 2013-08-10; see: +# http://www.maroc.ma/en/news/morocco-suspends-daylight-saving-time-july-7-aug10 + +# From Paul Eggert (2013-07-03): # To estimate what the Moroccan government will do in future years, -# transition dates for 2013 through 2021 were determined by running +# transition dates for 2014 through 2021 were determined by running # the following program under GNU Emacs 24.3: # -# (let ((islamic-year 1434)) +# (let ((islamic-year 1435)) # (while (< islamic-year 1444) # (let ((a # (calendar-gregorian-from-absolute @@ -933,8 +939,8 @@ Rule Morocco 2012 max - Sep lastSun 3:00 0 - Rule Morocco 2012 only - Jul 20 3:00 0 - Rule Morocco 2012 only - Aug 20 2:00 1:00 S -Rule Morocco 2013 only - Jul 9 3:00 0 - -Rule Morocco 2013 only - Aug 8 2:00 1:00 S +Rule Morocco 2013 only - Jul 7 3:00 0 - +Rule Morocco 2013 only - Aug 10 2:00 1:00 S Rule Morocco 2014 only - Jun 29 3:00 0 - Rule Morocco 2014 only - Jul 29 2:00 1:00 S Rule Morocco 2015 only - Jun 18 3:00 0 -
--- a/make/sun/javazic/tzdata/antarctica Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/antarctica Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/make/sun/javazic/tzdata/asia Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/asia Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. @@ -1235,39 +1235,21 @@ Rule Zion 2012 only - Mar Fri>=26 2:00 1:00 D Rule Zion 2012 only - Sep 23 2:00 0 S -# From Ephraim Silverberg (2012-10-18): -# Yesterday, the Interior Ministry Committee, after more than a year -# past, approved sending the proposed June 2011 changes to the Time -# Decree Law back to the Knesset for second and third (final) votes -# before the upcoming elections on Jan. 22, 2013. Hence, although the -# changes are not yet law, they are expected to be so before February 2013. +# From Ephraim Silverberg (2013-06-27): +# On June 23, 2013, the Israeli government approved changes to the +# Time Decree Law. The next day, the changes passed the First Reading +# in the Knesset. The law is expected to pass the Second and Third +# (final) Readings by the beginning of September 2013. # -# As of 2013, DST starts at 02:00 on the Friday before the last Sunday in March. -# DST ends at 02:00 on the first Sunday after October 1, unless it occurs on the -# second day of the Jewish Rosh Hashana holiday, in which case DST ends a day -# later (i.e. at 02:00 the first Monday after October 2). -# [Rosh Hashana holidays are factored in until 2100.] - -# From Ephraim Silverberg (2012-11-05): -# The Knesset passed today (in second and final readings) the amendment to the -# Time Decree Law making the changes ... law. +# As of 2013, DST starts at 02:00 on the Friday before the last Sunday +# in March. DST ends at 02:00 on the last Sunday of October. # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Zion 2013 max - Mar Fri>=23 2:00 1:00 D -Rule Zion 2013 2026 - Oct Sun>=2 2:00 0 S -Rule Zion 2027 only - Oct Mon>=3 2:00 0 S -Rule Zion 2028 max - Oct Sun>=2 2:00 0 S -# The following rules are commented out for now, as they break older -# versions of zic that support only signed 32-bit timestamps, i.e., -# through 2038-01-19 03:14:07 UTC. -#Rule Zion 2028 2053 - Oct Sun>=2 2:00 0 S -#Rule Zion 2054 only - Oct Mon>=3 2:00 0 S -#Rule Zion 2055 2080 - Oct Sun>=2 2:00 0 S -#Rule Zion 2081 only - Oct Mon>=3 2:00 0 S -#Rule Zion 2082 max - Oct Sun>=2 2:00 0 S +Rule Zion 2013 max - Oct lastSun 2:00 0 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] -Zone Asia/Jerusalem 2:20:56 - LMT 1880 +Zone Asia/Jerusalem 2:20:54 - LMT 1880 2:20:40 - JMT 1918 # Jerusalem Mean Time? 2:00 Zion I%sT @@ -2570,8 +2552,8 @@ Rule Syria 2007 only - Mar lastFri 0:00 1:00 S # From Jesper Norgard (2007-10-27): # The sister center ICARDA of my work CIMMYT is confirming that Syria DST will -# not take place 1.st November at 0:00 o'clock but 1.st November at 24:00 or -# rather Midnight between Thursday and Friday. This does make more sence than +# not take place 1st November at 0:00 o'clock but 1st November at 24:00 or +# rather Midnight between Thursday and Friday. This does make more sense than # having it between Wednesday and Thursday (two workdays in Syria) since the # weekend in Syria is not Saturday and Sunday, but Friday and Saturday. So now # it is implemented at midnight of the last workday before weekend...
--- a/make/sun/javazic/tzdata/australasia Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/australasia Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. @@ -253,10 +253,16 @@ # - Macquarie Island will stay on UTC+11 for winter and therefore not # switch back from daylight savings time when other parts of Australia do # on 4 April. +# +# From Arthur David Olson (2013-05-23): +# The 1919 transition is overspecified below so pre-2013 zics +# will produce a binary file with an EST-type as the first 32-bit type; +# this is required for correct handling of times before 1916 by +# pre-2013 versions of localtime. Zone Antarctica/Macquarie 0 - zzz 1899 Nov 10:00 - EST 1916 Oct 1 2:00 10:00 1:00 EST 1917 Feb - 10:00 Aus EST 1919 Apr + 10:00 Aus EST 1919 Apr 1 0:00s 0 - zzz 1948 Mar 25 10:00 Aus EST 1967 10:00 AT EST 2010 Apr 4 3:00 @@ -1498,12 +1504,12 @@ # From Paul Eggert (2000-01-08): # IATA SSIM (1999-09) says DST ends 0100 local time. Go with McDow. -# From the BBC World Service (1998-10-31 11:32 UTC): +# From the BBC World Service in +# http://news.bbc.co.uk/2/hi/asia-pacific/205226.stm (1998-10-31 16:03 UTC): # The Fijiian government says the main reasons for the time change is to -# improve productivity and reduce road accidents. But correspondents say it -# also hopes the move will boost Fiji's ability to compete with other pacific -# islands in the effort to attract tourists to witness the dawning of the new -# millenium. +# improve productivity and reduce road accidents.... [T]he move is also +# intended to boost Fiji's ability to attract tourists to witness the dawning +# of the new millennium. # http://www.fiji.gov.fj/press/2000_09/2000_09_13-05.shtml (2000-09-13) # reports that Fiji has discontinued DST. @@ -1648,7 +1654,7 @@ # Shanks & Pottenger say the transition was on 1968-10-01; go with Mundell. # From Eric Ulevik (1999-05-03): -# Tonga's director of tourism, who is also secretary of the National Millenium +# Tonga's director of tourism, who is also secretary of the National Millennium # Committee, has a plan to get Tonga back in front. # He has proposed a one-off move to tropical daylight saving for Tonga from # October to March, which has won approval in principle from the Tongan
--- a/make/sun/javazic/tzdata/backward Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/backward Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/make/sun/javazic/tzdata/etcetera Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/etcetera Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/make/sun/javazic/tzdata/europe Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/europe Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. @@ -546,7 +546,7 @@ # It seems that Paris, Monaco, Rule France, Rule Belgium all agree on # 2:00 standard time, e.g. 3:00 local time. However there are no # countries that use C-Eur rules in September 1945, so the only items -# affected are apparently these ficticious zones that translates acronyms +# affected are apparently these fictitious zones that translate acronyms # CET and MET: # # Zone CET 1:00 C-Eur CE%sT @@ -2802,9 +2802,9 @@ # Ukraine # -# From Igor Karpov, who works for the Ukranian Ministry of Justice, +# From Igor Karpov, who works for the Ukrainian Ministry of Justice, # via Garrett Wollman (2003-01-27): -# BTW, I've found the official document on this matter. It's goverment +# BTW, I've found the official document on this matter. It's government # regulations number 509, May 13, 1996. In my poor translation it says: # "Time in Ukraine is set to second timezone (Kiev time). Each last Sunday # of March at 3am the time is changing to 4am and each last Sunday of @@ -2838,7 +2838,7 @@ # time this year after all. # # From Udo Schwedt (2011-10-18): -# As far as I understand, the recent change to the Ukranian time zone +# As far as I understand, the recent change to the Ukrainian time zone # (Europe/Kiev) to introduce permanent daylight saving time (similar # to Russia) was reverted today: #
--- a/make/sun/javazic/tzdata/factory Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/factory Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/make/sun/javazic/tzdata/iso3166.tab Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/iso3166.tab Tue Aug 27 21:46:00 2013 -0700 @@ -1,39 +1,37 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. # -# <pre> +# ISO 3166 alpha-2 country codes +# # This file is in the public domain, so clarified as of # 2009-05-17 by Arthur David Olson. -# ISO 3166 alpha-2 country codes # -# From Paul Eggert (2006-09-27): +# From Paul Eggert (2013-05-27): # # This file contains a table with the following columns: # 1. ISO 3166-1 alpha-2 country code, current as of -# ISO 3166-1 Newsletter VI-1 (2007-09-21). See: -# <a href="http://www.iso.org/iso/en/prods-services/iso3166ma/index.html"> -# ISO 3166 Maintenance agency (ISO 3166/MA) -# </a>. +# ISO 3166-1 Newsletter VI-15 (2013-05-10). See: Updates on ISO 3166 +# http://www.iso.org/iso/home/standards/country_codes/updates_on_iso_3166.htm # 2. The usual English name for the country, # chosen so that alphabetic sorting of subsets produces helpful lists. # This is not the same as the English name in the ISO 3166 tables. @@ -43,8 +41,9 @@ # # Lines beginning with `#' are comments. # -# From Arthur David Olson (2011-08-17): -# Resynchronized today with the ISO 3166 site (adding SS for South Sudan). +# This table is intended as an aid for users, to help them select time +# zone data appropriate for their practical needs. It is not intended +# to take or endorse any position on legal or territorial claims. # #country- #code country name @@ -77,7 +76,7 @@ BM Bermuda BN Brunei BO Bolivia -BQ Bonaire Sint Eustatius & Saba +BQ Bonaire, St Eustatius & Saba BR Brazil BS Bahamas BT Bhutan @@ -258,7 +257,7 @@ SS South Sudan ST Sao Tome & Principe SV El Salvador -SX Sint Maarten +SX St Maarten (Dutch part) SY Syria SZ Swaziland TC Turks & Caicos Is
--- a/make/sun/javazic/tzdata/leapseconds Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/leapseconds Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/make/sun/javazic/tzdata/northamerica Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/northamerica Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/make/sun/javazic/tzdata/pacificnew Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/pacificnew Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/make/sun/javazic/tzdata/solar87 Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/solar87 Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/make/sun/javazic/tzdata/solar88 Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/solar88 Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/make/sun/javazic/tzdata/solar89 Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/solar89 Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/make/sun/javazic/tzdata/southamerica Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/southamerica Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. @@ -994,7 +994,7 @@ # adopted by the same states as before. Rule Brazil 2007 only - Oct Sun>=8 0:00 1:00 S # From Frederico A. C. Neves (2008-09-10): -# Acording to this decree +# According to this decree # <a href="http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm"> # http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm # </a> @@ -1226,7 +1226,7 @@ # http://www.emol.com/noticias/nacional/detalle/detallenoticias.asp?idnoticia=467651 # </a> # -# This is not yet reflected in the offical "cambio de hora" site, but +# This is not yet reflected in the official "cambio de hora" site, but # probably will be soon: # <a href="http://www.horaoficial.cl/cambio.htm"> # http://www.horaoficial.cl/cambio.htm
--- a/make/sun/javazic/tzdata/systemv Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/systemv Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/make/sun/javazic/tzdata/zone.tab Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/javazic/tzdata/zone.tab Tue Aug 27 21:46:00 2013 -0700 @@ -1,41 +1,44 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. # -# <pre> +# TZ zone descriptions +# # This file is in the public domain, so clarified as of # 2009-05-17 by Arthur David Olson. # -# TZ zone descriptions -# -# From Paul Eggert (1996-08-05): +# From Paul Eggert (2013-05-27): # # This file contains a table with the following columns: # 1. ISO 3166 2-character country code. See the file `iso3166.tab'. +# This identifies a country that overlaps the zone. The country may +# overlap other zones and the zone may overlap other countries. # 2. Latitude and longitude of the zone's principal location # in ISO 6709 sign-degrees-minutes-seconds format, # either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS, # first latitude (+ is north), then longitude (+ is east). +# This location need not lie within the column-1 country. # 3. Zone name used in value of TZ environment variable. +# Please see the 'Theory' file for how zone names are chosen. # 4. Comments; present if and only if the country has multiple rows. # # Columns are separated by a single tab. @@ -45,6 +48,10 @@ # # Lines beginning with `#' are comments. # +# This table is intended as an aid for users, to help them select time +# zone data appropriate for their practical needs. It is not intended +# to take or endorse any position on legal or territorial claims. +# #country- #code coordinates TZ comments AD +4230+00131 Europe/Andorra @@ -239,7 +246,7 @@ ID -0507+11924 Asia/Makassar east & south Borneo, Sulawesi (Celebes), Bali, Nusa Tengarra, west Timor ID -0232+14042 Asia/Jayapura west New Guinea (Irian Jaya) & Malukus (Moluccas) IE +5320-00615 Europe/Dublin -IL +3146+03514 Asia/Jerusalem +IL +314650+0351326 Asia/Jerusalem IM +5409-00428 Europe/Isle_of_Man IN +2232+08822 Asia/Kolkata IO -0720+07225 Indian/Chagos
--- a/make/sun/jconsole/Makefile Tue Aug 27 13:37:38 2013 +0400 +++ b/make/sun/jconsole/Makefile Tue Aug 27 21:46:00 2013 -0700 @@ -94,4 +94,5 @@ clean clobber:: $(RM) $(TEMPDIR)/manifest $(JARFILE) + $(RM) $(GENSRCDIR)/sun/tools/jconsole/Version.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/tools/CharsetMapping/IBM290.c2b Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,100 @@ +# +# Diff of +# b2c: cdctables.zip/Package2.zip/IBM-290.zip/012234B0.TPMAP100 +# c2b: cdctables.zip/Package2.zip/IBM-290.zip/012234B0.UPMAP100 +# +# fullwidth form +0x4B U+FF0E +0x4C U+FF1C +0x4D U+FF08 +0x4E U+FF0B +0x4F U+FF5C +0x50 U+FF06 +0x5A U+FF01 +0x5C U+FF0A +0x5D U+FF09 +0x5E U+FF1B +0x60 U+FF0D +0x61 U+FF0F +0x62 U+FF41 +0x63 U+FF42 +0x64 U+FF43 +0x65 U+FF44 +0x66 U+FF45 +0x67 U+FF46 +0x68 U+FF47 +0x69 U+FF48 +0x6B U+FF0C +0x6C U+FF05 +0x6D U+FF3F +0x6E U+FF1E +0x6F U+FF1F +0x70 U+FF3B +0x71 U+FF49 +0x72 U+FF4A +0x73 U+FF4B +0x74 U+FF4C +0x75 U+FF4D +0x76 U+FF4E +0x77 U+FF4F +0x78 U+FF50 +0x79 U+FF40 +0x7A U+FF1A +0x7B U+FF03 +0x7C U+FF20 +0x7D U+FF07 +0x7E U+FF1D +0x7F U+FF02 +0x80 U+FF3D +0x8B U+FF51 +0x9B U+FF52 +0xA0 U+FF5E +0xAB U+FF53 +0xB0 U+FF3E +0xB2 U+FF3C +0xB3 U+FF54 +0xB4 U+FF55 +0xB5 U+FF56 +0xB6 U+FF57 +0xB7 U+FF58 +0xB8 U+FF59 +0xB9 U+FF5A +0xC0 U+FF5B +0xC1 U+FF21 +0xC2 U+FF22 +0xC3 U+FF23 +0xC4 U+FF24 +0xC5 U+FF25 +0xC6 U+FF26 +0xC7 U+FF27 +0xC8 U+FF28 +0xC9 U+FF29 +0xD0 U+FF5D +0xD1 U+FF2A +0xD2 U+FF2B +0xD3 U+FF2C +0xD4 U+FF2D +0xD5 U+FF2E +0xD6 U+FF2F +0xD7 U+FF30 +0xD8 U+FF31 +0xD9 U+FF32 +0xE0 U+FF04 +0xE2 U+FF33 +0xE3 U+FF34 +0xE4 U+FF35 +0xE5 U+FF36 +0xE6 U+FF37 +0xE7 U+FF38 +0xE8 U+FF39 +0xE9 U+FF3A +0xF0 U+FF10 +0xF1 U+FF11 +0xF2 U+FF12 +0xF3 U+FF13 +0xF4 U+FF14 +0xF5 U+FF15 +0xF6 U+FF16 +0xF7 U+FF17 +0xF8 U+FF18 +0xF9 U+FF19
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/tools/CharsetMapping/IBM290.map Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,232 @@ +# +# b2c mapping for IBM290, generated from +# cdctables.zip/Package2.zip/IBM-290.zip/012234B0.TPMAP100 +# +0x00 U+0000 +0x01 U+0001 +0x02 U+0002 +0x03 U+0003 +0x04 U+009C +0x05 U+0009 +0x06 U+0086 +0x07 U+007F +0x08 U+0097 +0x09 U+008D +0x0A U+008E +0x0B U+000B +0x0C U+000C +0x0D U+000D +0x0E U+000E +0x0F U+000F +0x10 U+0010 +0x11 U+0011 +0x12 U+0012 +0x13 U+0013 +0x14 U+009D +0x15 U+0085 +0x16 U+0008 +0x17 U+0087 +0x18 U+0018 +0x19 U+0019 +0x1A U+0092 +0x1B U+008F +0x1C U+001C +0x1D U+001D +0x1E U+001E +0x1F U+001F +0x20 U+0080 +0x21 U+0081 +0x22 U+0082 +0x23 U+0083 +0x24 U+0084 +0x25 U+000A +0x26 U+0017 +0x27 U+001B +0x28 U+0088 +0x29 U+0089 +0x2A U+008A +0x2B U+008B +0x2C U+008C +0x2D U+0005 +0x2E U+0006 +0x2F U+0007 +0x30 U+0090 +0x31 U+0091 +0x32 U+0016 +0x33 U+0093 +0x34 U+0094 +0x35 U+0095 +0x36 U+0096 +0x37 U+0004 +0x38 U+0098 +0x39 U+0099 +0x3A U+009A +0x3B U+009B +0x3C U+0014 +0x3D U+0015 +0x3E U+009E +0x3F U+001A +0x40 U+0020 +0x41 U+FF61 +0x42 U+FF62 +0x43 U+FF63 +0x44 U+FF64 +0x45 U+FF65 +0x46 U+FF66 +0x47 U+FF67 +0x48 U+FF68 +0x49 U+FF69 +0x4A U+00A3 +0x4B U+002E +0x4C U+003C +0x4D U+0028 +0x4E U+002B +0x4F U+007C +0x50 U+0026 +0x51 U+FF6A +0x52 U+FF6B +0x53 U+FF6C +0x54 U+FF6D +0x55 U+FF6E +0x56 U+FF6F +0x58 U+FF70 +0x5A U+0021 +0x5B U+00A5 +0x5C U+002A +0x5D U+0029 +0x5E U+003B +0x5F U+00AC +0x60 U+002D +0x61 U+002F +0x62 U+0061 +0x63 U+0062 +0x64 U+0063 +0x65 U+0064 +0x66 U+0065 +0x67 U+0066 +0x68 U+0067 +0x69 U+0068 +0x6B U+002C +0x6C U+0025 +0x6D U+005F +0x6E U+003E +0x6F U+003F +0x70 U+005B +0x71 U+0069 +0x72 U+006A +0x73 U+006B +0x74 U+006C +0x75 U+006D +0x76 U+006E +0x77 U+006F +0x78 U+0070 +0x79 U+0060 +0x7A U+003A +0x7B U+0023 +0x7C U+0040 +0x7D U+0027 +0x7E U+003D +0x7F U+0022 +0x80 U+005D +0x81 U+FF71 +0x82 U+FF72 +0x83 U+FF73 +0x84 U+FF74 +0x85 U+FF75 +0x86 U+FF76 +0x87 U+FF77 +0x88 U+FF78 +0x89 U+FF79 +0x8A U+FF7A +0x8B U+0071 +0x8C U+FF7B +0x8D U+FF7C +0x8E U+FF7D +0x8F U+FF7E +0x90 U+FF7F +0x91 U+FF80 +0x92 U+FF81 +0x93 U+FF82 +0x94 U+FF83 +0x95 U+FF84 +0x96 U+FF85 +0x97 U+FF86 +0x98 U+FF87 +0x99 U+FF88 +0x9A U+FF89 +0x9B U+0072 +0x9D U+FF8A +0x9E U+FF8B +0x9F U+FF8C +0xA0 U+007E +0xA1 U+203E +0xA2 U+FF8D +0xA3 U+FF8E +0xA4 U+FF8F +0xA5 U+FF90 +0xA6 U+FF91 +0xA7 U+FF92 +0xA8 U+FF93 +0xA9 U+FF94 +0xAA U+FF95 +0xAB U+0073 +0xAC U+FF96 +0xAD U+FF97 +0xAE U+FF98 +0xAF U+FF99 +0xB0 U+005E +0xB1 U+00A2 +0xB2 U+005C +0xB3 U+0074 +0xB4 U+0075 +0xB5 U+0076 +0xB6 U+0077 +0xB7 U+0078 +0xB8 U+0079 +0xB9 U+007A +0xBA U+FF9A +0xBB U+FF9B +0xBC U+FF9C +0xBD U+FF9D +0xBE U+FF9E +0xBF U+FF9F +0xC0 U+007B +0xC1 U+0041 +0xC2 U+0042 +0xC3 U+0043 +0xC4 U+0044 +0xC5 U+0045 +0xC6 U+0046 +0xC7 U+0047 +0xC8 U+0048 +0xC9 U+0049 +0xD0 U+007D +0xD1 U+004A +0xD2 U+004B +0xD3 U+004C +0xD4 U+004D +0xD5 U+004E +0xD6 U+004F +0xD7 U+0050 +0xD8 U+0051 +0xD9 U+0052 +0xE0 U+0024 +0xE2 U+0053 +0xE3 U+0054 +0xE4 U+0055 +0xE5 U+0056 +0xE6 U+0057 +0xE7 U+0058 +0xE8 U+0059 +0xE9 U+005A +0xF0 U+0030 +0xF1 U+0031 +0xF2 U+0032 +0xF3 U+0033 +0xF4 U+0034 +0xF5 U+0035 +0xF6 U+0036 +0xF7 U+0037 +0xF8 U+0038 +0xF9 U+0039 +0xFF U+009F
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/tools/CharsetMapping/IBM300.c2b Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,50 @@ +# +# Diff of +# b2c: cdctables.zip/Package2.zip/IBM-300.zip/012C34B0.TPMAP120 +# c2b: cdctables.zip/Package2.zip/IBM-300.zip/012C34B0.UPMAP120 +# +4260 2212 +426A 00A6 +43A1 301C +444A 2014 +446E F86F +447C 2016 +4C7D 9E7C +4EB3 9830 +4F5E 5861 +507F 91AC +5190 56CA +51F1 6805 +51FA 91B1 +5261 9EB4 +52A1 881F +52C9 840A +52DA 7E61 +52EC 4FE0 +5353 8EC0 +5373 7E6B +53B3 8346 +53DA 9A52 +53E8 87EC +53EE 7130 +53F8 8523 +5443 5C5B +5464 9DD7 +547D 5699 +5481 525D +54A3 6414 +54A4 7626 +54CA 7C1E +54CD 6451 +54D4 555E +54FA 6F51 +5550 7006 +5553 79B1 +555F 9EB5 +55C0 5C62 +55C1 985A +5B72 6522 +5BFE 688E +60F1 7E48 +61B0 8141 +66C8 9839
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/tools/CharsetMapping/IBM300.map Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,11644 @@ +# +# b2c mapping for IBM300, generated from +# cdctables.zip/Package2.zip/IBM-300.zip/012C34B0.TPMAP120 +# +# <subchar> FEFE +# Note: subchar FEFE itself is not a defined character in +# 300 character set, we use fullwidth question mark +# <0x426f U+FF1F> instead +# +4040 3000 +4141 03B1 +4142 03B2 +4143 03B3 +4144 03B4 +4145 03B5 +4146 03B6 +4147 03B7 +4148 03B8 +4149 03B9 +414A 03BA +414B 03BB +414C 03BC +414D 03BD +414E 03BE +414F 03BF +4150 03C0 +4151 03C1 +4152 03C3 +4153 03C4 +4154 03C5 +4155 03C6 +4156 03C7 +4157 03C8 +4158 03C9 +4161 0391 +4162 0392 +4163 0393 +4164 0394 +4165 0395 +4166 0396 +4167 0397 +4168 0398 +4169 0399 +416A 039A +416B 039B +416C 039C +416D 039D +416E 039E +416F 039F +4170 03A0 +4171 03A1 +4172 03A3 +4173 03A4 +4174 03A5 +4175 03A6 +4176 03A7 +4177 03A8 +4178 03A9 +4180 0430 +4181 0431 +4182 0432 +4183 0433 +4184 0434 +4185 0435 +4186 0451 +4187 0436 +4188 0437 +4189 0438 +418A 0439 +418B 043A +418C 043B +418D 043C +418E 043D +418F 043E +4190 043F +4191 0440 +4192 0441 +4193 0442 +4194 0443 +4195 0444 +4196 0445 +4197 0446 +4198 0447 +4199 0448 +419A 0449 +419B 044A +419C 044B +419D 044C +419E 044D +419F 044E +41A0 044F +41B1 2170 +41B2 2171 +41B3 2172 +41B4 2173 +41B5 2174 +41B6 2175 +41B7 2176 +41B8 2177 +41B9 2178 +41BA 2179 +41C0 0410 +41C1 0411 +41C2 0412 +41C3 0413 +41C4 0414 +41C5 0415 +41C6 0401 +41C7 0416 +41C8 0417 +41C9 0418 +41CA 0419 +41CB 041A +41CC 041B +41CD 041C +41CE 041D +41CF 041E +41D0 041F +41D1 0420 +41D2 0421 +41D3 0422 +41D4 0423 +41D5 0424 +41D6 0425 +41D7 0426 +41D8 0427 +41D9 0428 +41DA 0429 +41DB 042A +41DC 042B +41DD 042C +41DE 042D +41DF 042E +41E0 042F +41F1 2160 +41F2 2161 +41F3 2162 +41F4 2163 +41F5 2164 +41F6 2165 +41F7 2166 +41F8 2167 +41F9 2168 +41FA 2169 +424A FFE1 +424B FF0E +424C FF1C +424D FF08 +424E FF0B +424F FF5C +4250 FF06 +425A FF01 +425B FFE5 +425C FF0A +425D FF09 +425E FF1B +425F FFE2 +4260 FF0D +4261 FF0F +426A FFE4 +426B FF0C +426C FF05 +426D FF3F +426E FF1E +426F FF1F +4279 FF40 +427A FF1A +427B FF03 +427C FF20 +427D FF07 +427E FF1D +427F FF02 +4281 FF41 +4282 FF42 +4283 FF43 +4284 FF44 +4285 FF45 +4286 FF46 +4287 FF47 +4288 FF48 +4289 FF49 +4291 FF4A +4292 FF4B +4293 FF4C +4294 FF4D +4295 FF4E +4296 FF4F +4297 FF50 +4298 FF51 +4299 FF52 +42A1 FFE3 +42A2 FF53 +42A3 FF54 +42A4 FF55 +42A5 FF56 +42A6 FF57 +42A7 FF58 +42A8 FF59 +42A9 FF5A +42C0 FF5B +42C1 FF21 +42C2 FF22 +42C3 FF23 +42C4 FF24 +42C5 FF25 +42C6 FF26 +42C7 FF27 +42C8 FF28 +42C9 FF29 +42D0 FF5D +42D1 FF2A +42D2 FF2B +42D3 FF2C +42D4 FF2D +42D5 FF2E +42D6 FF2F +42D7 FF30 +42D8 FF31 +42D9 FF32 +42E0 FF04 +42E2 FF33 +42E3 FF34 +42E4 FF35 +42E5 FF36 +42E6 FF37 +42E7 FF38 +42E8 FF39 +42E9 FF3A +42F0 FF10 +42F1 FF11 +42F2 FF12 +42F3 FF13 +42F4 FF14 +42F5 FF15 +42F6 FF16 +42F7 FF17 +42F8 FF18 +42F9 FF19 +4341 3002 +4342 300C +4343 300D +4344 3001 +4345 30FB +4346 30F2 +4347 30A1 +4348 30A3 +4349 30A5 +434A FFE0 +434B 2220 +434C 22A5 +434D 2312 +434E 2202 +434F 2207 +4351 30A7 +4352 30A9 +4353 30E3 +4354 30E5 +4355 30E7 +4356 30C3 +4357 30EE +4358 30FC +4359 30F5 +435A 30F6 +435B 2261 +435C 2252 +435D 226A +435E 226B +435F 221A +4360 223D +4361 221D +4362 222B +4363 222C +4364 2208 +4365 220B +4366 2286 +4367 2287 +4368 2282 +4369 2283 +436A 222A +436B 2229 +436C 2227 +436D 2228 +436E 21D2 +436F 21D4 +4370 2200 +4371 2203 +4372 212B +4373 2030 +4374 266F +4375 266D +4376 266A +4377 2020 +4378 2021 +4379 00B6 +437A 25EF +437C 2500 +437D 2502 +437E 250C +437F 2510 +4381 30A2 +4382 30A4 +4383 30A6 +4384 30A8 +4385 30AA +4386 30AB +4387 30AD +4388 30AF +4389 30B1 +438A 30B3 +438C 30B5 +438D 30B7 +438E 30B9 +438F 30BB +4390 30BD +4391 30BF +4392 30C1 +4393 30C4 +4394 30C6 +4395 30C8 +4396 30CA +4397 30CB +4398 30CC +4399 30CD +439A 30CE +439D 30CF +439E 30D2 +439F 30D5 +43A1 FF5E +43A2 30D8 +43A3 30DB +43A4 30DE +43A5 30DF +43A6 30E0 +43A7 30E1 +43A8 30E2 +43A9 30E4 +43AA 30E6 +43AC 30E8 +43AD 30E9 +43AE 30EA +43AF 30EB +43B0 2518 +43B1 2514 +43B2 251C +43B3 252C +43B4 2524 +43B5 2534 +43B6 253C +43B7 2501 +43B8 2503 +43B9 250F +43BA 30EC +43BB 30ED +43BC 30EF +43BD 30F3 +43BE 309B +43BF 309C +43C0 30AC +43C1 30AE +43C2 30B0 +43C3 30B2 +43C4 30B4 +43C5 30B6 +43C6 30B8 +43C7 30BA +43C8 30BC +43C9 30BE +43CA 30C0 +43CB 30C2 +43CC 30C5 +43CD 30C7 +43CE 30C9 +43CF 30D0 +43D0 30D3 +43D1 30D6 +43D2 30D9 +43D3 30DC +43D4 30F4 +43D5 30D1 +43D6 30D4 +43D7 30D7 +43D8 30DA +43D9 30DD +43DA 30F0 +43DB 30F1 +43DC 30FD +43DD 30FE +43E0 FF3C +43E1 2513 +43E2 251B +43E3 2517 +43E4 2523 +43E5 2533 +43E6 252B +43E7 253B +43E8 254B +43E9 2520 +43EA 252F +43EB 2528 +43EC 2537 +43ED 253F +43EE 251D +43EF 2530 +43F0 2525 +43F1 2538 +43F2 2542 +4442 300E +4443 300F +4444 FF3B +4445 FF3D +4446 3092 +4447 3041 +4448 3043 +4449 3045 +444A 2015 +444B 00B1 +444C 2260 +444D 221E +444E 2103 +4450 00B4 +4451 3047 +4452 3049 +4453 3083 +4454 3085 +4455 3087 +4456 3063 +4457 308E +445A 2010 +445B 3003 +445C 4EDD +445D 3005 +445E 3006 +445F 3007 +4460 00A8 +4461 2018 +4462 201C +4463 3014 +4464 3008 +4465 300A +4466 3010 +4467 2266 +4468 2234 +4469 2642 +446A 00A7 +446B 203B +446C 3012 +446D 3231 +446E 2116 +446F 2121 +4470 FF3E +4471 2019 +4472 201D +4473 3015 +4474 3009 +4475 300B +4476 3011 +4477 2267 +4478 2235 +4479 2640 +447A 00D7 +447B 00F7 +447C 2225 +447D 3013 +447E 2025 +447F 2026 +4481 3042 +4482 3044 +4483 3046 +4484 3048 +4485 304A +4486 304B +4487 304D +4488 304F +4489 3051 +448A 3053 +448C 3055 +448D 3057 +448E 3059 +448F 305B +4490 305D +4491 305F +4492 3061 +4493 3064 +4494 3066 +4495 3068 +4496 306A +4497 306B +4498 306C +4499 306D +449A 306E +449D 306F +449E 3072 +449F 3075 +44A2 3078 +44A3 307B +44A4 307E +44A5 307F +44A6 3080 +44A7 3081 +44A8 3082 +44A9 3084 +44AA 3086 +44AC 3088 +44AD 3089 +44AE 308A +44AF 308B +44BA 308C +44BB 308D +44BC 308F +44BD 3093 +44C0 304C +44C1 304E +44C2 3050 +44C3 3052 +44C4 3054 +44C5 3056 +44C6 3058 +44C7 305A +44C8 305C +44C9 305E +44CA 3060 +44CB 3062 +44CC 3065 +44CD 3067 +44CE 3069 +44CF 3070 +44D0 3073 +44D1 3076 +44D2 3079 +44D3 307C +44D5 3071 +44D6 3074 +44D7 3077 +44D8 307A +44D9 307D +44DA 3090 +44DB 3091 +44DC 309D +44DD 309E +44E0 25CB +44E1 25CF +44E2 25B3 +44E3 25B2 +44E4 25CE +44E5 2606 +44E6 2605 +44E7 25C7 +44E8 25C6 +44E9 25A1 +44EA 25A0 +44EB 25BD +44EC 25BC +44ED 00B0 +44EE 2032 +44EF 2033 +44F0 2192 +44F1 2190 +44F2 2191 +44F3 2193 +4541 4E00 +4542 4E8C +4543 4E09 +4544 56DB +4545 4E94 +4546 516D +4547 4E03 +4548 516B +4549 4E5D +454A 5341 +454B 767E +454C 5343 +454D 4E07 +454E 5104 +454F 90FD +4550 9053 +4551 5E9C +4552 770C +4553 5E02 +4554 533A +4555 753A +4556 6751 +4557 6771 +4558 897F +4559 5357 +455A 5317 +455B 5927 +455C 4E2D +455D 5C0F +455E 4E0A +455F 4E0B +4560 5E74 +4561 6708 +4562 65E5 +4563 7530 +4564 5B50 +4565 5C71 +4566 672C +4567 5DDD +4568 85E4 +4569 91CE +456A 5DE5 +456B 696D +456C 6728 +456D 4E95 +456E 90CE +456F 5CF6 +4570 96C4 +4571 9AD8 +4572 5CA1 +4573 592B +4574 539F +4575 4EAC +4576 4F50 +4577 6B63 +4578 677E +4579 6A5F +457A 548C +457B 88FD +457C 7537 +457D 7F8E +457E 5409 +457F 5D0E +4580 77F3 +4581 8C37 +4582 96FB +4583 9577 +4584 6CBB +4585 6CA2 +4586 91D1 +4587 65B0 +4588 53E3 +4589 6A4B +458A 4E45 +458B 798F +458C 6240 +458D 5E73 +458E 5185 +458F 56FD +4590 5316 +4591 962A +4592 5BAE +4593 4EBA +4594 4F5C +4595 90E8 +4596 6E05 +4597 6B21 +4598 7FA9 +4599 751F +459A 4EE3 +459B 51FA +459C 6C34 +459D 68EE +459E 5149 +459F 52A0 +45A0 5408 +45A1 795E +45A2 6797 +45A3 91CD +45A4 884C +45A5 4FE1 +45A6 660E +45A7 6D77 +45A8 5B89 +45A9 5E78 +45AA 4FDD +45AB 592A +45AC 5BCC +45AD 6C5F +45AE 9234 +45AF 524D +45B0 77E5 +45B1 6B66 +45B2 4F0A +45B3 662D +45B4 5206 +45B5 52DD +45B6 7528 +45B7 5E83 +45B8 9020 +45B9 6C17 +45BA 6210 +45BB 898B +45BC 5229 +45BD 4F1A +45BE 5B66 +45BF 5CA9 +45C0 7523 +45C1 9593 +45C2 5730 +45C3 81EA +45C4 826F +45C5 95A2 +45C6 611B +45C7 653F +45C8 5C3E +45C9 8A08 +45CA 6587 +45CB 624B +45CC 7236 +45CD 65B9 +45CE 4E8B +45CF 6238 +45D0 54C1 +45D1 559C +45D2 6E21 +45D3 5F18 +45D4 53E4 +45D5 8FBA +45D6 5009 +45D7 9244 +45D8 4E4B +45D9 5834 +45DA 6D0B +45DB 57CE +45DC 6D25 +45DD 7ACB +45DE 5EA6 +45DF 5348 +45E0 4ECA +45E1 5F66 +45E2 8A2D +45E3 901A +45E4 52D5 +45E5 5F8C +45E6 5948 +45E7 5B9A +45E8 6C60 +45E9 5C4B +45EA 6D5C +45EB 7406 +45EC 5742 +45ED 5B9F +45EE 82F1 +45EF 7684 +45F0 53F8 +45F1 79C0 +45F2 6A2A +45F3 540D +45F4 5B5D +45F5 7AF9 +45F6 535A +45F7 529B +45F8 5EAB +45F9 8449 +45FA 6804 +45FB 6C38 +45FC 5668 +45FD 7389 +45FE 591A +4641 8CC0 +4642 771F +4643 6075 +4644 9759 +4645 5186 +4646 8302 +4647 654F +4648 8C4A +4649 5175 +464A 6CD5 +464B 767A +464C 9752 +464D 5897 +464E 6599 +464F 5FE0 +4650 8CC7 +4651 6642 +4652 7269 +4653 8ECA +4654 5FB3 +4655 8981 +4656 5BFE +4657 585A +4658 79CB +4659 767D +465A 6CB3 +465B 702C +465C 6CB9 +465D 9686 +465E 8535 +465F 5F53 +4660 4FCA +4661 5FD7 +4662 6625 +4663 793E +4664 99AC +4665 5165 +4666 5EFA +4667 6839 +4668 6749 +4669 9032 +466A 8208 +466B 6D66 +466C 7CBE +466D 540C +466E 6027 +466F 7C73 +4670 8005 +4671 52A9 +4672 679D +4673 8FD1 +4674 76F4 +4675 76EE +4676 6765 +4677 753B +4678 76F8 +4679 9ED2 +467A 4E38 +467B 8239 +467C 7531 +467D 58EB +467E 7B2C +467F 718A +4680 7D19 +4681 5065 +4682 68B0 +4683 82B3 +4684 571F +4685 6709 +4686 5BB6 +4687 7DDA +4688 7D4C +4689 8ABF +468A 5929 +468B 671F +468C 7F6E +468D 6D45 +468E 6589 +468F 5F0F +4690 5F62 +4691 9762 +4692 7A2E +4693 8F38 +4694 5916 +4695 5143 +4696 4F53 +4697 9E7F +4698 5FA1 +4699 5973 +469A 5EB7 +469B 4E16 +469C 52C7 +469D 5800 +469E 597D +469F 5150 +46A0 5BFA +46A1 92FC +46A2 7279 +46A3 57FC +46A4 9054 +46A5 5411 +46A6 53D6 +46A7 7B49 +46A8 667A +46A9 56DE +46AA 9580 +46AB 904B +46AC 5099 +46AD 601D +46AE 963F +46AF 4E0D +46B0 9808 +46B1 5168 +46B2 5BFF +46B3 5584 +46B4 677F +46B5 98EF +46B6 8C9E +46B7 73FE +46B8 98DF +46B9 7D44 +46BA 985E +46BB 516C +46BC 6750 +46BD 9999 +46BE 5546 +46BF 7D50 +46C0 8868 +46C1 77E2 +46C2 6F5F +46C3 79C1 +46C4 5236 +46C5 90A6 +46C6 6CBC +46C7 7CF8 +46C8 5B8F +46C9 7B56 +46CA 6CE2 +46CB 54E1 +46CC 6570 +46CD 958B +46CE 6E96 +46CF 6A39 +46D0 8CBB +46D1 660C +46D2 5F37 +46D3 7814 +46D4 53CB +46D5 5B87 +46D6 82E5 +46D7 83CA +46D8 6301 +46D9 82B1 +46DA 5F15 +46DB 7D00 +46DC 8352 +46DD 5225 +46DE 4FEE +46DF 8D8A +46E0 4F4F +46E1 85AC +46E2 6BDB +46E3 9060 +46E4 554F +46E5 5965 +46E6 578B +46E7 5FC3 +46E8 767B +46E9 65E9 +46EA 67F3 +46EB 6D69 +46EC 8CEA +46ED 52D9 +46EE 6CC9 +46EF 5E38 +46F0 5B88 +46F1 57FA +46F2 7BA1 +46F3 6CF0 +46F4 4F38 +46F5 6700 +46F6 4EE5 +46F7 6B4C +46F8 88D5 +46F9 8D64 +46FA 8DB3 +46FB 898F +46FC 6D41 +46FD 8AA0 +46FE 6607 +4741 5DDE +4742 7167 +4743 5869 +4744 9001 +4745 96C5 +4746 672B +4747 54F2 +4748 5CB8 +4749 4E5F +474A 5C90 +474B 521D +474C 8328 +474D 5247 +474E 6BD4 +474F 80FD +4750 8A71 +4751 6295 +4752 8EE2 +4753 83C5 +4754 9023 +4755 4ED6 +4756 6C11 +4757 7D66 +4758 9152 +4759 7E41 +475A 4FA1 +475B 6E80 +475C 671D +475D 4ED8 +475E 6761 +475F 7121 +4760 8003 +4761 697D +4762 4E3B +4763 610F +4764 6226 +4765 5207 +4766 5264 +4767 7247 +4768 7D30 +4769 6E08 +476A 7A32 +476B 5E03 +476C 91CC +476D 5C5E +476E 7AE0 +476F 5909 +4770 4F55 +4771 685C +4772 5F7C +4773 67FB +4774 76CA +4775 58F2 +4776 4EC1 +4777 6DF1 +4778 53F0 +4779 9CE5 +477A 9DB4 +477B 652F +477C 6574 +477D 89D2 +477E 5609 +477F 5473 +4780 885B +4781 8B70 +4782 5727 +4783 7387 +4784 8DEF +4785 706B +4786 961C +4787 8F1D +4788 70B9 +4789 4E0E +478A 6E1B +478B 7551 +478C 9280 +478D 7A7A +478E 4EA4 +478F 7FBD +4790 534A +4791 53CE +4792 592E +4793 7DCF +4794 8A18 +4795 6674 +4796 69CB +4797 969B +4798 6885 +4799 5370 +479A 8A00 +479B 6817 +479C 8EAB +479D 66F8 +479E 514B +479F 7D20 +47A0 96C6 +47A1 7BC0 +47A2 5148 +47A3 6EDD +47A4 6C7A +47A5 6559 +47A6 7D14 +47A7 67F4 +47A8 63A5 +47A9 661F +47AA 7740 +47AB 7559 +47AC 6620 +47AD 5DF1 +47AE 754C +47AF 5177 +47B0 656C +47B1 7FA4 +47B2 9806 +47B3 5171 +47B4 6D3B +47B5 91CF +47B6 6307 +47B7 89E3 +47B8 5BA4 +47B9 679C +47BA 5404 +47BB 671B +47BC 9632 +47BD 7D04 +47BE 61B2 +47BF 967D +47C0 4E80 +47C1 56F3 +47C2 4E88 +47C3 8272 +47C4 7A0E +47C5 690D +47C6 53EF +47C7 6052 +47C8 4F4D +47C9 5178 +47CA 5FC5 +47CB 7D9A +47CC 6025 +47CD 5728 +47CE 57A3 +47CF 541B +47D0 5EF6 +47D1 5D8B +47D2 4F01 +47D3 6803 +47D4 670D +47D5 71B1 +47D6 5272 +47D7 5354 +47D8 6B69 +47D9 53F2 +47DA 512A +47DB 658E +47DC 623F +47DD 5B97 +47DE 683C +47DF 8FB0 +47E0 7B20 +47E1 5712 +47E2 8AF8 +47E3 8107 +47E4 5553 +47E5 8CE2 +47E6 5F25 +47E7 98A8 +47E8 5F97 +47E9 6613 +47EA 6253 +47EB 982D +47EC 65ED +47ED 6BB5 +47EE 52E2 +47EF 7136 +47F0 56E3 +47F1 984D +47F2 843D +47F3 914D +47F4 7A0B +47F5 8FBB +47F6 543E +47F7 611F +47F8 5BDB +47F9 53CD +47FA 7A14 +47FB 9700 +47FC 6E90 +47FD 6C96 +47FE 984C +4841 8FBC +4842 8349 +4843 7B97 +4844 76DB +4845 8FB2 +4846 90A3 +4847 7701 +4848 69D8 +4849 6BBF +484A 5C11 +484B 4ECB +484C 53D7 +484D 97F3 +484E 7DE8 +484F 59D4 +4850 5E84 +4851 4FC2 +4852 72B6 +4853 793A +4854 5E97 +4855 5A9B +4856 682A +4857 6ECB +4858 68A8 +4859 7E04 +485A 53F3 +485B 5DE6 +485C 53CA +485D 9078 +485E 5C45 +485F 60C5 +4860 7DF4 +4861 70AD +4862 9928 +4863 9271 +4864 6A21 +4865 6B8A +4866 7E3E +4867 4E9C +4868 7E4A +4869 4EF2 +486A 5857 +486B 6D88 +486C 8853 +486D 691C +486E 6717 +486F 5B85 +4870 529F +4871 5C1A +4872 8CBF +4873 60A6 +4874 8102 +4875 7BE0 +4876 4F73 +4877 7D21 +4878 51A8 +4879 6851 +487A 78BA +487B 7267 +487C 4E26 +487D 5024 +487E 89B3 +487F 8CB4 +4880 7DAD +4881 7D71 +4882 5BBF +4883 4E21 +4884 7CD6 +4885 89AA +4886 9332 +4887 6F84 +4888 65BD +4889 5BB9 +488A 98DB +488B 5C40 +488C 7950 +488D 904E +488E 6C0F +488F 6539 +4890 76E4 +4891 7A4D +4892 6E0B +4893 5DFB +4894 6DF3 +4895 5FDC +4896 4E89 +4897 8ECD +4898 88C5 +4899 9178 +489A 7E54 +489B 67D3 +489C 5E1D +489D 7DBF +489E 7C89 +489F 822A +48A0 7532 +48A1 5468 +48A2 4ED9 +48A3 5F85 +48A4 4F4E +48A5 7DD1 +48A6 8EFD +48A7 9EBB +48A8 6176 +48A9 52B4 +48AA 78EF +48AB 4E39 +48AC 80B2 +48AD 9650 +48AE 5C0E +48AF 653E +48B0 6643 +48B1 5EA7 +48B2 4EF6 +48B3 60F3 +48B4 9A13 +48B5 4ED5 +48B6 4F7F +48B7 8F2A +48B8 9854 +48B9 756A +48BA 5F35 +48BB 805E +48BC 4F9B +48BD 6E6F +48BE 6EB6 +48BF 6821 +48C0 9285 +48C1 92F3 +48C2 878D +48C3 9756 +48C4 5199 +48C5 5B8C +48C6 6E2F +48C7 935B +48C8 591C +48C9 5145 +48CA 9F8D +48CB 7DB1 +48CC 83F1 +48CD 901F +48CE 52C9 +48CF 5237 +48D0 8D77 +48D1 6469 +48D2 53C2 +48D3 55B6 +48D4 7A42 +48D5 63A8 +48D6 8FD4 +48D7 8077 +48D8 6B62 +48D9 4F1D +48DA 5E79 +48DB 7403 +48DC 6A29 +48DD 5C55 +48DE 5E61 +48DF 845B +48E0 5EAD +48E1 975E +48E2 53F7 +48E3 5358 +48E4 6B73 +48E5 62E1 +48E6 51E6 +48E7 8A9E +48E8 6628 +48E9 57DF +48EA 6DF5 +48EB 518D +48EC 50CD +48ED 79D1 +48EE 9B5A +48EF 7AEF +48F0 9014 +48F1 6848 +48F2 5B57 +48F3 8AD6 +48F4 517C +48F5 53C8 +48F6 632F +48F7 6280 +48F8 5FB9 +48F9 672D +48FA 7CFB +48FB 5F93 +48FC 51B7 +48FD 614B +48FE 5CF0 +4941 5931 +4942 539A +4943 5074 +4944 6CE8 +4945 6E2C +4946 9803 +4947 4E57 +4948 8A66 +4949 576A +494A 8429 +494B 515A +494C 6C7D +494D 5B9D +494E 606D +494F 6A0B +4950 6E29 +4951 6577 +4952 8AAC +4953 82B8 +4954 544A +4955 6B74 +4956 822C +4957 98FE +4958 793C +4959 5C06 +495A 96E3 +495B 7802 +495C 5224 +495D 5F79 +495E 5F71 +495F 66FD +4960 5E2F +4961 9678 +4962 938C +4963 8AC7 +4964 5F70 +4965 60AA +4966 6A19 +4967 7533 +4968 5BB3 +4969 6BCD +496A 88DC +496B 5E4C +496C 58F0 +496D 9664 +496E 7B39 +496F 5A66 +4970 4E7E +4971 7AF6 +4972 829D +4973 725B +4974 8CB7 +4975 79FB +4976 785D +4977 8336 +4978 52B9 +4979 990A +497A 52F2 +497B 80A5 +497C 8B19 +497D 7089 +497E 590F +497F 5802 +4980 67CF +4981 6255 +4982 5E30 +4983 713C +4984 786B +4985 8001 +4986 7A76 +4987 5BE9 +4988 91DD +4989 65AD +498A 5C04 +498B 5DEE +498C 5D50 +498D 6298 +498E 8010 +498F 5BA3 +4990 59CB +4991 5F8B +4992 6B8B +4993 666F +4994 8C61 +4995 90F7 +4996 5353 +4997 96E2 +4998 85AB +4999 6B7B +499A 8015 +499B 64CD +499C 4EAE +499D 4E91 +499E 90E1 +499F 52E4 +49A0 6C42 +49A1 8CAB +49A2 5B98 +49A3 59BB +49A4 88CF +49A5 773C +49A6 4F2F +49A7 7AAF +49A8 7BC9 +49A9 968E +49AA 63DB +49AB 6842 +49AC 99C5 +49AD 68B6 +49AE 5747 +49AF 8CA1 +49B0 547D +49B1 738B +49B2 84B2 +49B3 90C1 +49B4 78E8 +49B5 7B11 +49B6 66F2 +49B7 6975 +49B8 5831 +49B9 63D0 +49BA 8A3C +49BB 96EA +49BC 9055 +49BD 88C1 +49BE 9996 +49BF 75C5 +49C0 6850 +49C1 4F59 +49C2 74E6 +49C3 4EE4 +49C4 5439 +49C5 732A +49C6 672A +49C7 525B +49C8 8CA0 +49C9 4F34 +49CA 5100 +49CB 542B +49CC 9069 +49CD 8FC4 +49CE 5C3B +49CF 5DCC +49D0 7B54 +49D1 8FFD +49D2 8A0E +49D3 4E08 +49D4 925B +49D5 71C3 +49D6 8AB2 +49D7 70BA +49D8 9662 +49D9 679A +49DA 76AE +49DB 8B77 +49DC 7DBE +49DD 96E8 +49DE 6211 +49DF 5BC4 +49E0 837B +49E1 62BC +49E2 7D0D +49E3 76E3 +49E4 7E2B +49E5 964D +49E6 572D +49E7 7ADC +49E8 7BC4 +49E9 6BBA +49EA 8C9D +49EB 698E +49EC 9047 +49ED 6F14 +49EE 5360 +49EF 8FEB +49F0 5287 +49F1 624D +49F2 6566 +49F3 7D1A +49F4 7D42 +49F5 6BCE +49F6 7D79 +49F7 7E2E +49F8 666E +49F9 7965 +49FA 500B +49FB 5C02 +49FC 99D2 +49FD 8A55 +49FE 7560 +4A41 5B58 +4A42 8089 +4A43 50BE +4A44 5E2B +4A45 6DB2 +4A46 4F8B +4A47 81E3 +4A48 81F3 +4A49 56E0 +4A4A 7D99 +4A4B 5DF2 +4A4C 899A +4A4D 6E9D +4A4E 6D17 +4A4F 8AAD +4A50 8996 +4A51 731B +4A52 5DE8 +4A53 7DB2 +4A54 888B +4A55 4EFB +4A56 5BC6 +4A57 8896 +4A58 6CC1 +4A59 8457 +4A5A 8F03 +4A5B 6BC5 +4A5C 97FF +4A5D 8CA9 +4A5E 5E45 +4A5F 82E6 +4A60 63AA +4A61 5F81 +4A62 78C1 +4A63 821E +4A64 52AA +4A65 7AAA +4A66 5999 +4A67 6297 +4A68 8F14 +4A69 7FD2 +4A6A 4FC3 +4A6B 54C9 +4A6C 967A +4A6D 66F4 +4A6E 8B1B +4A6F 5E72 +4A70 5FA9 +4A71 8A2A +4A72 6D3E +4A73 7763 +4A74 6483 +4A75 8B58 +4A76 614E +4A77 5A5A +4A78 8D85 +4A79 71D0 +4A7A 983C +4A7B 72E9 +4A7C 583A +4A7D 5DFE +4A7E 8A8D +4A7F 67C4 +4A80 7DE0 +4A81 4F11 +4A82 77ED +4A83 4F0F +4A84 5BC5 +4A85 629C +4A86 5C3C +4A87 533B +4A88 6DC0 +4A89 81FC +4A8A 96D1 +4A8B 904A +4A8C 6D6E +4A8D 93E1 +4A8E 5C64 +4A8F 98FC +4A90 524A +4A91 6DFB +4A92 8584 +4A93 968A +4A94 56FA +4A95 5883 +4A96 7766 +4A97 9805 +4A98 4E73 +4A99 8C46 +4A9A 8A31 +4A9B 7DD2 +4A9C 8FF0 +4A9D 6D6A +4A9E 4F9D +4A9F 6B6F +4AA0 6B27 +4AA1 62C5 +4AA2 511F +4AA3 9769 +4AA4 5374 +4AA5 9AA8 +4AA6 6775 +4AA7 887F +4AA8 5305 +4AA9 7570 +4AAA 8D70 +4AAB 864E +4AAC 5CEF +4AAD 8CDE +4AAE 5FF5 +4AAF 725F +4AB0 7686 +4AB1 609F +4AB2 80CC +4AB3 59EB +4AB4 8131 +4AB5 5E0C +4AB6 8A17 +4AB7 9676 +4AB8 82D7 +4AB9 74B0 +4ABA 84B8 +4ABB 50D5 +4ABC 96F2 +4ABD 7248 +4ABE 7834 +4ABF 6DD1 +4AC0 6E09 +4AC1 67FF +4AC2 6F54 +4AC3 5915 +4AC4 500D +4AC5 72AC +4AC6 9EC4 +4AC7 7B46 +4AC8 9B3C +4AC9 6563 +4ACA 53BB +4ACB 8A98 +4ACC 91DC +4ACD 9818 +4ACE 6FC3 +4ACF 65C5 +4AD0 501F +4AD1 7F8A +4AD2 6F64 +4AD3 9031 +4AD4 5F3E +4AD5 63F4 +4AD6 9038 +4AD7 8B66 +4AD8 7BE4 +4AD9 7206 +4ADA 6843 +4ADB 72EC +4ADC 65CF +4ADD 82A6 +4ADE 5BA2 +4ADF 6960 +4AE0 9EA6 +4AE1 52DF +4AE2 6790 +4AE3 639B +4AE4 7D75 +4AE5 9855 +4AE6 5DF3 +4AE7 5805 +4AE8 8ACB +4AE9 95A3 +4AEA 8863 +4AEB 8CA8 +4AEC 5B63 +4AED 5E8A +4AEE 5449 +4AEF 786C +4AF0 7D2B +4AF1 8CA2 +4AF2 5352 +4AF3 7D76 +4AF4 8CB8 +4AF5 7070 +4AF6 547C +4AF7 6545 +4AF8 6676 +4AF9 73B2 +4AFA 56F2 +4AFB 7BB1 +4AFC 58A8 +4AFD 7A81 +4AFE 66AE +4B41 8087 +4B42 59FF +4B43 8840 +4B44 56F0 +4B45 7B51 +4B46 6DF7 +4B47 5F01 +4B48 934B +4B49 9000 +4B4A 4FE3 +4B4B 675F +4B4C 4FBF +4B4D 8CC3 +4B4E 526F +4B4F 63A1 +4B50 5442 +4B51 8907 +4B52 698A +4B53 5E2D +4B54 5A18 +4B55 7518 +4B56 514D +4B57 5E7E +4B58 50B5 +4B59 5BDD +4B5A 68D2 +4B5B 745E +4B5C 69FB +4B5D 5FAE +4B5E 55E3 +4B5F 8A70 +4B60 5BF8 +4B61 5824 +4B62 8358 +4B63 5F13 +4B64 5E95 +4B65 706F +4B66 751A +4B67 7D05 +4B68 60E3 +4B69 7E70 +4B6A 5012 +4B6B 5238 +4B6C 83EF +4B6D 5373 +4B6E 5F31 +4B6F 6A2B +4B70 9CF4 +4B71 53CC +4B72 6D32 +4B73 4EAB +4B74 4E92 +4B75 842C +4B76 8A8C +4B77 65E2 +4B78 6F01 +4B79 80A9 +4B7A 9DF9 +4B7B 8B72 +4B7C 7B52 +4B7D 9589 +4B7E 6D74 +4B7F 63A2 +4B80 6590 +4B81 5BD2 +4B82 6319 +4B83 8AB0 +4B84 76DF +4B85 99A8 +4B86 7A74 +4B87 8236 +4B88 8846 +4B89 8061 +4B8A 6557 +4B8B 5922 +4B8C 9644 +4B8D 88AB +4B8E 9326 +4B8F 7B4B +4B90 62B5 +4B91 5371 +4B92 5E81 +4B93 5BDF +4B94 4F75 +4B95 58C1 +4B96 7058 +4B97 7DCA +4B98 5438 +4B99 73E0 +4B9A 52D8 +4B9B 5208 +4B9C 78D0 +4B9D 6B23 +4B9E 6838 +4B9F 4E43 +4BA0 690E +4BA1 8377 +4BA2 6ED1 +4BA3 98F2 +4BA4 8170 +4BA5 8857 +4BA6 8EF8 +4BA7 798E +4BA8 83DC +4BA9 8FCE +4BAA 7E01 +4BAB 5510 +4BAC 4EA8 +4BAD 8A33 +4BAE 9162 +4BAF 5EFB +4BB0 606F +4BB1 4E86 +4BB2 664B +4BB3 6368 +4BB4 5217 +4BB5 8056 +4BB6 51FD +4BB7 7642 +4BB8 821F +4BB9 9685 +4BBA 50CF +4BBB 662F +4BBC 4F3C +4BBD 4E59 +4BBE 6A3D +4BBF 4E71 +4BC0 523A +4BC1 8ACF +4BC2 6A58 +4BC3 66FF +4BC4 670B +4BC5 653B +4BC6 9732 +4BC7 5EC3 +4BC8 8A13 +4BC9 5782 +4BCA 604B +4BCB 866B +4BCC 95D8 +4BCD 60A9 +4BCE 4E01 +4BCF 63CF +4BD0 6FC0 +4BD1 659C +4BD2 8CAC +4BD3 8305 +4BD4 7CA7 +4BD5 6050 +4BD6 96F7 +4BD7 5FCD +4BD8 640D +4BD9 5B54 +4BDA 900F +4BDB 62D3 +4BDC 59B9 +4BDD 7159 +4BDE 51AC +4BDF 79F0 +4BE0 552F +4BE1 5275 +4BE2 6697 +4BE3 80F8 +4BE4 4E98 +4BE5 4ECF +4BE6 51CD +4BE7 9D5C +4BE8 5144 +4BE9 7A93 +4BEA 67F1 +4BEB 5841 +4BEC 7C21 +4BED 8861 +4BEE 5C31 +4BEF 68DA +4BF0 91E7 +4BF1 9DF2 +4BF2 63EE +4BF3 6575 +4BF4 84EE +4BF5 523B +4BF6 6B32 +4BF7 7C98 +4BF8 5982 +4BF9 969C +4BFA 8987 +4BFB 7C9F +4BFC 9006 +4BFD 62DB +4BFE 66DC +4C41 6355 +4C42 6982 +4C43 50AC +4C44 623B +4C45 5FD8 +4C46 63DA +4C47 75DB +4C48 627F +4C49 616E +4C4A 8266 +4C4B 7C95 +4C4C 716E +4C4D 96C7 +4C4E 7F6A +4C4F 5426 +4C50 5200 +4C51 83D3 +4C52 5211 +4C53 594F +4C54 9D28 +4C55 574A +4C56 66C7 +4C57 9858 +4C58 820E +4C59 6614 +4C5A 733F +4C5B 50B7 +4C5C 6551 +4C5D 5EB8 +4C5E 5B6B +4C5F 55AC +4C60 5FEB +4C61 6388 +4C62 8CAF +4C63 676F +4C64 5951 +4C65 5A01 +4C66 71E5 +4C67 5DE3 +4C68 8C6A +4C69 6271 +4C6A 81F4 +4C6B 5C3A +4C6C 5F92 +4C6D 9045 +4C6E 7384 +4C6F 7149 +4C70 79D8 +4C71 796D +4C72 9003 +4C73 83CC +4C74 5FB4 +4C75 5B8D +4C76 6279 +4C77 64AE +4C78 7D18 +4C79 723E +4C7A 5BEE +4C7B 65E7 +4C7C 8D08 +4C7D 9E78 +4C7E 52E7 +4C7F 5D07 +4C80 9F62 +4C81 6069 +4C82 536F +4C83 6681 +4C84 9663 +4C85 5E3D +4C86 62B1 +4C87 722A +4C88 6E4A +4C89 93AE +4C8A 79E6 +4C8B 53E5 +4C8C 809D +4C8D 88FE +4C8E 53B3 +4C8F 6C88 +4C90 6E7F +4C91 5141 +4C92 9091 +4C93 6F6E +4C94 84C4 +4C95 85EA +4C96 8129 +4C97 6BD2 +4C98 663C +4C99 7F72 +4C9A 73C2 +4C9B 5F1F +4C9C 790E +4C9D 60B2 +4C9E 72ED +4C9F 58EE +4CA0 8179 +4CA1 8E8D +4CA2 5C65 +4CA3 5DE7 +4CA4 6C37 +4CA5 6DE1 +4CA6 862D +4CA7 72AF +4CA8 8E0A +4CA9 7C92 +4CAA 8218 +4CAB 8033 +4CAC 63A7 +4CAD 9291 +4CAE 5019 +4CAF 8155 +4CB0 8A69 +4CB1 8EDF +4CB2 66B4 +4CB3 8133 +4CB4 7591 +4CB5 6B20 +4CB6 6669 +4CB7 90F5 +4CB8 4E32 +4CB9 73EA +4CBA 693F +4CBB 7687 +4CBC 707D +4CBD 7D3A +4CBE 6148 +4CBF 8607 +4CC0 99FF +4CC1 59C9 +4CC2 7832 +4CC3 7815 +4CC4 907F +4CC5 80A1 +4CC6 5C3F +4CC7 66A2 +4CC8 9418 +4CC9 6D44 +4CCA 5E55 +4CCB 5854 +4CCC 7B95 +4CCD 8DE1 +4CCE 4EA1 +4CCF 8C5A +4CD0 81E8 +4CD1 89E6 +4CD2 9670 +4CD3 5263 +4CD4 74F6 +4CD5 9A5A +4CD6 6012 +4CD7 520A +4CD8 7434 +4CD9 9801 +4CDA 907A +4CDB 5504 +4CDC 7956 +4CDD 5230 +4CDE 54B2 +4CDF 8A34 +4CE0 96A3 +4CE1 4FF3 +4CE2 9283 +4CE3 91E3 +4CE4 7D39 +4CE5 9688 +4CE6 4F51 +4CE7 7D61 +4CE8 5DBA +4CE9 9BAE +4CEA 5F80 +4CEB 795D +4CEC 8597 +4CED 8DA3 +4CEE 7C60 +4CEF 5C0A +4CF0 7565 +4CF1 85A9 +4CF2 63D6 +4CF3 9E97 +4CF4 7D22 +4CF5 5375 +4CF6 9AEA +4CF7 9042 +4CF8 6B3D +4CF9 7D0B +4CFA 6392 +4CFB 80AA +4CFC 7DE9 +4CFD 9F3B +4CFE 99C6 +4D41 6D78 +4D42 6731 +4D43 5531 +4D44 6398 +4D45 7825 +4D46 5CB3 +4D47 5DE1 +4D48 92AD +4D49 98FD +4D4A 9810 +4D4B 6CE3 +4D4C 6B64 +4D4D 5321 +4D4E 6B53 +4D4F 5E8F +4D50 7AE5 +4D51 502B +4D52 6E56 +4D53 62BD +4D54 8276 +4D55 6A9C +4D56 4E18 +4D57 57F7 +4D58 752B +4D59 7C97 +4D5A 82EB +4D5B 9802 +4D5C 811A +4D5D 73CD +4D5E 8F9B +4D5F 5C0B +4D60 63E1 +4D61 7372 +4D62 8150 +4D63 80E1 +4D64 5B99 +4D65 76D7 +4D66 6291 +4D67 65EC +4D68 8A3A +4D69 5947 +4D6A 65E8 +4D6B 6E7E +4D6C 6696 +4D6D 55AB +4D6E 8F09 +4D6F 92ED +4D70 9396 +4D71 4EEE +4D72 755C +4D73 6F38 +4D74 8F9E +4D75 7981 +4D76 5C01 +4D77 62E0 +4D78 9BE8 +4D79 91C8 +4D7A 6276 +4D7B 65CB +4D7C 8E0F +4D7D 8B21 +4D7E 699B +4D7F 6216 +4D80 5A92 +4D81 90B8 +4D82 50DA +4D83 79DF +4D84 6C41 +4D85 5270 +4D86 9175 +4D87 8B39 +4D88 685D +4D89 5875 +4D8A 819C +4D8B 5B9C +4D8C 8A89 +4D8D 8A72 +4D8E 9D8F +4D8F 6377 +4D90 5974 +4D91 8AA4 +4D92 52B1 +4D93 6962 +4D94 5C48 +4D95 9CE9 +4D96 673A +4D97 75B2 +4D98 6D1E +4D99 4F0D +4D9A 7E6D +4D9B 7B48 +4D9C 7FCC +4D9D 65E6 +4D9E 59A5 +4D9F 79E9 +4DA0 6212 +4DA1 6EDE +4DA2 770B +4DA3 8CA7 +4DA4 65BC +4DA5 885D +4DA6 6ADB +4DA7 5C4A +4DA8 8074 +4DA9 9084 +4DAA 8ECC +4DAB 65D7 +4DAC 57F9 +4DAD 708E +4DAE 6F06 +4DAF 5E7C +4DB0 77AC +4DB1 4FF5 +4DB2 5949 +4DB3 81ED +4DB4 9B45 +4DB5 7FFC +4DB6 8178 +4DB7 69FD +4DB8 6CCA +4DB9 69C7 +4DBA 79D2 +4DBB 8B1D +4DBC 9ED9 +4DBD 81D3 +4DBE 7A3C +4DBF 7968 +4DC0 6F5C +4DC1 63B2 +4DC2 8DDD +4DC3 6383 +4DC4 6E9C +4DC5 5E33 +4DC6 61F8 +4DC7 76BF +4DC8 642C +4DC9 7DB4 +4DCA 6247 +4DCB 6458 +4DCC 6816 +4DCD 5F69 +4DCE 9022 +4DCF 7A1A +4DD0 82B9 +4DD1 70C8 +4DD2 9A12 +4DD3 6163 +4DD4 6FEF +4DD5 53EB +4DD6 9D3B +4DD7 62FE +4DD8 60A0 +4DD9 9591 +4DDA 6D99 +4DDB 6162 +4DDC 9298 +4DDD 635C +4DDE 9707 +4DDF 8972 +4DE0 683D +4DE1 51E1 +4DE2 9B54 +4DE3 608C +4DE4 5B22 +4DE5 99C4 +4DE6 7126 +4DE7 8A73 +4DE8 971C +4DE9 7396 +4DEA 67D4 +4DEB 60A3 +4DEC 4E11 +4DED 4EF0 +4DEE 8CDB +4DEF 8CB0 +4DF0 7912 +4DF1 9774 +4DF2 8986 +4DF3 5146 +4DF4 57DC +4DF5 99D0 +4DF6 80C3 +4DF7 8338 +4DF8 78A7 +4DF9 86CD +4DFA 7F85 +4DFB 5049 +4DFC 8247 +4DFD 690B +4DFE 7C4D +4E41 53EA +4E42 5F26 +4E43 6E25 +4E44 6881 +4E45 9375 +4E46 5DFD +4E47 5347 +4E48 9727 +4E49 643A +4E4A 75C7 +4E4B 6FA4 +4E4C 73A9 +4E4D 77E9 +4E4E 9451 +4E4F 8B5C +4E50 808C +4E51 674E +4E52 4EAD +4E53 582F +4E54 7573 +4E55 8ED2 +4E56 6CE5 +4E57 9320 +4E58 8FF7 +4E59 7D33 +4E5A 72C2 +4E5B 8217 +4E5C 7422 +4E5D 82C5 +4E5E 9A30 +4E5F 773A +4E60 5F84 +4E61 9673 +4E62 64AD +4E63 920D +4E64 74DC +4E65 60C7 +4E66 86ED +4E67 4FFA +4E68 52A3 +4E69 6A3A +4E6A 7720 +4E6B 5320 +4E6C 61B6 +4E6D 5674 +4E6E 8776 +4E6F 6CBF +4E70 505C +4E71 602A +4E72 8466 +4E73 6B96 +4E74 6DBC +4E75 97D3 +4E76 968F +4E77 6876 +4E78 60D1 +4E79 5378 +4E7A 64A4 +4E7B 51A0 +4E7C 9154 +4E7D 5DF4 +4E7E 629E +4E7F 5E63 +4E80 929A +4E81 7693 +4E82 6C5A +4E83 6597 +4E84 50E7 +4E85 7C82 +4E86 5F6B +4E87 6CE1 +4E88 5F6C +4E89 5AC1 +4E8A 6F2C +4E8B 852D +4E8C 6442 +4E8D 5750 +4E8E 58C7 +4E8F 8CFC +4E90 8A5E +4E91 7A7F +4E92 689D +4E93 7E26 +4E94 7A40 +4E95 7344 +4E96 8AEB +4E97 4FD7 +4E98 7A63 +4E99 8036 +4E9A 7DEF +4E9B 80C6 +4E9C 8AED +4E9D 731F +4E9E 8FEA +4E9F 4F0E +4EA0 758B +4EA1 518A +4EA2 6734 +4EA3 5FD9 +4EA4 61C7 +4EA5 65AF +4EA6 9CF3 +4EA7 5ECA +4EA8 9262 +4EA9 68DF +4EAA 6CB8 +4EAB 80F4 +4EAC 57CB +4EAD 6C99 +4EAE 96A0 +4EAF 5B64 +4EB0 58F1 +4EB1 68C4 +4EB2 5410 +4EB3 982C +4EB4 8A87 +4EB5 4E5E +4EB6 6167 +4EB7 9BAB +4EB8 90AA +4EB9 55B0 +4EBA 82BD +4EBB 596A +4EBC 66F3 +4EBD 8299 +4EBE 5893 +4EBF 719F +4EC0 6284 +4EC1 67D1 +4EC2 9063 +4EC3 5ACC +4EC4 6C57 +4EC5 7CE7 +4EC6 5851 +4EC7 64B2 +4EC8 58CA +4EC9 830E +4ECA 5968 +4ECB 5302 +4ECC 5A46 +4ECD 8702 +4ECE 6065 +4ECF 72D9 +4ED0 89A7 +4ED1 6689 +4ED2 66F9 +4ED3 5D6F +4ED4 5BB0 +4ED5 96BC +4ED6 636E +4ED7 60DC +4ED8 7948 +4ED9 51DD +4EDA 8606 +4EDB 5EC9 +4EDC 7554 +4EDD 596E +4EDE 6B04 +4EDF 4F43 +4EE0 7B94 +4EE1 67DA +4EE2 62DD +4EE3 628A +4EE4 971E +4EE5 62ED +4EE6 6EC5 +4EE7 508D +4EE8 67B6 +4EE9 80E4 +4EEA 9EBF +4EEB 5EB5 +4EEC 638C +4EED 85CD +4EEE 9867 +4EEF 52C5 +4EF0 6016 +4EF1 68CB +4EF2 61D0 +4EF3 5751 +4EF4 8F29 +4EF5 5FAA +4EF6 81A8 +4EF7 7D62 +4EF8 71C8 +4EF9 54C0 +4EFA 69CC +4EFB 6B3E +4EFC 65AC +4EFD 63C3 +4EFE 4F46 +4F41 7B1B +4F42 6B86 +4F43 88F8 +4F44 5203 +4F45 732E +4F46 6687 +4F47 7D17 +4F48 57F4 +4F49 570F +4F4A 618E +4F4B 970A +4F4C 7C3F +4F4D 8B00 +4F4E 7881 +4F4F 8CE0 +4F50 548B +4F51 7B87 +4F52 745B +4F53 7C11 +4F54 8870 +4F55 5398 +4F56 5448 +4F57 6CF3 +4F58 6F22 +4F59 53F6 +4F5A 88B4 +4F5B 5301 +4F5C 7A6B +4F5D 8695 +4F5E 586B +4F5F 5D29 +4F60 88C2 +4F61 62D2 +4F62 4E1E +4F63 5036 +4F64 96C0 +4F65 7363 +4F66 8A3B +4F67 5176 +4F68 7199 +4F69 7FE0 +4F6A 8888 +4F6B 7E1E +4F6C 4E4F +4F6D 84CB +4F6E 6F2B +4F6F 5859 +4F70 936C +4F71 53E9 +4F72 865A +4F73 9149 +4F74 86EF +4F75 5E06 +4F76 5507 +4F77 902E +4F78 6795 +4F79 846C +4F7A 5BA5 +4F7B 82A5 +4F7C 8431 +4F7D 6D8C +4F7E 63FA +4F7F 4EA5 +4F80 51C6 +4F81 6328 +4F82 7F70 +4F83 5B5F +4F84 5DBD +4F85 99C8 +4F86 53EC +4F87 7985 +4F88 8A54 +4F89 7962 +4F8A 88DF +4F8B 5B09 +4F8C 4FB5 +4F8D 4F91 +4F8E 9B8E +4F8F 5192 +4F90 96F0 +4F91 6DAF +4F92 622F +4F93 8490 +4F94 8CDC +4F95 5075 +4F96 5CE0 +4F97 4E14 +4F98 4F83 +4F99 7C54 +4F9A 84D1 +4F9B 77B3 +4F9C 8AEE +4F9D 5CE8 +4F9E 62F6 +4F9F 663B +4FA0 8A93 +4FA1 8526 +4FA2 8A95 +4FA3 65FA +4FA4 6714 +4FA5 53D4 +4FA6 62AB +4FA7 8CE6 +4FA8 88F3 +4FA9 5BE7 +4FAA 868A +4FAB 668E +4FAC 582A +4FAD 6170 +4FAE 696F +4FAF 9F13 +4FB0 7A92 +4FB1 7893 +4FB2 6A7F +4FB3 9017 +4FB4 9266 +4FB5 7D10 +4FB6 7BC7 +4FB7 6EF4 +4FB8 821C +4FB9 5C3D +4FBA 62CD +4FBB 85C1 +4FBC 6F02 +4FBD 6E67 +4FBE 6691 +4FBF 85A6 +4FC0 637A +4FC1 821B +4FC2 4F8D +4FC3 5091 +4FC4 8A02 +4FC5 62EC +4FC6 9BC9 +4FC7 7A3D +4FC8 7C9B +4FC9 50C5 +4FCA 9019 +4FCB 708A +4FCC 7C8B +4FCD 64EC +4FCE 665F +4FCF 6562 +4FD0 732B +4FD1 5339 +4FD2 67A0 +4FD3 55A7 +4FD4 6D2A +4FD5 7A3F +4FD6 64E6 +4FD7 79A7 +4FD8 67D8 +4FD9 7B26 +4FDA 96BB +4FDB 6311 +4FDC 72A0 +4FDD 5C6F +4FDE 7026 +4FDF 97EE +4FE0 60DF +4FE1 8AFE +4FE2 8B04 +4FE3 8494 +4FE4 9BD6 +4FE5 82AF +4FE6 932C +4FE7 6606 +4FE8 9640 +4FE9 5BC2 +4FEA 86C7 +4FEB 7949 +4FEC 8017 +4FED 6919 +4FEE 7092 +4FEF 963B +4FF0 7C7E +4FF1 59D3 +4FF2 5B5C +4FF3 7D1B +4FF4 91D8 +4FF5 6A80 +4FF6 85E9 +4FF7 6905 +4FF8 6C93 +4FF9 502D +4FFA 4EA6 +4FFB 7FC1 +4FFC 61A4 +4FFD 8CCA +4FFE 9665 +5041 93D1 +5042 53F1 +5043 598A +5044 8EAC +5045 62D8 +5046 6867 +5047 71D5 +5048 7B67 +5049 504F +504A 67D0 +504B 82D1 +504C 978D +504D 748B +504E 80BA +504F 7336 +5050 514E +5051 8105 +5052 90CA +5053 584A +5054 67FE +5055 6FF1 +5056 5FFD +5057 76C6 +5058 9A0E +5059 507D +505A 9694 +505B 5EF7 +505C 7BB8 +505D 904D +505E 6C4E +505F 85FB +5060 819D +5061 67AF +5062 564C +5063 5606 +5064 8C8C +5065 56DA +5066 73ED +5067 8CC4 +5068 8FC5 +5069 96F6 +506A 6C50 +506B 8944 +506C 8F3F +506D 7D5E +506E 60E8 +506F 72FC +5070 7D9C +5071 8463 +5072 5CFB +5073 5446 +5074 5D16 +5075 6CA1 +5076 81B3 +5077 58FA +5078 5BB4 +5079 8108 +507A 541F +507B 8CBC +507C 6182 +507D 78A9 +507E 6FE1 +507F 91A4 +5080 76F2 +5081 6020 +5082 76FE +5083 84C9 +5084 7F36 +5085 4EC7 +5086 755D +5087 7A17 +5088 84EC +5089 75F4 +508A 4F3A +508B 676D +508C 7460 +508D 62F3 +508E 6F20 +508F 79E4 +5090 87F9 +5091 6094 +5092 6234 +5093 66AB +5094 820C +5095 8499 +5096 723A +5097 5FCC +5098 6109 +5099 70CF +509A 7261 +509B 7A50 +509C 5098 +509D 9AED +509E 5D69 +509F 601C +50A0 6667 +50A1 99B4 +50A2 5E7B +50A3 643E +50A4 5830 +50A5 53C9 +50A6 7A9F +50A7 990C +50A8 9B42 +50A9 8F5F +50AA 7AAE +50AB 5B9B +50AC 68A2 +50AD 6249 +50AE 7984 +50AF 9DFA +50B0 5451 +50B1 932F +50B2 8AC4 +50B3 5F90 +50B4 8DF3 +50B5 5A2F +50B6 80DE +50B7 6D29 +50B8 7A4F +50B9 84BC +50BA 9D2B +50BB 9010 +50BC 6D38 +50BD 916A +50BE 6FC1 +50BF 9905 +50C0 6BBB +50C1 5EB6 +50C2 91B8 +50C3 5076 +50C4 6F0F +50C5 4E19 +50C6 540F +50C7 9675 +50C8 6C72 +50C9 51B4 +50CA 5631 +50CB 9F20 +50CC 66A6 +50CD 5F0A +50CE 75AB +50CF 51F8 +50D0 674F +50D1 8DF5 +50D2 6C70 +50D3 8A6B +50D4 757F +50D5 5CAC +50D6 6841 +50D7 8CD3 +50D8 9BDB +50D9 8475 +50DA 6893 +50DB 840C +50DC 72DB +50DD 7577 +50DE 8568 +50DF 783A +50E0 847A +50E1 5F10 +50E2 831C +50E3 6813 +50E4 6E1A +50E5 9DAF +50E6 51F9 +50E7 7980 +50E8 4E99 +50E9 5EE3 +50EA 908A +50EB 80AF +50EC 59A8 +50ED 77DB +50EE 8D74 +50EF 8A1F +50F0 673D +50F1 533F +50F2 8A0A +50F3 5618 +50F4 6756 +50F5 53D9 +50F6 4F10 +50F7 7409 +50F8 5A41 +50F9 4FF8 +50FA 79B0 +50FB 9838 +50FC 8E2A +50FD 9D60 +50FE 8F44 +5141 65A5 +5142 75BE +5143 906D +5144 867B +5145 60BC +5146 51B6 +5147 5937 +5148 7D2F +5149 916C +514A 69AE +514B 7CE0 +514C 792A +514D 5D14 +514E 64C1 +514F 58EC +5150 589C +5151 8D66 +5152 66D9 +5153 61F2 +5154 912D +5155 6E58 +5156 9435 +5157 965B +5158 7272 +5159 5F6A +515A 5E9A +515B 8F1B +515C 5B95 +515D 5C39 +515E 9013 +515F 834F +5160 7CCE +5161 620A +5162 90ED +5163 691B +5164 6E15 +5165 65DB +5166 66FE +5167 4E9F +5168 55AA +5169 7A83 +516A 83E9 +516B 8B83 +516C 846D +516D 83F0 +516E 7F50 +516F 918D +5170 9190 +5171 758E +5172 95A5 +5173 81E7 +5174 75E2 +5175 61A9 +5176 8A50 +5177 95B2 +5178 53A8 +5179 59F6 +517A 9813 +517B 7891 +517C 7C17 +517D 6B3A +517E 57E0 +517F 620E +5180 83D6 +5181 8AD2 +5182 75D4 +5183 927E +5184 59DC +5185 5289 +5186 9087 +5187 6FFE +5188 7473 +5189 5C09 +518A 9D6C +518B 84FC +518C 7CDF +518D 7BAD +518E 8A6E +518F 594E +5190 56A2 +5191 819A +5192 7947 +5193 6636 +5194 53E1 +5195 7887 +5196 58CC +5197 9397 +5198 6E13 +5199 5256 +519A 828B +519B 9E9F +519C 9583 +519D 658C +519E 9E93 +519F 7345 +51A0 6E26 +51A1 9D07 +51A2 5983 +51A3 7DAC +51A4 96C1 +51A5 61BE +51A6 6762 +51A7 9ECE +51A8 90A8 +51A9 9187 +51AA 9F0E +51AB 7C38 +51AC 51F1 +51AD 8599 +51AE 524C +51AF 540E +51B0 7901 +51B1 655E +51B2 6668 +51B3 5CE1 +51B4 7566 +51B5 76C8 +51B6 8679 +51B7 531D +51B8 5506 +51B9 7926 +51BA 8912 +51BB 77EF +51BC 7CC0 +51BD 570B +51BE 515C +51BF 7E8A +51C0 535C +51C1 8A60 +51C2 65A7 +51C3 8766 +51C4 5766 +51C5 6AE8 +51C6 87FB +51C7 5E16 +51C8 7AEA +51C9 8D73 +51CA 771E +51CB 737A +51CC 66E0 +51CD 9410 +51CE 816B +51CF 7B08 +51D0 91FC +51D1 5737 +51D2 6FE4 +51D3 856A +51D4 7E55 +51D5 9957 +51D6 87BA +51D7 694A +51D8 818F +51D9 5EFF +51DA 891C +51DB 72D0 +51DC 9846 +51DD 9EDB +51DE 8D99 +51DF 5DD6 +51E0 62B9 +51E1 64AB +51E2 4F76 +51E3 613F +51E4 68AF +51E5 5F14 +51E6 800C +51E7 92F8 +51E8 7BC1 +51E9 52FE +51EA 664F +51EB 9177 +51EC 51F6 +51ED 97A0 +51EE 839E +51EF 647A +51F0 9C3A +51F1 67F5 +51F2 7C4F +51F3 685F +51F4 9B6F +51F5 9F4B +51F6 7FFB +51F7 9348 +51F8 4FF6 +51F9 9E92 +51FA 9197 +51FB 96DB +51FC 5BE6 +51FD 6CCC +51FE 7CFE +5241 9453 +5242 6822 +5243 66B9 +5244 5BD4 +5245 98F4 +5246 8AE6 +5247 8154 +5248 7827 +5249 74BD +524A 6ED3 +524B 9288 +524C 5A20 +524D 5B8B +524E 86F8 +524F 760D +5250 865C +5251 6641 +5252 91C9 +5253 5589 +5254 7A4E +5255 59E5 +5256 6042 +5257 932B +5258 5B5A +5259 849C +525A 5C91 +525B 96CD +525C 62D9 +525D 675C +525E 6787 +525F 5E7D +5260 8650 +5261 9EB9 +5262 5CB1 +5263 80CE +5264 7A00 +5265 8ABC +5266 5700 +5267 8096 +5268 7D72 +5269 9211 +526A 8098 +526B 907C +526C 7761 +526D 8737 +526E 9075 +526F 817A +5270 7C3E +5271 6EA2 +5272 965E +5273 7E90 +5274 72D7 +5275 58FD +5276 60B3 +5277 9786 +5278 7E88 +5279 587E +527A 6E20 +527B 84DC +527C 6961 +527D 77AD +527E 5197 +527F 652A +5280 6777 +5281 5DCD +5282 6101 +5283 932E +5284 5954 +5285 6367 +5286 798D +5287 7AFF +5288 80D6 +5289 58B3 +528A 6168 +528B 6AC3 +528C 7483 +528D 9B92 +528E 660A +528F 642D +5290 5118 +5291 6763 +5292 809B +5293 9C10 +5294 4FC9 +5295 6953 +5296 7A1C +5297 52FF +5298 6055 +5299 768E +529A 817F +529B 5642 +529C 5F6D +529D 7194 +529E 70BB +529F 7436 +52A0 8000 +52A1 874B +52A2 55DA +52A3 7435 +52A4 7690 +52A5 96EB +52A6 66DD +52A7 751C +52A8 633D +52A9 6EC9 +52AA 7C64 +52AB 7CA5 +52AC 6D35 +52AD 935C +52AE 7027 +52AF 5E25 +52B0 701D +52B1 54BD +52B2 611A +52B3 6973 +52B4 6C6A +52B5 559A +52B6 6D19 +52B7 96CC +52B8 5BE1 +52B9 59FB +52BA 697C +52BB 914C +52BC 7709 +52BD 8500 +52BE 7A46 +52BF 7872 +52C0 92E4 +52C1 8CED +52C2 7CFA +52C3 9D1B +52C4 814E +52C5 9AC4 +52C6 68A0 +52C7 6DCB +52C8 5918 +52C9 83B1 +52CA 5629 +52CB 9B41 +52CC 6897 +52CD 70B3 +52CE 9771 +52CF 9419 +52D0 67A2 +52D1 6802 +52D2 7895 +52D3 68A7 +52D4 50D6 +52D5 80B1 +52D6 5EF8 +52D7 82D4 +52D8 797A +52D9 67CA +52DA 7E4D +52DB 69CD +52DC 51C4 +52DD 723D +52DE 6829 +52DF 99B3 +52E0 5F3C +52E1 8F61 +52E2 682B +52E3 6155 +52E4 6591 +52E5 8FB1 +52E6 7E1B +52E7 9798 +52E8 9952 +52E9 8877 +52EA 5B2C +52EB 6631 +52EC 4FA0 +52ED 6939 +52EE 6AFB +52EF 5BB5 +52F0 7AC8 +52F1 5026 +52F2 5944 +52F3 9059 +52F4 7B25 +52F5 7B4F +52F6 8E74 +52F7 8543 +52F8 5858 +52F9 8B0E +52FA 5039 +52FB 8654 +52FC 97F6 +52FD 7569 +52FE 72F8 +5341 4EF7 +5342 9D89 +5343 5016 +5344 51CC +5345 62CC +5346 91C6 +5347 8755 +5348 649A +5349 88F4 +534A 91E6 +534B 6854 +534C 695A +534D 6C40 +534E 7B6C +534F 6741 +5350 77D7 +5351 8823 +5352 5384 +5353 8EAF +5354 7280 +5355 8C6B +5356 788D +5357 7165 +5358 8207 +5359 68B1 +535A 8D04 +535B 9077 +535C 701E +535D 8FE6 +535E 810A +535F 81BF +5360 89DC +5361 68B3 +5362 6ADF +5363 92EA +5364 95C7 +5365 7957 +5366 7A20 +5367 53A9 +5368 8E5F +5369 786F +536A 79B9 +536B 5F27 +536C 5ED6 +536D 6853 +536E 93AC +536F 919C +5370 691A +5371 5806 +5372 64B0 +5373 7E4B +5374 7D8F +5375 68F2 +5376 6EA5 +5377 82DB +5378 9192 +5379 5243 +537A 8EB0 +537B 9081 +537C 721B +537D 7DCB +537E 7656 +537F 59AC +5380 6FE0 +5381 8B28 +5382 80A2 +5383 5544 +5384 6070 +5385 5F4A +5386 68C8 +5387 633A +5388 9438 +5389 9B4F +538A 81E5 +538B 6A17 +538C 70DD +538D 69A7 +538E 614C +538F 920E +5390 9310 +5391 9BAD +5392 52D7 +5393 925E +5394 92F9 +5395 5993 +5396 7696 +5397 66FB +5398 5769 +5399 73CA +539A 7678 +539B 6A1F +539C 7E9C +539D 9811 +539E 8CD1 +539F 5840 +53A0 6349 +53A1 871C +53A2 62D0 +53A3 60B4 +53A4 6B89 +53A5 86EE +53A6 5764 +53A7 581D +53A8 8549 +53A9 7235 +53AA 7652 +53AB 983B +53AC 8237 +53AD 5351 +53AE 5C24 +53AF 59BE +53B0 5815 +53B1 901D +53B2 69B4 +53B3 834A +53B4 9EA9 +53B5 976B +53B6 8086 +53B7 53AD +53B8 6068 +53B9 4FAE +53BA 76C3 +53BB 6A05 +53BC 689B +53BD 937E +53BE 99D5 +53BF 91C7 +53C0 5C16 +53C1 585E +53C2 61A7 +53C3 9699 +53C4 4FDF +53C5 8278 +53C6 9C52 +53C7 5F45 +53C8 6108 +53C9 7C8D +53CA 806F +53CB 5DF7 +53CC 8D6B +53CD 57B0 +53CE 98E2 +53CF 5703 +53D0 79BF +53D1 5996 +53D2 7941 +53D3 540A +53D4 83DF +53D5 9C39 +53D6 52D2 +53D7 6BD8 +53D8 86CB +53D9 4EC0 +53DA 9A28 +53DB 5366 +53DC 8006 +53DD 7337 +53DE 6492 +53DF 8FED +53E0 5AC9 +53E1 5420 +53E2 537F +53E3 4FAF +53E4 807E +53E5 543B +53E6 7515 +53E7 7B18 +53E8 8749 +53E9 54B3 +53EA 704C +53EB 8997 +53EC 6CAB +53ED 85FA +53EE 7114 +53EF 696E +53F0 9328 +53F1 745A +53F2 59D1 +53F3 6E5B +53F4 617E +53F5 53E2 +53F6 8317 +53F7 76E7 +53F8 848B +53F9 85AF +53FA 6925 +53FB 5C60 +53FC 7259 +53FD 75D5 +53FE 8B90 +5441 6E07 +5442 82AD +5443 5C4F +5444 7BED +5445 9784 +5446 6F70 +5447 764C +5448 88B7 +5449 92D2 +544A 4F36 +544B 5EFE +544C 9061 +544D 88E1 +544E 8471 +544F 711A +5450 6D1B +5451 80B4 +5452 74E2 +5453 7433 +5454 5A7F +5455 905C +5456 980C +5457 5319 +5458 906E +5459 6BB4 +545A 85AA +545B 7897 +545C 7AFA +545D 6AAE +545E 8910 +545F 958F +5460 620C +5461 4F3D +5462 4F7C +5463 79BE +5464 9D0E +5465 4ED4 +5466 57A2 +5467 51A5 +5468 6900 +5469 6089 +546A 707C +546B 7AE3 +546C 8956 +546D 93A7 +546E 9C2D +546F 5112 +5470 52FA +5471 7CCA +5472 60F9 +5473 7078 +5474 81C6 +5475 559D +5476 6991 +5477 96C9 +5478 553E +5479 805A +547A 8304 +547B 8332 +547C 54FA +547D 565B +547E 8FBF +547F 5634 +5480 6760 +5481 5265 +5482 840E +5483 5E5F +5484 7B65 +5485 9035 +5486 8387 +5487 6B4E +5488 58BE +5489 6309 +548A 727D +548B 97AD +548C 69D0 +548D 546A +548E 984E +548F 632B +5490 714E +5491 8557 +5492 7CDE +5493 6372 +5494 68F9 +5495 7511 +5496 8602 +5497 6EBA +5498 5A3C +5499 7A84 +549A 851A +549B 95A4 +549C 59D0 +549D 60DA +549E 51EA +549F 5A29 +54A0 7169 +54A1 6F15 +54A2 696B +54A3 63BB +54A4 75E9 +54A5 4E4E +54A6 7DBB +54A7 6934 +54A8 8521 +54A9 8FFA +54AA 9354 +54AB 9C3B +54AC 5F17 +54AD 5ED3 +54AE 8258 +54AF 895F +54B0 82E7 +54B1 52C3 +54B2 5C51 +54B3 83AB +54B4 7826 +54B5 79E1 +54B6 7FF0 +54B7 626E +54B8 60F0 +54B9 5CA8 +54BA 6F97 +54BB 71A8 +54BC 9909 +54BD 5132 +54BE 5E37 +54BF 5F04 +54C0 637B +54C1 6753 +54C2 68D7 +54C3 6652 +54C4 9CF6 +54C5 88B0 +54C6 52AB +54C7 4FC4 +54C8 4E3C +54C9 67B3 +54CA 7BAA +54CB 7F4D +54CC 8A23 +54CD 63B4 +54CE 71E6 +54CF 65A4 +54D0 6F09 +54D1 853D +54D2 5072 +54D3 7DBA +54D4 5516 +54D5 7B04 +54D6 72FD +54D7 6CD3 +54D8 8422 +54D9 621F +54DA 50AD +54DB 8235 +54DC 8718 +54DD 5919 +54DE 6028 +54DF 677C +54E0 6F23 +54E1 75B9 +54E2 695C +54E3 520E +54E4 8018 +54E5 8B01 +54E6 71ED +54E7 5713 +54E8 660F +54E9 83EB +54EA 7164 +54EB 7D9B +54EC 5617 +54ED 7D7D +54EE 8F4D +54EF 9318 +54F0 8569 +54F1 5D17 +54F2 678C +54F3 67DE +54F4 87C7 +54F5 79AE +54F6 5835 +54F7 8404 +54F8 9041 +54F9 7FD4 +54FA 6E8C +54FB 8A63 +54FC 9D08 +54FD 670F +54FE 939A +5541 63AC +5542 602F +5543 64E2 +5544 608D +5545 96B7 +5546 6357 +5547 8461 +5548 914B +5549 75D8 +554A 60E7 +554B 9913 +554C 9C57 +554D 5984 +554E 6DEB +554F 5E96 +5550 6D9C +5551 9BF0 +5552 58BB +5553 7977 +5554 60B6 +5555 633F +5556 5BF5 +5557 9812 +5558 558B +5559 82D3 +555A 5147 +555B 6190 +555C 7953 +555D 79BD +555E 6C5D +555F 9EBA +5560 9C48 +5561 8DA8 +5562 5EE0 +5563 7D43 +5564 5EFC +5565 854E +5566 8CE4 +5567 5AE1 +5568 54E8 +5569 5023 +556A 52BE +556B 7DEC +556C 8511 +556D 6666 +556E 6C3E +556F 724C +5570 8ADC +5571 9C0D +5572 77A5 +5573 8B02 +5574 8D05 +5575 6F11 +5576 9834 +5577 97FB +5578 50FB +5579 7F75 +557A 5A03 +557B 8513 +557C 4FB6 +557D 634C +557E 9D61 +557F 808B +5580 5294 +5581 65A1 +5582 567A +5583 5957 +5584 8D0B +5585 6A35 +5586 6AD3 +5587 70F9 +5588 865E +5589 6FB1 +558A 51E7 +558B 7FEB +558C 59EA +558D 5E87 +558E 6B6A +558F 754F +5590 717D +5591 914E +5592 7D2C +5593 8C79 +5594 6062 +5595 621A +5596 7FA8 +5597 5F1B +5598 6C8C +5599 86FE +559A 7562 +559B 7B86 +559C 9AB8 +559D 6627 +559E 7ABA +559F 844E +55A0 6F81 +55A1 8B2C +55A2 86A4 +55A3 6FEB +55A4 7B8B +55A5 7F77 +55A6 8F2F +55A7 8E44 +55A8 7E23 +55A9 4E4D +55AA 79A6 +55AB 8AFA +55AC 903C +55AD 50D1 +55AE 9ECD +55AF 5EDF +55B0 758F +55B1 631F +55B2 53DB +55B3 9910 +55B4 826E +55B5 62F7 +55B6 68FA +55B7 725D +55B8 803D +55B9 58D5 +55BA 5C4D +55BB 86D9 +55BC 540B +55BD 8805 +55BE 92F2 +55BF 9237 +55C0 5C61 +55C1 985B +55C2 86E4 +55C3 966A +55C4 7262 +55C5 6955 +55C6 6CD7 +55C7 6994 +55C8 9C2F +55C9 77E7 +55CA 68C9 +55CB 8DE8 +55CC 6D6C +55CD 67C1 +55CE 9BAA +55CF 619A +55D0 63A9 +55D1 7015 +55D2 9306 +55D3 934D +55D4 6A61 +55D5 6258 +55D6 5283 +55D7 7525 +55D8 5687 +55D9 6C83 +55DA 6834 +55DB 649E +55DC 4E9B +55DD 7252 +55DE 59E6 +55DF 8FC2 +55E0 5FBD +55E1 6DD8 +55E2 85F7 +55E3 8A51 +55E4 9817 +55E5 99C1 +55E6 63A0 +55E7 7C81 +55E8 5B30 +55E9 8139 +55EA 5403 +55EB 7E82 +55EC 8106 +55ED 532A +55EE 6A8E +55EF 7F6B +55F0 54E9 +55F1 5678 +55F2 8AB9 +55F3 6715 +55F4 5BD3 +55F5 6478 +55F6 64FE +55F7 6B1D +55F8 8CC2 +55F9 51CB +55FA 7E8F +5641 5F0C +5642 4E10 +5643 4E15 +5644 4E28 +5645 4E2A +5646 4E31 +5647 4E36 +5648 4E3F +5649 4E42 +564A 4E56 +564B 4E58 +564C 4E62 +564D 4E82 +564E 4E85 +564F 4E8A +5650 4E8E +5651 5F0D +5652 4E9E +5653 4EA0 +5654 4EA2 +5655 4EB0 +5656 4EB3 +5657 4EB6 +5658 4ECE +5659 4ECD +565A 4EC4 +565B 4EC6 +565C 4EC2 +565D 4EE1 +565E 4ED7 +565F 4EDE +5660 4EED +5661 4EDF +5662 4EFC +5663 4F09 +5664 4F1C +5665 4F00 +5666 4F03 +5667 4F5A +5668 4F30 +5669 4F5D +566A 4F39 +566B 4F57 +566C 4F47 +566D 4F5E +566E 4F56 +566F 4F5B +5670 4F92 +5671 4F8A +5672 4F88 +5673 4F8F +5674 4F9A +5675 4FAD +5676 4F98 +5677 4F7B +5678 4FAB +5679 4F69 +567A 4F70 +567B 4F94 +567C 4F6F +567D 4F86 +567E 4F96 +567F 4FD4 +5680 4FCE +5681 4FD8 +5682 4FDB +5683 4FD1 +5684 4FDA +5685 4FD0 +5686 4FCD +5687 4FE4 +5688 4FE5 +5689 501A +568A 5040 +568B 5028 +568C 5014 +568D 502A +568E 5025 +568F 5005 +5690 5021 +5691 5022 +5692 5029 +5693 502C +5694 4FFF +5695 4FFE +5696 4FEF +5697 5011 +5698 501E +5699 5006 +569A 5043 +569B 5047 +569C 5055 +569D 5050 +569E 5048 +569F 505A +56A0 5056 +56A1 500F +56A2 5046 +56A3 5070 +56A4 5042 +56A5 506C +56A6 5078 +56A7 5080 +56A8 5094 +56A9 509A +56AA 5085 +56AB 50B4 +56AC 6703 +56AD 50B2 +56AE 50C9 +56AF 50CA +56B0 50B3 +56B1 50C2 +56B2 50F4 +56B3 50DE +56B4 50E5 +56B5 50D8 +56B6 50ED +56B7 50E3 +56B8 50EE +56B9 50F9 +56BA 50F5 +56BB 5109 +56BC 5101 +56BD 5102 +56BE 511A +56BF 5115 +56C0 5114 +56C1 5116 +56C2 5121 +56C3 513A +56C4 5137 +56C5 513C +56C6 513B +56C7 513F +56C8 5140 +56C9 514A +56CA 514C +56CB 5152 +56CC 5154 +56CD 5162 +56CE 5164 +56CF 5169 +56D0 516A +56D1 516E +56D2 5180 +56D3 5182 +56D4 56D8 +56D5 518C +56D6 5189 +56D7 518F +56D8 5191 +56D9 5193 +56DA 5195 +56DB 5196 +56DC 519D +56DD 51A4 +56DE 51A6 +56DF 51A2 +56E0 51A9 +56E1 51AA +56E2 51AB +56E3 51B3 +56E4 51B1 +56E5 51B2 +56E6 51B0 +56E7 51B5 +56E8 51BE +56E9 51BD +56EA 51C5 +56EB 51C9 +56EC 51DB +56ED 51E0 +56EE 51E9 +56EF 51EC +56F0 51ED +56F1 51F0 +56F2 51F5 +56F3 51FE +56F4 5204 +56F5 520B +56F6 5214 +56F7 5215 +56F8 5227 +56F9 522A +56FA 522E +56FB 5233 +56FC 5239 +56FD 5244 +56FE 524B +5741 524F +5742 525E +5743 5254 +5744 5271 +5745 526A +5746 5273 +5747 5274 +5748 5269 +5749 527F +574A 527D +574B 528D +574C 5288 +574D 5292 +574E 5291 +574F 529C +5750 52A6 +5751 52AC +5752 52AD +5753 52BC +5754 52B5 +5755 52C1 +5756 52C0 +5757 52CD +5758 52DB +5759 52DE +575A 52E3 +575B 52E6 +575C 52E0 +575D 52F3 +575E 52F5 +575F 52F8 +5760 52F9 +5761 5300 +5762 5306 +5763 5307 +5764 5308 +5765 7538 +5766 530D +5767 5310 +5768 530F +5769 5315 +576A 531A +576B 5324 +576C 5323 +576D 532F +576E 5331 +576F 5333 +5770 5338 +5771 5340 +5772 5345 +5773 5346 +5774 5349 +5775 4E17 +5776 534D +5777 51D6 +5778 8209 +5779 535E +577A 5369 +577B 536E +577C 5372 +577D 5377 +577E 537B +577F 5382 +5780 5393 +5781 5396 +5782 53A0 +5783 53A6 +5784 53A5 +5785 53AE +5786 53B0 +5787 53B2 +5788 53B6 +5789 53C3 +578A 7C12 +578B 53DD +578C 53DF +578D 66FC +578E FA0E +578F 71EE +5790 53EE +5791 53E8 +5792 53ED +5793 53FA +5794 5401 +5795 543D +5796 5440 +5797 542C +5798 542D +5799 543C +579A 542E +579B 5436 +579C 5429 +579D 541D +579E 544E +579F 548F +57A0 5475 +57A1 548E +57A2 545F +57A3 5471 +57A4 5477 +57A5 5470 +57A6 5492 +57A7 547B +57A8 5480 +57A9 549C +57AA 5476 +57AB 5484 +57AC 5490 +57AD 5486 +57AE 548A +57AF 54C7 +57B0 54BC +57B1 54AF +57B2 54A2 +57B3 54B8 +57B4 54A5 +57B5 54AC +57B6 54C4 +57B7 54D8 +57B8 54C8 +57B9 54A8 +57BA 54AB +57BB 54C2 +57BC 54A4 +57BD 54A9 +57BE 54BE +57BF 54E5 +57C0 54FF +57C1 54E6 +57C2 550F +57C3 5514 +57C4 54FD +57C5 54EE +57C6 54ED +57C7 54E2 +57C8 5539 +57C9 5540 +57CA 5563 +57CB 554C +57CC 552E +57CD 555C +57CE 5545 +57CF 5556 +57D0 5557 +57D1 5538 +57D2 5533 +57D3 555D +57D4 5599 +57D5 5580 +57D6 558A +57D7 559F +57D8 557B +57D9 557E +57DA 5598 +57DB 559E +57DC 55AE +57DD 557C +57DE 5586 +57DF 5583 +57E0 55A9 +57E1 5587 +57E2 55A8 +57E3 55C5 +57E4 55DF +57E5 55C4 +57E6 55DC +57E7 55E4 +57E8 55D4 +57E9 55F9 +57EA 5614 +57EB 55F7 +57EC 5616 +57ED 55FE +57EE 55FD +57EF 561B +57F0 564E +57F1 5650 +57F2 5636 +57F3 5632 +57F4 5638 +57F5 566B +57F6 5664 +57F7 5686 +57F8 562F +57F9 566C +57FA 566A +57FB 71DF +57FC 5694 +57FD 568F +57FE 5680 +5841 568A +5842 56A0 +5843 56A5 +5844 56AE +5845 56B6 +5846 56B4 +5847 56C8 +5848 56C2 +5849 56BC +584A 56C1 +584B 56C3 +584C 56C0 +584D 56CE +584E 56D3 +584F 56D1 +5850 56D7 +5851 56EE +5852 56F9 +5853 56FF +5854 5704 +5855 5709 +5856 5708 +5857 570D +5858 55C7 +5859 5718 +585A 5716 +585B 571C +585C 5726 +585D 5738 +585E 574E +585F 573B +5860 5759 +5861 5740 +5862 574F +5863 5765 +5864 5788 +5865 5761 +5866 577F +5867 5789 +5868 5793 +5869 57A0 +586A 57A4 +586B 57B3 +586C 57AC +586D 57AA +586E 57C3 +586F 57C6 +5870 57C8 +5871 57C0 +5872 57D4 +5873 57C7 +5874 57D2 +5875 57D3 +5876 57D6 +5877 FA0F +5878 580A +5879 57E3 +587A 580B +587B 5819 +587C 5821 +587D 584B +587E 5862 +587F 6BC0 +5880 583D +5881 5852 +5882 FA10 +5883 5870 +5884 5879 +5885 5885 +5886 5872 +5887 589F +5888 58AB +5889 58B8 +588A 589E +588B 58AE +588C 58B2 +588D 58B9 +588E 58BA +588F 58C5 +5890 58D3 +5891 58D1 +5892 58D7 +5893 58D9 +5894 58D8 +5895 58DE +5896 58DC +5897 58DF +5898 58E4 +5899 58E5 +589A 58EF +589B 58F7 +589C 58F9 +589D 58FB +589E 58FC +589F 5902 +58A0 590A +58A1 590B +58A2 5910 +58A3 591B +58A4 68A6 +58A5 5925 +58A6 592C +58A7 592D +58A8 5932 +58A9 5938 +58AA 593E +58AB 5955 +58AC 5950 +58AD 5953 +58AE 595A +58AF 5958 +58B0 595B +58B1 595D +58B2 5963 +58B3 5962 +58B4 5960 +58B5 5967 +58B6 596C +58B7 5969 +58B8 5978 +58B9 5981 +58BA 598D +58BB 599B +58BC 599D +58BD 59A3 +58BE 59A4 +58BF 59B2 +58C0 59BA +58C1 59C6 +58C2 59E8 +58C3 59D9 +58C4 59DA +58C5 5A25 +58C6 5A1F +58C7 5A11 +58C8 5A1C +58C9 5A1A +58CA 5A09 +58CB 5A40 +58CC 5A6C +58CD 5A49 +58CE 5A35 +58CF 5A36 +58D0 5A62 +58D1 5A6A +58D2 5A9A +58D3 5ABC +58D4 5ABE +58D5 5AD0 +58D6 5ACB +58D7 5AC2 +58D8 5ABD +58D9 5AE3 +58DA 5AD7 +58DB 5AE6 +58DC 5AE9 +58DD 5AD6 +58DE 5AFA +58DF 5AFB +58E0 5B0C +58E1 5B0B +58E2 5B16 +58E3 5B32 +58E4 5B2A +58E5 5B36 +58E6 5B3E +58E7 5B43 +58E8 5B45 +58E9 5B40 +58EA 5B51 +58EB 5B55 +58EC 5B56 +58ED 6588 +58EE 5B5B +58EF 5B65 +58F0 5B69 +58F1 5B70 +58F2 5B73 +58F3 5B75 +58F4 5B78 +58F5 5B7A +58F6 5B80 +58F7 5B83 +58F8 5BA6 +58F9 5BB8 +58FA 5BC3 +58FB 5BC7 +58FC 5BC0 +58FD 5BC9 +58FE 752F +5941 5BD0 +5942 5BD8 +5943 5BDE +5944 5BEC +5945 5BE4 +5946 5BE2 +5947 5BE5 +5948 5BEB +5949 5BF0 +594A 5BF3 +594B 5BF6 +594C 5C05 +594D 5C07 +594E 5C08 +594F 5C0D +5950 5C13 +5951 5C1E +5952 5C20 +5953 5C22 +5954 5C28 +5955 5C38 +5956 5C41 +5957 5C46 +5958 5C4E +5959 5C53 +595A 5C50 +595B 5B71 +595C 5C6C +595D 5C6E +595E 5C76 +595F 5C79 +5960 5C8C +5961 5C94 +5962 5CBE +5963 5CAB +5964 5CBB +5965 5CB6 +5966 5CB7 +5967 5CA6 +5968 5CBA +5969 5CC5 +596A 5CBC +596B 5CC7 +596C 5CD9 +596D 5CE9 +596E 5CFD +596F 5CFA +5970 5CF5 +5971 5CED +5972 5CEA +5973 5D0B +5974 5D15 +5975 5D1F +5976 5D1B +5977 5D11 +5978 5D27 +5979 5D22 +597A 5D1A +597B 5D19 +597C 5D18 +597D 5D4C +597E 5D52 +597F 5D53 +5980 FA11 +5981 5D5C +5982 5D4E +5983 5D4B +5984 5D42 +5985 5D6C +5986 5D73 +5987 5D6D +5988 5D76 +5989 5D87 +598A 5D84 +598B 5D82 +598C 5D8C +598D 5DA2 +598E 5D9D +598F 5D90 +5990 5DAC +5991 5DAE +5992 5DB7 +5993 5DB8 +5994 5DBC +5995 5DB9 +5996 5DC9 +5997 5DD0 +5998 5DD3 +5999 5DD2 +599A 5DDB +599B 5DEB +599C 5DF5 +599D 5E0B +599E 5E1A +599F 5E19 +59A0 5E11 +59A1 5E1B +59A2 5E36 +59A3 5E44 +59A4 5E43 +59A5 5E40 +59A6 5E47 +59A7 5E4E +59A8 5E57 +59A9 5E54 +59AA 5E62 +59AB 5E64 +59AC 5E75 +59AD 5E76 +59AE 5E7A +59AF 5E7F +59B0 5EA0 +59B1 5EC1 +59B2 5EC2 +59B3 5EC8 +59B4 5ED0 +59B5 5ECF +59B6 5EDD +59B7 5EDA +59B8 5EDB +59B9 5EE2 +59BA 5EE1 +59BB 5EE8 +59BC 5EE9 +59BD 5EEC +59BE 5EF0 +59BF 5EF1 +59C0 5EF3 +59C1 5EF4 +59C2 5F03 +59C3 5F09 +59C4 5F0B +59C5 5F11 +59C6 5F16 +59C7 5F21 +59C8 5F29 +59C9 5F2D +59CA 5F2F +59CB 5F34 +59CC 5F38 +59CD 5F41 +59CE 5F48 +59CF 5F4C +59D0 5F4E +59D1 5F51 +59D2 5F56 +59D3 5F57 +59D4 5F59 +59D5 5F5C +59D6 5F5D +59D7 5F61 +59D8 5F67 +59D9 5F73 +59DA 5F77 +59DB 5F83 +59DC 5F82 +59DD 5F7F +59DE 5F8A +59DF 5F88 +59E0 5F87 +59E1 5F91 +59E2 5F99 +59E3 5F9E +59E4 5F98 +59E5 5FA0 +59E6 5FA8 +59E7 5FAD +59E8 5FB7 +59E9 5FBC +59EA 5FD6 +59EB 5FFB +59EC 5FE4 +59ED 5FF8 +59EE 5FF1 +59EF 5FF0 +59F0 5FDD +59F1 5FDE +59F2 5FFF +59F3 6021 +59F4 6019 +59F5 6010 +59F6 6029 +59F7 600E +59F8 6031 +59F9 601B +59FA 6015 +59FB 602B +59FC 6026 +59FD 600F +59FE 603A +5A41 605A +5A42 6041 +5A43 6060 +5A44 605D +5A45 606A +5A46 6077 +5A47 605F +5A48 604A +5A49 6046 +5A4A 604D +5A4B 6063 +5A4C 6043 +5A4D 6064 +5A4E 606C +5A4F 606B +5A50 6059 +5A51 6085 +5A52 6081 +5A53 6083 +5A54 609A +5A55 6084 +5A56 609B +5A57 608A +5A58 6096 +5A59 6097 +5A5A 6092 +5A5B 60A7 +5A5C 608B +5A5D 60E1 +5A5E 60B8 +5A5F 60DE +5A60 60E0 +5A61 60D3 +5A62 60BD +5A63 60C6 +5A64 60B5 +5A65 60D5 +5A66 60D8 +5A67 6120 +5A68 60F2 +5A69 6115 +5A6A 6106 +5A6B 60F6 +5A6C 60F7 +5A6D 6100 +5A6E 60F4 +5A6F 60FA +5A70 6103 +5A71 6121 +5A72 60FB +5A73 60F1 +5A74 610D +5A75 610E +5A76 6111 +5A77 6147 +5A78 614D +5A79 6137 +5A7A 6128 +5A7B 6127 +5A7C 613E +5A7D 614A +5A7E 6130 +5A7F 613C +5A80 612C +5A81 6134 +5A82 6165 +5A83 615D +5A84 613D +5A85 6142 +5A86 6144 +5A87 6173 +5A88 6187 +5A89 6177 +5A8A 6158 +5A8B 6159 +5A8C 615A +5A8D 616B +5A8E 6174 +5A8F 616F +5A90 6171 +5A91 615F +5A92 6153 +5A93 6175 +5A94 6198 +5A95 6199 +5A96 6196 +5A97 61AC +5A98 6194 +5A99 618A +5A9A 6191 +5A9B 61AB +5A9C 61AE +5A9D 61CC +5A9E 61CA +5A9F 61C9 +5AA0 61C8 +5AA1 61C3 +5AA2 61C6 +5AA3 61BA +5AA4 61CB +5AA5 7F79 +5AA6 61CD +5AA7 61E6 +5AA8 61E3 +5AA9 61F4 +5AAA 61F7 +5AAB 61F6 +5AAC 61FD +5AAD 61FA +5AAE 61FF +5AAF 61FC +5AB0 61FE +5AB1 6200 +5AB2 6208 +5AB3 6209 +5AB4 620D +5AB5 6213 +5AB6 6214 +5AB7 621B +5AB8 621E +5AB9 6221 +5ABA 622A +5ABB 622E +5ABC 6230 +5ABD 6232 +5ABE 6233 +5ABF 6241 +5AC0 624E +5AC1 625E +5AC2 6263 +5AC3 625B +5AC4 6260 +5AC5 6268 +5AC6 627C +5AC7 6282 +5AC8 6289 +5AC9 6292 +5ACA 627E +5ACB 6293 +5ACC 6296 +5ACD 6283 +5ACE 6294 +5ACF 62D7 +5AD0 62D1 +5AD1 62BB +5AD2 62CF +5AD3 62AC +5AD4 62C6 +5AD5 62C8 +5AD6 62DC +5AD7 62D4 +5AD8 62CA +5AD9 62C2 +5ADA 62A6 +5ADB 62C7 +5ADC 629B +5ADD 62C9 +5ADE 630C +5ADF 62EE +5AE0 62F1 +5AE1 6327 +5AE2 6302 +5AE3 6308 +5AE4 62EF +5AE5 62F5 +5AE6 62FF +5AE7 6350 +5AE8 634D +5AE9 633E +5AEA 634F +5AEB 6396 +5AEC 638E +5AED 6380 +5AEE 63AB +5AEF 6376 +5AF0 63A3 +5AF1 638F +5AF2 6389 +5AF3 639F +5AF4 636B +5AF5 6369 +5AF6 63B5 +5AF7 63BE +5AF8 63E9 +5AF9 63C0 +5AFA 63C6 +5AFB 63F5 +5AFC 63E3 +5AFD 63C9 +5AFE 63D2 +5B41 63F6 +5B42 63C4 +5B43 6434 +5B44 6406 +5B45 6413 +5B46 6426 +5B47 6436 +5B48 641C +5B49 6417 +5B4A 6428 +5B4B 640F +5B4C 6416 +5B4D 644E +5B4E 6467 +5B4F 646F +5B50 6460 +5B51 6476 +5B52 64B9 +5B53 649D +5B54 64CE +5B55 6495 +5B56 64BB +5B57 6493 +5B58 64A5 +5B59 64A9 +5B5A 6488 +5B5B 64BC +5B5C 64DA +5B5D 64D2 +5B5E 64C5 +5B5F 64C7 +5B60 64D4 +5B61 64D8 +5B62 64C2 +5B63 64F1 +5B64 64E7 +5B65 64E0 +5B66 64E1 +5B67 64E3 +5B68 64EF +5B69 64F4 +5B6A 64F6 +5B6B 64F2 +5B6C 64FA +5B6D 6500 +5B6E 64FD +5B6F 6518 +5B70 651C +5B71 651D +5B72 6505 +5B73 6524 +5B74 6523 +5B75 652B +5B76 652C +5B77 6534 +5B78 6535 +5B79 6537 +5B7A 6536 +5B7B 6538 +5B7C 754B +5B7D 6548 +5B7E 654E +5B7F 6556 +5B80 654D +5B81 6558 +5B82 6555 +5B83 655D +5B84 6572 +5B85 6578 +5B86 6582 +5B87 6583 +5B88 8B8A +5B89 659B +5B8A 659F +5B8B 65AB +5B8C 65B7 +5B8D 65C3 +5B8E 65C6 +5B8F 65C1 +5B90 65C4 +5B91 65CC +5B92 65D2 +5B93 65D9 +5B94 65E1 +5B95 65E0 +5B96 65F1 +5B97 6600 +5B98 6615 +5B99 6602 +5B9A 6772 +5B9B 6603 +5B9C 65FB +5B9D 6609 +5B9E 663F +5B9F 6635 +5BA0 662E +5BA1 661E +5BA2 6634 +5BA3 661C +5BA4 6624 +5BA5 6644 +5BA6 6649 +5BA7 6665 +5BA8 6657 +5BA9 665E +5BAA 6664 +5BAB 6659 +5BAC 6662 +5BAD 665D +5BAE FA12 +5BAF 6673 +5BB0 6670 +5BB1 6683 +5BB2 6688 +5BB3 6684 +5BB4 6699 +5BB5 6698 +5BB6 66A0 +5BB7 669D +5BB8 66B2 +5BB9 66C4 +5BBA 66C1 +5BBB 66BF +5BBC 66C9 +5BBD 66BE +5BBE 66BC +5BBF 66B8 +5BC0 66D6 +5BC1 66DA +5BC2 66E6 +5BC3 66E9 +5BC4 66F0 +5BC5 66F5 +5BC6 66F7 +5BC7 66FA +5BC8 670E +5BC9 F929 +5BCA 6716 +5BCB 671E +5BCC 7E22 +5BCD 6726 +5BCE 6727 +5BCF 9738 +5BD0 672E +5BD1 673F +5BD2 6736 +5BD3 6737 +5BD4 6738 +5BD5 6746 +5BD6 675E +5BD7 6759 +5BD8 6766 +5BD9 6764 +5BDA 6789 +5BDB 6785 +5BDC 6770 +5BDD 67A9 +5BDE 676A +5BDF 678B +5BE0 6773 +5BE1 67A6 +5BE2 67A1 +5BE3 67BB +5BE4 67B7 +5BE5 67EF +5BE6 67B4 +5BE7 67EC +5BE8 67E9 +5BE9 67B8 +5BEA 67E7 +5BEB 67E4 +5BEC 6852 +5BED 67DD +5BEE 67E2 +5BEF 67EE +5BF0 67C0 +5BF1 67CE +5BF2 67B9 +5BF3 6801 +5BF4 67C6 +5BF5 681E +5BF6 6846 +5BF7 684D +5BF8 6840 +5BF9 6844 +5BFA 6832 +5BFB 684E +5BFC 6863 +5BFD 6859 +5BFE 688D +5C41 6877 +5C42 687F +5C43 689F +5C44 687E +5C45 688F +5C46 68AD +5C47 6894 +5C48 6883 +5C49 68BC +5C4A 68B9 +5C4B 6874 +5C4C 68B5 +5C4D 68BA +5C4E 690F +5C4F 6901 +5C50 68CA +5C51 6908 +5C52 68D8 +5C53 6926 +5C54 68E1 +5C55 690C +5C56 68CD +5C57 68D4 +5C58 68E7 +5C59 68D5 +5C5A 6912 +5C5B 68EF +5C5C 6904 +5C5D 68E3 +5C5E 68E0 +5C5F 68CF +5C60 68C6 +5C61 6922 +5C62 692A +5C63 6921 +5C64 6923 +5C65 6928 +5C66 FA13 +5C67 6979 +5C68 6977 +5C69 6936 +5C6A 6978 +5C6B 6954 +5C6C 696A +5C6D 6974 +5C6E 6968 +5C6F 693D +5C70 6959 +5C71 6930 +5C72 695E +5C73 695D +5C74 697E +5C75 6981 +5C76 69B2 +5C77 69BF +5C78 FA14 +5C79 6998 +5C7A 69C1 +5C7B 69D3 +5C7C 69BE +5C7D 69CE +5C7E 5BE8 +5C7F 69CA +5C80 69B1 +5C81 69DD +5C82 69BB +5C83 69C3 +5C84 69A0 +5C85 699C +5C86 6995 +5C87 69DE +5C88 6A2E +5C89 69E8 +5C8A 6A02 +5C8B 6A1B +5C8C 69FF +5C8D 69F9 +5C8E 69F2 +5C8F 69E7 +5C90 69E2 +5C91 6A1E +5C92 69ED +5C93 6A14 +5C94 69EB +5C95 6A0A +5C96 6A22 +5C97 6A12 +5C98 6A23 +5C99 6A13 +5C9A 6A30 +5C9B 6A6B +5C9C 6A44 +5C9D 6A0C +5C9E 6AA0 +5C9F 6A36 +5CA0 6A78 +5CA1 6A47 +5CA2 6A62 +5CA3 6A59 +5CA4 6A66 +5CA5 6A48 +5CA6 6A46 +5CA7 6A38 +5CA8 6A72 +5CA9 6A73 +5CAA 6A90 +5CAB 6A8D +5CAC 6A84 +5CAD 6AA2 +5CAE 6AA3 +5CAF 6A7E +5CB0 6A97 +5CB1 6AAC +5CB2 6AAA +5CB3 6ABB +5CB4 6AC2 +5CB5 6AB8 +5CB6 6AB3 +5CB7 6AC1 +5CB8 6ADE +5CB9 6AE2 +5CBA 6AD1 +5CBB 6ADA +5CBC 6AE4 +5CBD 8616 +5CBE 8617 +5CBF 6AEA +5CC0 6B05 +5CC1 6B0A +5CC2 6AFA +5CC3 6B12 +5CC4 6B16 +5CC5 6B1F +5CC6 6B38 +5CC7 6B37 +5CC8 6B39 +5CC9 76DC +5CCA 98EE +5CCB 6B47 +5CCC 6B43 +5CCD 6B49 +5CCE 6B50 +5CCF 6B59 +5CD0 6B54 +5CD1 6B5B +5CD2 6B5F +5CD3 6B61 +5CD4 6B78 +5CD5 6B79 +5CD6 6B7F +5CD7 6B80 +5CD8 6B84 +5CD9 6B83 +5CDA 6B8D +5CDB 6B98 +5CDC 6B95 +5CDD 6B9E +5CDE 6BA4 +5CDF 6BAA +5CE0 6BAB +5CE1 6BAF +5CE2 6BB1 +5CE3 6BB2 +5CE4 6BB3 +5CE5 6BB7 +5CE6 6BBC +5CE7 6BC6 +5CE8 6BCB +5CE9 6BD3 +5CEA 6BD6 +5CEB 6BDF +5CEC 6BEC +5CED 6BEB +5CEE 6BF3 +5CEF 6BEF +5CF0 6C08 +5CF1 6C13 +5CF2 6C14 +5CF3 6C1B +5CF4 6C24 +5CF5 6C23 +5CF6 6C3F +5CF7 6C5E +5CF8 6C55 +5CF9 6C5C +5CFA 6C62 +5CFB 6C82 +5CFC 6C8D +5CFD 6C86 +5CFE 6C6F +5D41 6C9A +5D42 6C81 +5D43 6C9B +5D44 6C7E +5D45 6C68 +5D46 6C73 +5D47 6C92 +5D48 6C90 +5D49 6CC4 +5D4A 6CF1 +5D4B 6CBD +5D4C 6CC5 +5D4D 6CAE +5D4E 6CDA +5D4F 6CDD +5D50 6CB1 +5D51 6CBE +5D52 6CBA +5D53 6CDB +5D54 6CEF +5D55 6CD9 +5D56 6CEA +5D57 6D1F +5D58 6D04 +5D59 6D36 +5D5A 6D2B +5D5B 6D3D +5D5C 6D33 +5D5D 6D12 +5D5E 6D0C +5D5F 6D63 +5D60 6D87 +5D61 6D93 +5D62 6D6F +5D63 6D64 +5D64 6D5A +5D65 6D79 +5D66 6D59 +5D67 6D8E +5D68 6D95 +5D69 6D9B +5D6A 6D85 +5D6B 6D96 +5D6C 6DF9 +5D6D 6E0A +5D6E 6E2E +5D6F 6DB5 +5D70 6DE6 +5D71 6DC7 +5D72 6DAC +5D73 6DB8 +5D74 6DCF +5D75 6DC6 +5D76 6DEC +5D77 6DDE +5D78 6DCC +5D79 6DE8 +5D7A 6DF8 +5D7B 6DD2 +5D7C 6DC5 +5D7D 6DFA +5D7E 6DD9 +5D7F 6DF2 +5D80 6DFC +5D81 6DE4 +5D82 6DD5 +5D83 6DEA +5D84 6DEE +5D85 6E2D +5D86 6E6E +5D87 6E19 +5D88 6E72 +5D89 6E5F +5D8A 6E39 +5D8B 6E3E +5D8C 6E23 +5D8D 6E6B +5D8E 6E5C +5D8F 6E2B +5D90 6E76 +5D91 6E4D +5D92 6E1F +5D93 6E27 +5D94 6E43 +5D95 6E3C +5D96 6E3A +5D97 6E4E +5D98 6E24 +5D99 6E1D +5D9A 6E38 +5D9B 6E82 +5D9C 6EAA +5D9D 6E98 +5D9E 6EB7 +5D9F 6EBD +5DA0 6EAF +5DA1 6EC4 +5DA2 6EB2 +5DA3 6ED4 +5DA4 6ED5 +5DA5 6E8F +5DA6 6EBF +5DA7 6EC2 +5DA8 6E9F +5DA9 6F41 +5DAA 6F45 +5DAB 6EEC +5DAC 6EF8 +5DAD 6EFE +5DAE 6F3F +5DAF 6EF2 +5DB0 6F31 +5DB1 6EEF +5DB2 6F32 +5DB3 6ECC +5DB4 6EFF +5DB5 6F3E +5DB6 6F13 +5DB7 6EF7 +5DB8 6F86 +5DB9 6F7A +5DBA 6F78 +5DBB 6F80 +5DBC 6F6F +5DBD 6F5B +5DBE 6F6D +5DBF 6F74 +5DC0 6F82 +5DC1 6F88 +5DC2 6F7C +5DC3 6F58 +5DC4 6FC6 +5DC5 6F8E +5DC6 6F91 +5DC7 6F66 +5DC8 6FB3 +5DC9 6FA3 +5DCA 6FB5 +5DCB 6FA1 +5DCC 6FB9 +5DCD 6FDB +5DCE 6FAA +5DCF 6FC2 +5DD0 6FDF +5DD1 6FD5 +5DD2 6FEC +5DD3 6FD8 +5DD4 6FD4 +5DD5 6FF5 +5DD6 6FEE +5DD7 7005 +5DD8 7007 +5DD9 7009 +5DDA 700B +5DDB 6FFA +5DDC 7011 +5DDD 7001 +5DDE 700F +5DDF 701B +5DE0 701A +5DE1 701F +5DE2 6FF3 +5DE3 7028 +5DE4 7018 +5DE5 7030 +5DE6 703E +5DE7 7032 +5DE8 7051 +5DE9 7063 +5DEA 7085 +5DEB 7099 +5DEC 70AF +5DED 70AB +5DEE 70AC +5DEF 70B8 +5DF0 70AE +5DF1 70DF +5DF2 70CB +5DF3 70D9 +5DF4 7109 +5DF5 710F +5DF6 7104 +5DF7 70F1 +5DF8 70FD +5DF9 711C +5DFA 7119 +5DFB 715C +5DFC 7146 +5DFD 7147 +5DFE 7166 +5E41 7162 +5E42 714C +5E43 7156 +5E44 716C +5E45 7188 +5E46 718F +5E47 7184 +5E48 7195 +5E49 FA15 +5E4A 71AC +5E4B 71C1 +5E4C 71B9 +5E4D 71BE +5E4E 71D2 +5E4F 71E7 +5E50 71C9 +5E51 71D4 +5E52 71D7 +5E53 71CE +5E54 71F5 +5E55 71E0 +5E56 71EC +5E57 71FB +5E58 71FC +5E59 71F9 +5E5A 71FE +5E5B 71FF +5E5C 720D +5E5D 7210 +5E5E 7228 +5E5F 722D +5E60 722C +5E61 7230 +5E62 7232 +5E63 723B +5E64 723C +5E65 723F +5E66 7240 +5E67 7246 +5E68 724B +5E69 7258 +5E6A 7274 +5E6B 727E +5E6C 7281 +5E6D 7287 +5E6E 7282 +5E6F 7292 +5E70 7296 +5E71 72A2 +5E72 72A7 +5E73 72B1 +5E74 72B2 +5E75 72BE +5E76 72C3 +5E77 72C6 +5E78 72C4 +5E79 72B9 +5E7A 72CE +5E7B 72D2 +5E7C 72E2 +5E7D 72E0 +5E7E 72E1 +5E7F 72F9 +5E80 72F7 +5E81 7317 +5E82 730A +5E83 731C +5E84 7316 +5E85 731D +5E86 7324 +5E87 7334 +5E88 7329 +5E89 732F +5E8A FA16 +5E8B 7325 +5E8C 733E +5E8D 734F +5E8E 734E +5E8F 7357 +5E90 9ED8 +5E91 736A +5E92 7368 +5E93 7370 +5E94 7377 +5E95 7378 +5E96 7375 +5E97 737B +5E98 73C8 +5E99 73BD +5E9A 73B3 +5E9B 73CE +5E9C 73BB +5E9D 73C0 +5E9E 73C9 +5E9F 73D6 +5EA0 73E5 +5EA1 73E3 +5EA2 73D2 +5EA3 73EE +5EA4 73F1 +5EA5 73DE +5EA6 73F8 +5EA7 7407 +5EA8 73F5 +5EA9 7405 +5EAA 7426 +5EAB 742A +5EAC 7425 +5EAD 7429 +5EAE 742E +5EAF 7432 +5EB0 743A +5EB1 7455 +5EB2 743F +5EB3 745F +5EB4 7459 +5EB5 7441 +5EB6 745C +5EB7 7469 +5EB8 7470 +5EB9 7463 +5EBA 746A +5EBB 7464 +5EBC 7462 +5EBD 7489 +5EBE 746F +5EBF 747E +5EC0 749F +5EC1 749E +5EC2 74A2 +5EC3 74A7 +5EC4 74CA +5EC5 74CF +5EC6 74D4 +5EC7 74E0 +5EC8 74E3 +5EC9 74E7 +5ECA 74E9 +5ECB 74EE +5ECC 74F0 +5ECD 74F2 +5ECE 74F1 +5ECF 74F7 +5ED0 74F8 +5ED1 7501 +5ED2 7504 +5ED3 7503 +5ED4 7505 +5ED5 750D +5ED6 750C +5ED7 750E +5ED8 7513 +5ED9 751E +5EDA 7526 +5EDB 752C +5EDC 753C +5EDD 7544 +5EDE 754D +5EDF 754A +5EE0 7549 +5EE1 7546 +5EE2 755B +5EE3 755A +5EE4 7564 +5EE5 7567 +5EE6 756B +5EE7 756F +5EE8 7574 +5EE9 756D +5EEA 7578 +5EEB 7576 +5EEC 7582 +5EED 7586 +5EEE 7587 +5EEF 758A +5EF0 7589 +5EF1 7594 +5EF2 759A +5EF3 759D +5EF4 75A5 +5EF5 75A3 +5EF6 75C2 +5EF7 75B3 +5EF8 75C3 +5EF9 75B5 +5EFA 75BD +5EFB 75B8 +5EFC 75BC +5EFD 75B1 +5EFE 75CD +5F41 75CA +5F42 75D2 +5F43 75D9 +5F44 75E3 +5F45 75DE +5F46 75FE +5F47 75FF +5F48 75FC +5F49 7601 +5F4A 75F0 +5F4B 75FA +5F4C 75F2 +5F4D 75F3 +5F4E 760B +5F4F 7609 +5F50 761F +5F51 7627 +5F52 7620 +5F53 7621 +5F54 7622 +5F55 7624 +5F56 7634 +5F57 7630 +5F58 763B +5F59 7647 +5F5A 7648 +5F5B 7658 +5F5C 7646 +5F5D 765C +5F5E 7661 +5F5F 7662 +5F60 7668 +5F61 7669 +5F62 7667 +5F63 766A +5F64 766C +5F65 7670 +5F66 7672 +5F67 7676 +5F68 767C +5F69 7682 +5F6A 7680 +5F6B 7683 +5F6C 7688 +5F6D 768B +5F6E 7699 +5F6F 769A +5F70 769C +5F71 769E +5F72 769B +5F73 76A6 +5F74 76B0 +5F75 76B4 +5F76 76B8 +5F77 76B9 +5F78 76BA +5F79 76C2 +5F7A FA17 +5F7B 76CD +5F7C 76D6 +5F7D 76D2 +5F7E 76DE +5F7F 76E1 +5F80 76E5 +5F81 76EA +5F82 862F +5F83 76FB +5F84 7708 +5F85 7707 +5F86 7704 +5F87 7724 +5F88 7729 +5F89 7725 +5F8A 7726 +5F8B 771B +5F8C 7737 +5F8D 7738 +5F8E 7746 +5F8F 7747 +5F90 775A +5F91 7768 +5F92 776B +5F93 775B +5F94 7765 +5F95 777F +5F96 777E +5F97 7779 +5F98 778E +5F99 778B +5F9A 7791 +5F9B 77A0 +5F9C 779E +5F9D 77B0 +5F9E 77B6 +5F9F 77B9 +5FA0 77BF +5FA1 77BC +5FA2 77BD +5FA3 77BB +5FA4 77C7 +5FA5 77CD +5FA6 77DA +5FA7 77DC +5FA8 77E3 +5FA9 77EE +5FAA 52AF +5FAB 77FC +5FAC 780C +5FAD 7812 +5FAE 7821 +5FAF 783F +5FB0 7820 +5FB1 7845 +5FB2 784E +5FB3 7864 +5FB4 7874 +5FB5 788E +5FB6 787A +5FB7 7886 +5FB8 789A +5FB9 787C +5FBA 788C +5FBB 78A3 +5FBC 78B5 +5FBD 78AA +5FBE 78AF +5FBF 78D1 +5FC0 78C6 +5FC1 78CB +5FC2 78D4 +5FC3 78BE +5FC4 78BC +5FC5 78C5 +5FC6 78CA +5FC7 78EC +5FC8 78E7 +5FC9 78DA +5FCA 78FD +5FCB 78F4 +5FCC 7907 +5FCD 7911 +5FCE 7919 +5FCF 792C +5FD0 792B +5FD1 7930 +5FD2 FA18 +5FD3 7940 +5FD4 7960 +5FD5 FA19 +5FD6 795F +5FD7 795A +5FD8 7955 +5FD9 FA1A +5FDA 797F +5FDB 798A +5FDC 7994 +5FDD FA1B +5FDE 799D +5FDF 799B +5FE0 79AA +5FE1 79B3 +5FE2 79BA +5FE3 79C9 +5FE4 79D5 +5FE5 79E7 +5FE6 79EC +5FE7 79E3 +5FE8 7A08 +5FE9 7A0D +5FEA 7A18 +5FEB 7A19 +5FEC 7A1F +5FED 7A31 +5FEE 7A3E +5FEF 7A37 +5FF0 7A3B +5FF1 7A43 +5FF2 7A57 +5FF3 7A49 +5FF4 7A62 +5FF5 7A61 +5FF6 7A69 +5FF7 9F9D +5FF8 7A70 +5FF9 7A79 +5FFA 7A7D +5FFB 7A88 +5FFC 7A95 +5FFD 7A98 +5FFE 7A96 +6041 7A97 +6042 7AA9 +6043 7AB0 +6044 7AB6 +6045 9083 +6046 7AC3 +6047 7ABF +6048 7AC5 +6049 7AC4 +604A 7AC7 +604B 7ACA +604C 7ACD +604D 7ACF +604E 7AD2 +604F 7AD1 +6050 7AD5 +6051 7AD3 +6052 7AD9 +6053 7ADA +6054 7ADD +6055 7AE1 +6056 7AE2 +6057 7AE6 +6058 7AE7 +6059 FA1C +605A 7AEB +605B 7AED +605C 7AF0 +605D 7AF8 +605E 7B02 +605F 7B0F +6060 7B0B +6061 7B0A +6062 7B06 +6063 7B33 +6064 7B36 +6065 7B19 +6066 7B1E +6067 7B35 +6068 7B28 +6069 7B50 +606A 7B4D +606B 7B4C +606C 7B45 +606D 7B5D +606E 7B75 +606F 7B7A +6070 7B74 +6071 7B70 +6072 7B71 +6073 7B6E +6074 7B9D +6075 7B98 +6076 7B9F +6077 7B8D +6078 7B9C +6079 7B9A +607A 7B92 +607B 7B8F +607C 7B99 +607D 7BCF +607E 7BCB +607F 7BCC +6080 7BB4 +6081 7BC6 +6082 7B9E +6083 7BDD +6084 7BE9 +6085 7BE6 +6086 7BF7 +6087 7BE5 +6088 7C14 +6089 7C00 +608A 7C13 +608B 7C07 +608C 7BF3 +608D 7C0D +608E 7BF6 +608F 7C23 +6090 7C27 +6091 7C2A +6092 7C1F +6093 7C37 +6094 7C2B +6095 7C3D +6096 7C40 +6097 7C4C +6098 7C43 +6099 7C56 +609A 7C50 +609B 7C58 +609C 7C5F +609D 7C65 +609E 7C6C +609F 7C75 +60A0 7C83 +60A1 7C90 +60A2 7CA4 +60A3 7CA2 +60A4 7CAB +60A5 7CA1 +60A6 7CAD +60A7 7CA8 +60A8 7CB3 +60A9 7CB2 +60AA 7CB1 +60AB 7CAE +60AC 7CB9 +60AD FA1D +60AE 7CBD +60AF 7CC5 +60B0 7CC2 +60B1 7CD2 +60B2 7CE2 +60B3 7CD8 +60B4 7CDC +60B5 7CEF +60B6 7CF2 +60B7 7CF4 +60B8 7CF6 +60B9 7D06 +60BA 7D02 +60BB 7D1C +60BC 7D15 +60BD 7D0A +60BE 7D45 +60BF 7D4B +60C0 7D2E +60C1 7D32 +60C2 7D3F +60C3 7D35 +60C4 7D48 +60C5 7D46 +60C6 7D5C +60C7 7D73 +60C8 7D56 +60C9 7D4E +60CA 7D68 +60CB 7D6E +60CC 7D4F +60CD 7D63 +60CE 7D93 +60CF 7D89 +60D0 7D5B +60D1 7DAE +60D2 7DA3 +60D3 7DB5 +60D4 7DB7 +60D5 7DC7 +60D6 7DBD +60D7 7DAB +60D8 7DA2 +60D9 7DAF +60DA 7DA0 +60DB 7DB8 +60DC 7D9F +60DD 7DB0 +60DE 7DD5 +60DF 7DD8 +60E0 7DDD +60E1 7DD6 +60E2 7DE4 +60E3 7DDE +60E4 7DFB +60E5 7E0B +60E6 7DF2 +60E7 7DE1 +60E8 7DDC +60E9 7E05 +60EA 7E0A +60EB 7E21 +60EC 7E12 +60ED 7E1F +60EE 7E09 +60EF 7E3A +60F0 7E46 +60F1 7E66 +60F2 7E31 +60F3 7E3D +60F4 7E35 +60F5 7E3B +60F6 7E39 +60F7 7E43 +60F8 7E37 +60F9 7E32 +60FA 7E5D +60FB 7E56 +60FC 7E5E +60FD 7E52 +60FE 7E59 +6141 7E5A +6142 7E67 +6143 7E79 +6144 7E6A +6145 7E69 +6146 7E7C +6147 7E7B +6148 7E7D +6149 8FAE +614A 7E7F +614B 7E83 +614C 7E89 +614D 7E8E +614E 7E8C +614F 7E92 +6150 7E93 +6151 7E94 +6152 7E96 +6153 7E9B +6154 7F38 +6155 7F3A +6156 7F45 +6157 7F47 +6158 7F4C +6159 7F4E +615A 7F51 +615B 7F55 +615C 7F54 +615D 7F58 +615E 7F5F +615F 7F60 +6160 7F68 +6161 7F67 +6162 7F69 +6163 7F78 +6164 7F82 +6165 7F86 +6166 7F83 +6167 7F87 +6168 7F88 +6169 7F8C +616A 7F94 +616B 7F9E +616C 7F9D +616D 7F9A +616E 7FA1 +616F 7FA3 +6170 7FAF +6171 7FAE +6172 7FB2 +6173 7FB9 +6174 7FB6 +6175 7FB8 +6176 8B71 +6177 FA1E +6178 7FC5 +6179 7FC6 +617A 7FCA +617B 7FD5 +617C 7FE1 +617D 7FE6 +617E 7FE9 +617F 7FF3 +6180 7FF9 +6181 8004 +6182 800B +6183 8012 +6184 8019 +6185 801C +6186 8021 +6187 8028 +6188 803F +6189 803B +618A 804A +618B 8046 +618C 8052 +618D 8058 +618E 805F +618F 8062 +6190 8068 +6191 8073 +6192 8072 +6193 8070 +6194 8076 +6195 8079 +6196 807D +6197 807F +6198 8084 +6199 8085 +619A 8093 +619B 809A +619C 80AD +619D 5190 +619E 80AC +619F 80DB +61A0 80E5 +61A1 80D9 +61A2 80DD +61A3 80C4 +61A4 80DA +61A5 8109 +61A6 80EF +61A7 80F1 +61A8 811B +61A9 8123 +61AA 812F +61AB 814B +61AC 8146 +61AD 813E +61AE 8153 +61AF 8151 +61B0 80FC +61B1 8171 +61B2 816E +61B3 8165 +61B4 815F +61B5 8166 +61B6 8174 +61B7 8183 +61B8 8188 +61B9 818A +61BA 8180 +61BB 8182 +61BC 81A0 +61BD 8195 +61BE 81A3 +61BF 8193 +61C0 81B5 +61C1 81A4 +61C2 81A9 +61C3 81B8 +61C4 81B0 +61C5 81C8 +61C6 81BE +61C7 81BD +61C8 81C0 +61C9 81C2 +61CA 81BA +61CB 81C9 +61CC 81CD +61CD 81D1 +61CE 81D8 +61CF 81D9 +61D0 81DA +61D1 81DF +61D2 81E0 +61D3 81FA +61D4 81FB +61D5 81FE +61D6 8201 +61D7 8202 +61D8 8205 +61D9 820D +61DA 8210 +61DB 8212 +61DC 8216 +61DD 8229 +61DE 822B +61DF 822E +61E0 8238 +61E1 8233 +61E2 8240 +61E3 8259 +61E4 825A +61E5 825D +61E6 825F +61E7 8264 +61E8 8262 +61E9 8268 +61EA 826A +61EB 826B +61EC 8271 +61ED 8277 +61EE 827E +61EF 828D +61F0 8292 +61F1 82AB +61F2 829F +61F3 82BB +61F4 82AC +61F5 82E1 +61F6 82E3 +61F7 82DF +61F8 8301 +61F9 82D2 +61FA 82F4 +61FB 82F3 +61FC 8303 +61FD 82FB +61FE 82F9 +6241 82DE +6242 8306 +6243 82DC +6244 82FA +6245 8309 +6246 82D9 +6247 8335 +6248 8362 +6249 8334 +624A 8316 +624B 8331 +624C 8340 +624D 8339 +624E 8350 +624F 8345 +6250 832F +6251 832B +6252 8318 +6253 839A +6254 83AA +6255 839F +6256 83A2 +6257 8396 +6258 8323 +6259 838E +625A 8375 +625B 837F +625C 838A +625D 837C +625E 83B5 +625F 8373 +6260 8393 +6261 83A0 +6262 8385 +6263 8389 +6264 83A8 +6265 83F4 +6266 8413 +6267 83C7 +6268 83CE +6269 83F7 +626A 83FD +626B 8403 +626C 83D8 +626D 840B +626E 83C1 +626F 8407 +6270 83E0 +6271 83F2 +6272 840D +6273 8420 +6274 83F6 +6275 83BD +6276 83FB +6277 842A +6278 8462 +6279 843C +627A 8484 +627B 8477 +627C 846B +627D 8479 +627E 8448 +627F 846E +6280 8482 +6281 8469 +6282 8446 +6283 846F +6284 8438 +6285 8435 +6286 84CA +6287 84B9 +6288 84BF +6289 849F +628A 84B4 +628B 84CD +628C 84BB +628D 84DA +628E 84D0 +628F 84C1 +6290 84AD +6291 84C6 +6292 84D6 +6293 84A1 +6294 84D9 +6295 84FF +6296 84F4 +6297 8517 +6298 8518 +6299 852C +629A 851F +629B 8515 +629C 8514 +629D 8506 +629E 8553 +629F 855A +62A0 8540 +62A1 8559 +62A2 8563 +62A3 8558 +62A4 8548 +62A5 8541 +62A6 854A +62A7 854B +62A8 856B +62A9 8555 +62AA 8580 +62AB 85A4 +62AC 8588 +62AD 8591 +62AE 858A +62AF 85A8 +62B0 856D +62B1 8594 +62B2 859B +62B3 85AE +62B4 8587 +62B5 859C +62B6 8577 +62B7 857E +62B8 8590 +62B9 FA1F +62BA 820A +62BB 85B0 +62BC 85C9 +62BD 85BA +62BE 85CF +62BF 85B9 +62C0 85D0 +62C1 85D5 +62C2 85DD +62C3 85E5 +62C4 85DC +62C5 85F9 +62C6 860A +62C7 8613 +62C8 860B +62C9 85FE +62CA 8622 +62CB 861A +62CC 8630 +62CD 863F +62CE FA20 +62CF 864D +62D0 4E55 +62D1 8655 +62D2 865F +62D3 8667 +62D4 8671 +62D5 8693 +62D6 86A3 +62D7 86A9 +62D8 868B +62D9 86AA +62DA 868C +62DB 86B6 +62DC 86AF +62DD 86C4 +62DE 86C6 +62DF 86B0 +62E0 86C9 +62E1 86CE +62E2 FA21 +62E3 86AB +62E4 86D4 +62E5 86DE +62E6 86E9 +62E7 86EC +62E8 86DF +62E9 86DB +62EA 8712 +62EB 8706 +62EC 8708 +62ED 8700 +62EE 8703 +62EF 86FB +62F0 8711 +62F1 8709 +62F2 870D +62F3 86F9 +62F4 870A +62F5 8734 +62F6 873F +62F7 873B +62F8 8725 +62F9 8729 +62FA 871A +62FB 875F +62FC 8778 +62FD 874C +62FE 874E +6341 8774 +6342 8757 +6343 8768 +6344 8782 +6345 876A +6346 8760 +6347 876E +6348 8759 +6349 8753 +634A 8763 +634B 877F +634C 87A2 +634D 87C6 +634E 879F +634F 87AF +6350 87CB +6351 87BD +6352 87C0 +6353 87D0 +6354 96D6 +6355 87AB +6356 87C4 +6357 87B3 +6358 87D2 +6359 87BB +635A 87EF +635B 87F2 +635C 87E0 +635D 880E +635E 8807 +635F 880F +6360 8816 +6361 880D +6362 87FE +6363 87F6 +6364 87F7 +6365 8811 +6366 8815 +6367 8822 +6368 8821 +6369 8827 +636A 8831 +636B 8836 +636C 8839 +636D 883B +636E 8842 +636F 8844 +6370 884D +6371 8852 +6372 8859 +6373 885E +6374 8862 +6375 886B +6376 8881 +6377 887E +6378 8875 +6379 887D +637A 8872 +637B 8882 +637C 889E +637D 8897 +637E 8892 +637F 88AE +6380 8899 +6381 88A2 +6382 888D +6383 88A4 +6384 88BF +6385 88B5 +6386 88B1 +6387 88C3 +6388 88C4 +6389 88D4 +638A 88D8 +638B 88D9 +638C 88DD +638D 88F9 +638E 8902 +638F 88FC +6390 88F5 +6391 88E8 +6392 88F2 +6393 8904 +6394 890C +6395 892A +6396 891D +6397 890A +6398 8913 +6399 891E +639A 8925 +639B 892B +639C 8941 +639D 893B +639E 8936 +639F 8943 +63A0 8938 +63A1 894D +63A2 894C +63A3 8960 +63A4 895E +63A5 8966 +63A6 896A +63A7 8964 +63A8 896D +63A9 896F +63AA 8974 +63AB 8977 +63AC 897E +63AD 8983 +63AE 8988 +63AF 898A +63B0 8993 +63B1 8998 +63B2 89A1 +63B3 89A9 +63B4 89A6 +63B5 89AC +63B6 89AF +63B7 89B2 +63B8 89BA +63B9 89BF +63BA 89BD +63BB 89C0 +63BC 89DA +63BD 89DD +63BE 89E7 +63BF 89F4 +63C0 89F8 +63C1 8A03 +63C2 8A16 +63C3 8A10 +63C4 8A0C +63C5 8A12 +63C6 8A1B +63C7 8A1D +63C8 8A25 +63C9 8A36 +63CA 8A41 +63CB 8A37 +63CC 8A5B +63CD 8A52 +63CE 8A46 +63CF 8A48 +63D0 8A7C +63D1 8A6D +63D2 8A6C +63D3 8A62 +63D4 8A79 +63D5 8A85 +63D6 8A82 +63D7 8A84 +63D8 8AA8 +63D9 8AA1 +63DA 8A91 +63DB 8AA5 +63DC 8AA6 +63DD 8A9A +63DE 8AA3 +63DF 8AA7 +63E0 8ACC +63E1 8ABE +63E2 8ACD +63E3 8AC2 +63E4 8ADA +63E5 8AF3 +63E6 8AE7 +63E7 8AE4 +63E8 8AF1 +63E9 8B14 +63EA 8AE0 +63EB 8AE2 +63EC 8AE1 +63ED 8ADF +63EE FA22 +63EF 8AF6 +63F0 8AF7 +63F1 8ADE +63F2 8ADB +63F3 8B0C +63F4 8B07 +63F5 8B1A +63F6 8B16 +63F7 8B10 +63F8 8B17 +63F9 8B20 +63FA 8B33 +63FB 8B41 +63FC 97AB +63FD 8B26 +63FE 8B2B +6441 8B3E +6442 8B4C +6443 8B4F +6444 8B4E +6445 8B53 +6446 8B49 +6447 8B56 +6448 8B5B +6449 8B5A +644A 8B74 +644B 8B6B +644C 8B5F +644D 8B6C +644E 8B6F +644F 8B7D +6450 8B7F +6451 8B80 +6452 8B8C +6453 8B8E +6454 8B99 +6455 8B92 +6456 8B93 +6457 8B96 +6458 8B9A +6459 8C3A +645A 8C41 +645B 8C3F +645C 8C48 +645D 8C4C +645E 8C4E +645F 8C50 +6460 8C55 +6461 8C62 +6462 8C6C +6463 8C78 +6464 8C7A +6465 8C7C +6466 8C82 +6467 8C89 +6468 8C85 +6469 8C8A +646A 8C8D +646B 8C8E +646C 8C98 +646D 8C94 +646E 621D +646F 8CAD +6470 8CAA +6471 8CAE +6472 8CBD +6473 8CB2 +6474 8CB3 +6475 8CC1 +6476 8CB6 +6477 8CC8 +6478 8CCE +6479 8CCD +647A 8CE3 +647B 8CDA +647C 8CF0 +647D 8CF4 +647E 8CFD +647F 8CFA +6480 8CFB +6481 8D07 +6482 8D0A +6483 8D0F +6484 8D0D +6485 8D12 +6486 8D10 +6487 8D13 +6488 8D14 +6489 8D16 +648A 8D67 +648B 8D6D +648C 8D71 +648D 8D76 +648E FA23 +648F 8D81 +6490 8DC2 +6491 8DBE +6492 8DBA +6493 8DCF +6494 8DDA +6495 8DD6 +6496 8DCC +6497 8DDB +6498 8DCB +6499 8DEA +649A 8DEB +649B 8DDF +649C 8DE3 +649D 8DFC +649E 8E08 +649F 8DFF +64A0 8E09 +64A1 8E1D +64A2 8E1E +64A3 8E10 +64A4 8E1F +64A5 8E42 +64A6 8E35 +64A7 8E30 +64A8 8E34 +64A9 8E4A +64AA 8E47 +64AB 8E49 +64AC 8E4C +64AD 8E50 +64AE 8E48 +64AF 8E59 +64B0 8E64 +64B1 8E60 +64B2 8E55 +64B3 8E63 +64B4 8E76 +64B5 8E72 +64B6 8E87 +64B7 8E7C +64B8 8E81 +64B9 8E85 +64BA 8E84 +64BB 8E8B +64BC 8E8A +64BD 8E93 +64BE 8E91 +64BF 8E94 +64C0 8E99 +64C1 8EA1 +64C2 8EAA +64C3 8EB1 +64C4 8EBE +64C5 8EC6 +64C6 8EC5 +64C7 8EC8 +64C8 8ECB +64C9 8ECF +64CA 8EDB +64CB 8EE3 +64CC 8EFC +64CD 8EFB +64CE 8EEB +64CF 8EFE +64D0 8F0A +64D1 8F0C +64D2 8F05 +64D3 8F15 +64D4 8F12 +64D5 8F13 +64D6 8F1C +64D7 8F19 +64D8 8F1F +64D9 8F26 +64DA 8F33 +64DB 8F3B +64DC 8F39 +64DD 8F45 +64DE 8F42 +64DF 8F3E +64E0 8F49 +64E1 8F46 +64E2 8F4C +64E3 8F4E +64E4 8F57 +64E5 8F5C +64E6 8F62 +64E7 8F63 +64E8 8F64 +64E9 8F9C +64EA 8F9F +64EB 8FA3 +64EC 8FA8 +64ED 8FA7 +64EE 8FAD +64EF 8FAF +64F0 8FB7 +64F1 FA24 +64F2 8FDA +64F3 8FE5 +64F4 8FE2 +64F5 8FEF +64F6 8FE9 +64F7 8FF4 +64F8 9005 +64F9 8FF9 +64FA 8FF8 +64FB 9011 +64FC 9015 +64FD 900E +64FE 9021 +6541 900D +6542 901E +6543 9016 +6544 900B +6545 9027 +6546 9036 +6547 9039 +6548 904F +6549 FA25 +654A 9050 +654B 9051 +654C 9052 +654D 9049 +654E 903E +654F 9056 +6550 9058 +6551 905E +6552 9068 +6553 9067 +6554 906F +6555 9076 +6556 96A8 +6557 9072 +6558 9082 +6559 907D +655A 9089 +655B 9080 +655C 908F +655D 6248 +655E 90AF +655F 90B1 +6560 90B5 +6561 90E2 +6562 90E4 +6563 90DB +6564 90DE +6565 9102 +6566 FA26 +6567 9115 +6568 9112 +6569 9119 +656A 9132 +656B 9127 +656C 9130 +656D 914A +656E 9156 +656F 9158 +6570 9163 +6571 9165 +6572 9169 +6573 9173 +6574 9172 +6575 918B +6576 9189 +6577 9182 +6578 91A2 +6579 91AB +657A 91AF +657B 91AA +657C 91B5 +657D 91B4 +657E 91BA +657F 91C0 +6580 91C1 +6581 91CB +6582 91D0 +6583 91DA +6584 91DB +6585 91D7 +6586 91DE +6587 91D6 +6588 91DF +6589 91E1 +658A 91ED +658B 91F5 +658C 91EE +658D 91E4 +658E 91F6 +658F 91E5 +6590 9206 +6591 921E +6592 91FF +6593 9210 +6594 9214 +6595 920A +6596 922C +6597 9215 +6598 9229 +6599 9257 +659A 9245 +659B 923A +659C 9249 +659D 9264 +659E 9240 +659F 923C +65A0 9248 +65A1 924E +65A2 9250 +65A3 9259 +65A4 923F +65A5 9251 +65A6 9239 +65A7 924B +65A8 9267 +65A9 925A +65AA 929C +65AB 92A7 +65AC 9277 +65AD 9278 +65AE 9296 +65AF 9293 +65B0 929B +65B1 9295 +65B2 92E9 +65B3 92CF +65B4 92E7 +65B5 92D7 +65B6 92D9 +65B7 92D0 +65B8 FA27 +65B9 92D5 +65BA 92B9 +65BB 92B7 +65BC 92E0 +65BD 92D3 +65BE 933A +65BF 9335 +65C0 930F +65C1 9325 +65C2 92FA +65C3 9321 +65C4 9344 +65C5 92FB +65C6 FA28 +65C7 9319 +65C8 931E +65C9 92FF +65CA 9322 +65CB 931A +65CC 931D +65CD 9323 +65CE 9302 +65CF 933B +65D0 9370 +65D1 9360 +65D2 937C +65D3 936E +65D4 9356 +65D5 9357 +65D6 93B9 +65D7 93B0 +65D8 93A4 +65D9 93AD +65DA 9394 +65DB 93C8 +65DC 93D6 +65DD 93C6 +65DE 93D7 +65DF 93E8 +65E0 93E5 +65E1 93D8 +65E2 93C3 +65E3 93DD +65E4 93DE +65E5 93D0 +65E6 93E4 +65E7 941A +65E8 93F8 +65E9 9414 +65EA 9413 +65EB 9421 +65EC 9403 +65ED 9407 +65EE 9436 +65EF 942B +65F0 9431 +65F1 943A +65F2 9441 +65F3 9452 +65F4 9445 +65F5 9444 +65F6 9448 +65F7 945B +65F8 945A +65F9 9460 +65FA 9462 +65FB 945E +65FC 946A +65FD 9475 +65FE 9470 +6641 9477 +6642 947F +6643 947D +6644 947C +6645 947E +6646 9481 +6647 9582 +6648 9587 +6649 958A +664A 9592 +664B 9594 +664C 9596 +664D 9598 +664E 9599 +664F 95A0 +6650 95A8 +6651 95A7 +6652 95AD +6653 95BC +6654 95BB +6655 95B9 +6656 95BE +6657 95CA +6658 6FF6 +6659 95C3 +665A 95CD +665B 95CC +665C 95D5 +665D 95D4 +665E 95D6 +665F 95DC +6660 95E1 +6661 95E5 +6662 95E2 +6663 9621 +6664 9628 +6665 962E +6666 962F +6667 9642 +6668 964F +6669 964C +666A 964B +666B 965C +666C 965D +666D 965F +666E 9666 +666F 9677 +6670 9672 +6671 966C +6672 968D +6673 968B +6674 F9DC +6675 9698 +6676 9695 +6677 9697 +6678 FA29 +6679 969D +667A 96A7 +667B 96AA +667C 96B1 +667D 96B2 +667E 96B0 +667F 96AF +6680 96B4 +6681 96B6 +6682 96B8 +6683 96B9 +6684 96CE +6685 96CB +6686 96D5 +6687 96DC +6688 96D9 +6689 96F9 +668A 9704 +668B 9706 +668C 9708 +668D 9719 +668E 970D +668F 9713 +6690 970E +6691 9711 +6692 970F +6693 9716 +6694 9724 +6695 972A +6696 9730 +6697 9733 +6698 9739 +6699 973B +669A 973D +669B 973E +669C 9746 +669D 9744 +669E 9743 +669F 9748 +66A0 9742 +66A1 9749 +66A2 974D +66A3 974F +66A4 9751 +66A5 9755 +66A6 975C +66A7 9760 +66A8 9764 +66A9 9766 +66AA 9768 +66AB 976D +66AC 9779 +66AD 9785 +66AE 977C +66AF 9781 +66B0 977A +66B1 978B +66B2 978F +66B3 9790 +66B4 979C +66B5 97A8 +66B6 97A6 +66B7 97A3 +66B8 97B3 +66B9 97B4 +66BA 97C3 +66BB 97C6 +66BC 97C8 +66BD 97CB +66BE 97DC +66BF 97ED +66C0 97F2 +66C1 7ADF +66C2 97F5 +66C3 980F +66C4 981A +66C5 9824 +66C6 9821 +66C7 9837 +66C8 983D +66C9 984F +66CA 984B +66CB 9857 +66CC 9865 +66CD 986B +66CE 986F +66CF 9870 +66D0 9871 +66D1 9874 +66D2 9873 +66D3 98AA +66D4 98AF +66D5 98B1 +66D6 98B6 +66D7 98C4 +66D8 98C3 +66D9 98C6 +66DA 98DC +66DB 98ED +66DC 98E9 +66DD FA2A +66DE 98EB +66DF FA2B +66E0 9903 +66E1 991D +66E2 9912 +66E3 9914 +66E4 9918 +66E5 9927 +66E6 FA2C +66E7 9921 +66E8 991E +66E9 9924 +66EA 9920 +66EB 992C +66EC 992E +66ED 993D +66EE 993E +66EF 9942 +66F0 9949 +66F1 9945 +66F2 9950 +66F3 994B +66F4 9951 +66F5 994C +66F6 9955 +66F7 9997 +66F8 9998 +66F9 999E +66FA 99A5 +66FB 99AD +66FC 99AE +66FD 99BC +66FE 99DF +6741 99DB +6742 99DD +6743 99D8 +6744 99D1 +6745 99ED +6746 99EE +6747 99E2 +6748 99F1 +6749 99F2 +674A 99FB +674B 99F8 +674C 9A01 +674D 9A0F +674E 9A05 +674F 9A19 +6750 9A2B +6751 9A37 +6752 9A40 +6753 9A45 +6754 9A42 +6755 9A43 +6756 9A3E +6757 9A55 +6758 9A4D +6759 9A4E +675A 9A5B +675B 9A57 +675C 9A5F +675D 9A62 +675E 9A69 +675F 9A65 +6760 9A64 +6761 9A6A +6762 9A6B +6763 9AAD +6764 9AB0 +6765 9ABC +6766 9AC0 +6767 9ACF +6768 9AD3 +6769 9AD4 +676A 9AD1 +676B 9AD9 +676C 9ADC +676D 9ADE +676E 9ADF +676F 9AE2 +6770 9AE3 +6771 9AE6 +6772 9AEF +6773 9AEB +6774 9AEE +6775 9AF4 +6776 9AF1 +6777 9AF7 +6778 9AFB +6779 9B06 +677A 9B18 +677B 9B1A +677C 9B1F +677D 9B22 +677E 9B23 +677F 9B25 +6780 9B27 +6781 9B28 +6782 9B29 +6783 9B2A +6784 9B2E +6785 9B2F +6786 9B31 +6787 9B32 +6788 9B3B +6789 9B44 +678A 9B43 +678B 9B4D +678C 9B4E +678D 9B51 +678E 9B58 +678F 9B75 +6790 9B74 +6791 9B72 +6792 9B93 +6793 9B8F +6794 9B83 +6795 9B91 +6796 9B96 +6797 9B97 +6798 9B9F +6799 9BA0 +679A 9BA8 +679B 9BB1 +679C 9BB4 +679D 9BC0 +679E 9BCA +679F 9BBB +67A0 9BB9 +67A1 9BC6 +67A2 9BCF +67A3 9BD1 +67A4 9BD2 +67A5 9BE3 +67A6 9BE2 +67A7 9BE4 +67A8 9BD4 +67A9 9BE1 +67AA 9BF5 +67AB 9BF1 +67AC 9BF2 +67AD 9C04 +67AE 9C1B +67AF 9C15 +67B0 9C14 +67B1 9C00 +67B2 9C09 +67B3 9C13 +67B4 9C0C +67B5 9C06 +67B6 9C08 +67B7 9C12 +67B8 9C0A +67B9 9C2E +67BA 9C25 +67BB 9C24 +67BC 9C21 +67BD 9C30 +67BE 9C47 +67BF 9C32 +67C0 9C46 +67C1 9C3E +67C2 9C5A +67C3 9C60 +67C4 9C67 +67C5 9C76 +67C6 9C78 +67C7 9CEB +67C8 9CE7 +67C9 9CEC +67CA 9CF0 +67CB 9D09 +67CC 9D03 +67CD 9D06 +67CE 9D2A +67CF 9D26 +67D0 9D2C +67D1 9D23 +67D2 9D1F +67D3 9D15 +67D4 9D12 +67D5 9D41 +67D6 9D3F +67D7 9D44 +67D8 9D3E +67D9 9D46 +67DA 9D48 +67DB 9D5D +67DC 9D5E +67DD 9D59 +67DE 9D51 +67DF 9D50 +67E0 9D64 +67E1 9D72 +67E2 9D70 +67E3 9D87 +67E4 9D6B +67E5 9D6F +67E6 9D7A +67E7 9D9A +67E8 9DA4 +67E9 9DA9 +67EA 9DAB +67EB 9DB2 +67EC 9DC4 +67ED 9DC1 +67EE 9DBB +67EF 9DB8 +67F0 9DBA +67F1 9DC6 +67F2 9DCF +67F3 9DC2 +67F4 FA2D +67F5 9DD9 +67F6 9DD3 +67F7 9DF8 +67F8 9DE6 +67F9 9DED +67FA 9DEF +67FB 9DFD +67FC 9E1A +67FD 9E1B +67FE 9E19 +6841 9E1E +6842 9E75 +6843 9E79 +6844 9E7D +6845 9E81 +6846 9E88 +6847 9E8B +6848 9E8C +6849 9E95 +684A 9E91 +684B 9E9D +684C 9EA5 +684D 9EB8 +684E 9EAA +684F 9EAD +6850 9EBC +6851 9EBE +6852 9761 +6853 9ECC +6854 9ECF +6855 9ED0 +6856 9ED1 +6857 9ED4 +6858 9EDC +6859 9EDE +685A 9EDD +685B 9EE0 +685C 9EE5 +685D 9EE8 +685E 9EEF +685F 9EF4 +6860 9EF6 +6861 9EF7 +6862 9EF9 +6863 9EFB +6864 9EFC +6865 9EFD +6866 9F07 +6867 9F08 +6868 76B7 +6869 9F15 +686A 9F21 +686B 9F2C +686C 9F3E +686D 9F4A +686E 9F4E +686F 9F4F +6870 9F52 +6871 9F54 +6872 9F63 +6873 9F5F +6874 9F60 +6875 9F61 +6876 9F66 +6877 9F67 +6878 9F6C +6879 9F6A +687A 9F77 +687B 9F72 +687C 9F76 +687D 9F95 +687E 9F9C +687F 9FA0 +6880 5C2D +6881 69D9 +6882 9065 +6883 7476 +6884 51DC +6885 7155 +6941 E000 +6942 E001 +6943 E002 +6944 E003 +6945 E004 +6946 E005 +6947 E006 +6948 E007 +6949 E008 +694A E009 +694B E00A +694C E00B +694D E00C +694E E00D +694F E00E +6950 E00F +6951 E010 +6952 E011 +6953 E012 +6954 E013 +6955 E014 +6956 E015 +6957 E016 +6958 E017 +6959 E018 +695A E019 +695B E01A +695C E01B +695D E01C +695E E01D +695F E01E +6960 E01F +6961 E020 +6962 E021 +6963 E022 +6964 E023 +6965 E024 +6966 E025 +6967 E026 +6968 E027 +6969 E028 +696A E029 +696B E02A +696C E02B +696D E02C +696E E02D +696F E02E +6970 E02F +6971 E030 +6972 E031 +6973 E032 +6974 E033 +6975 E034 +6976 E035 +6977 E036 +6978 E037 +6979 E038 +697A E039 +697B E03A +697C E03B +697D E03C +697E E03D +697F E03E +6980 E03F +6981 E040 +6982 E041 +6983 E042 +6984 E043 +6985 E044 +6986 E045 +6987 E046 +6988 E047 +6989 E048 +698A E049 +698B E04A +698C E04B +698D E04C +698E E04D +698F E04E +6990 E04F +6991 E050 +6992 E051 +6993 E052 +6994 E053 +6995 E054 +6996 E055 +6997 E056 +6998 E057 +6999 E058 +699A E059 +699B E05A +699C E05B +699D E05C +699E E05D +699F E05E +69A0 E05F +69A1 E060 +69A2 E061 +69A3 E062 +69A4 E063 +69A5 E064 +69A6 E065 +69A7 E066 +69A8 E067 +69A9 E068 +69AA E069 +69AB E06A +69AC E06B +69AD E06C +69AE E06D +69AF E06E +69B0 E06F +69B1 E070 +69B2 E071 +69B3 E072 +69B4 E073 +69B5 E074 +69B6 E075 +69B7 E076 +69B8 E077 +69B9 E078 +69BA E079 +69BB E07A +69BC E07B +69BD E07C +69BE E07D +69BF E07E +69C0 E07F +69C1 E080 +69C2 E081 +69C3 E082 +69C4 E083 +69C5 E084 +69C6 E085 +69C7 E086 +69C8 E087 +69C9 E088 +69CA E089 +69CB E08A +69CC E08B +69CD E08C +69CE E08D +69CF E08E +69D0 E08F +69D1 E090 +69D2 E091 +69D3 E092 +69D4 E093 +69D5 E094 +69D6 E095 +69D7 E096 +69D8 E097 +69D9 E098 +69DA E099 +69DB E09A +69DC E09B +69DD E09C +69DE E09D +69DF E09E +69E0 E09F +69E1 E0A0 +69E2 E0A1 +69E3 E0A2 +69E4 E0A3 +69E5 E0A4 +69E6 E0A5 +69E7 E0A6 +69E8 E0A7 +69E9 E0A8 +69EA E0A9 +69EB E0AA +69EC E0AB +69ED E0AC +69EE E0AD +69EF E0AE +69F0 E0AF +69F1 E0B0 +69F2 E0B1 +69F3 E0B2 +69F4 E0B3 +69F5 E0B4 +69F6 E0B5 +69F7 E0B6 +69F8 E0B7 +69F9 E0B8 +69FA E0B9 +69FB E0BA +69FC E0BB +69FD E0BC +69FE E0BD +6A41 E0BE +6A42 E0BF +6A43 E0C0 +6A44 E0C1 +6A45 E0C2 +6A46 E0C3 +6A47 E0C4 +6A48 E0C5 +6A49 E0C6 +6A4A E0C7 +6A4B E0C8 +6A4C E0C9 +6A4D E0CA +6A4E E0CB +6A4F E0CC +6A50 E0CD +6A51 E0CE +6A52 E0CF +6A53 E0D0 +6A54 E0D1 +6A55 E0D2 +6A56 E0D3 +6A57 E0D4 +6A58 E0D5 +6A59 E0D6 +6A5A E0D7 +6A5B E0D8 +6A5C E0D9 +6A5D E0DA +6A5E E0DB +6A5F E0DC +6A60 E0DD +6A61 E0DE +6A62 E0DF +6A63 E0E0 +6A64 E0E1 +6A65 E0E2 +6A66 E0E3 +6A67 E0E4 +6A68 E0E5 +6A69 E0E6 +6A6A E0E7 +6A6B E0E8 +6A6C E0E9 +6A6D E0EA +6A6E E0EB +6A6F E0EC +6A70 E0ED +6A71 E0EE +6A72 E0EF +6A73 E0F0 +6A74 E0F1 +6A75 E0F2 +6A76 E0F3 +6A77 E0F4 +6A78 E0F5 +6A79 E0F6 +6A7A E0F7 +6A7B E0F8 +6A7C E0F9 +6A7D E0FA +6A7E E0FB +6A7F E0FC +6A80 E0FD +6A81 E0FE +6A82 E0FF +6A83 E100 +6A84 E101 +6A85 E102 +6A86 E103 +6A87 E104 +6A88 E105 +6A89 E106 +6A8A E107 +6A8B E108 +6A8C E109 +6A8D E10A +6A8E E10B +6A8F E10C +6A90 E10D +6A91 E10E +6A92 E10F +6A93 E110 +6A94 E111 +6A95 E112 +6A96 E113 +6A97 E114 +6A98 E115 +6A99 E116 +6A9A E117 +6A9B E118 +6A9C E119 +6A9D E11A +6A9E E11B +6A9F E11C +6AA0 E11D +6AA1 E11E +6AA2 E11F +6AA3 E120 +6AA4 E121 +6AA5 E122 +6AA6 E123 +6AA7 E124 +6AA8 E125 +6AA9 E126 +6AAA E127 +6AAB E128 +6AAC E129 +6AAD E12A +6AAE E12B +6AAF E12C +6AB0 E12D +6AB1 E12E +6AB2 E12F +6AB3 E130 +6AB4 E131 +6AB5 E132 +6AB6 E133 +6AB7 E134 +6AB8 E135 +6AB9 E136 +6ABA E137 +6ABB E138 +6ABC E139 +6ABD E13A +6ABE E13B +6ABF E13C +6AC0 E13D +6AC1 E13E +6AC2 E13F +6AC3 E140 +6AC4 E141 +6AC5 E142 +6AC6 E143 +6AC7 E144 +6AC8 E145 +6AC9 E146 +6ACA E147 +6ACB E148 +6ACC E149 +6ACD E14A +6ACE E14B +6ACF E14C +6AD0 E14D +6AD1 E14E +6AD2 E14F +6AD3 E150 +6AD4 E151 +6AD5 E152 +6AD6 E153 +6AD7 E154 +6AD8 E155 +6AD9 E156 +6ADA E157 +6ADB E158 +6ADC E159 +6ADD E15A +6ADE E15B +6ADF E15C +6AE0 E15D +6AE1 E15E +6AE2 E15F +6AE3 E160 +6AE4 E161 +6AE5 E162 +6AE6 E163 +6AE7 E164 +6AE8 E165 +6AE9 E166 +6AEA E167 +6AEB E168 +6AEC E169 +6AED E16A +6AEE E16B +6AEF E16C +6AF0 E16D +6AF1 E16E +6AF2 E16F +6AF3 E170 +6AF4 E171 +6AF5 E172 +6AF6 E173 +6AF7 E174 +6AF8 E175 +6AF9 E176 +6AFA E177 +6AFB E178 +6AFC E179 +6AFD E17A +6AFE E17B +6B41 E17C +6B42 E17D +6B43 E17E +6B44 E17F +6B45 E180 +6B46 E181 +6B47 E182 +6B48 E183 +6B49 E184 +6B4A E185 +6B4B E186 +6B4C E187 +6B4D E188 +6B4E E189 +6B4F E18A +6B50 E18B +6B51 E18C +6B52 E18D +6B53 E18E +6B54 E18F +6B55 E190 +6B56 E191 +6B57 E192 +6B58 E193 +6B59 E194 +6B5A E195 +6B5B E196 +6B5C E197 +6B5D E198 +6B5E E199 +6B5F E19A +6B60 E19B +6B61 E19C +6B62 E19D +6B63 E19E +6B64 E19F +6B65 E1A0 +6B66 E1A1 +6B67 E1A2 +6B68 E1A3 +6B69 E1A4 +6B6A E1A5 +6B6B E1A6 +6B6C E1A7 +6B6D E1A8 +6B6E E1A9 +6B6F E1AA +6B70 E1AB +6B71 E1AC +6B72 E1AD +6B73 E1AE +6B74 E1AF +6B75 E1B0 +6B76 E1B1 +6B77 E1B2 +6B78 E1B3 +6B79 E1B4 +6B7A E1B5 +6B7B E1B6 +6B7C E1B7 +6B7D E1B8 +6B7E E1B9 +6B7F E1BA +6B80 E1BB +6B81 E1BC +6B82 E1BD +6B83 E1BE +6B84 E1BF +6B85 E1C0 +6B86 E1C1 +6B87 E1C2 +6B88 E1C3 +6B89 E1C4 +6B8A E1C5 +6B8B E1C6 +6B8C E1C7 +6B8D E1C8 +6B8E E1C9 +6B8F E1CA +6B90 E1CB +6B91 E1CC +6B92 E1CD +6B93 E1CE +6B94 E1CF +6B95 E1D0 +6B96 E1D1 +6B97 E1D2 +6B98 E1D3 +6B99 E1D4 +6B9A E1D5 +6B9B E1D6 +6B9C E1D7 +6B9D E1D8 +6B9E E1D9 +6B9F E1DA +6BA0 E1DB +6BA1 E1DC +6BA2 E1DD +6BA3 E1DE +6BA4 E1DF +6BA5 E1E0 +6BA6 E1E1 +6BA7 E1E2 +6BA8 E1E3 +6BA9 E1E4 +6BAA E1E5 +6BAB E1E6 +6BAC E1E7 +6BAD E1E8 +6BAE E1E9 +6BAF E1EA +6BB0 E1EB +6BB1 E1EC +6BB2 E1ED +6BB3 E1EE +6BB4 E1EF +6BB5 E1F0 +6BB6 E1F1 +6BB7 E1F2 +6BB8 E1F3 +6BB9 E1F4 +6BBA E1F5 +6BBB E1F6 +6BBC E1F7 +6BBD E1F8 +6BBE E1F9 +6BBF E1FA +6BC0 E1FB +6BC1 E1FC +6BC2 E1FD +6BC3 E1FE +6BC4 E1FF +6BC5 E200 +6BC6 E201 +6BC7 E202 +6BC8 E203 +6BC9 E204 +6BCA E205 +6BCB E206 +6BCC E207 +6BCD E208 +6BCE E209 +6BCF E20A +6BD0 E20B +6BD1 E20C +6BD2 E20D +6BD3 E20E +6BD4 E20F +6BD5 E210 +6BD6 E211 +6BD7 E212 +6BD8 E213 +6BD9 E214 +6BDA E215 +6BDB E216 +6BDC E217 +6BDD E218 +6BDE E219 +6BDF E21A +6BE0 E21B +6BE1 E21C +6BE2 E21D +6BE3 E21E +6BE4 E21F +6BE5 E220 +6BE6 E221 +6BE7 E222 +6BE8 E223 +6BE9 E224 +6BEA E225 +6BEB E226 +6BEC E227 +6BED E228 +6BEE E229 +6BEF E22A +6BF0 E22B +6BF1 E22C +6BF2 E22D +6BF3 E22E +6BF4 E22F +6BF5 E230 +6BF6 E231 +6BF7 E232 +6BF8 E233 +6BF9 E234 +6BFA E235 +6BFB E236 +6BFC E237 +6BFD E238 +6BFE E239 +6C41 E23A +6C42 E23B +6C43 E23C +6C44 E23D +6C45 E23E +6C46 E23F +6C47 E240 +6C48 E241 +6C49 E242 +6C4A E243 +6C4B E244 +6C4C E245 +6C4D E246 +6C4E E247 +6C4F E248 +6C50 E249 +6C51 E24A +6C52 E24B +6C53 E24C +6C54 E24D +6C55 E24E +6C56 E24F +6C57 E250 +6C58 E251 +6C59 E252 +6C5A E253 +6C5B E254 +6C5C E255 +6C5D E256 +6C5E E257 +6C5F E258 +6C60 E259 +6C61 E25A +6C62 E25B +6C63 E25C +6C64 E25D +6C65 E25E +6C66 E25F +6C67 E260 +6C68 E261 +6C69 E262 +6C6A E263 +6C6B E264 +6C6C E265 +6C6D E266 +6C6E E267 +6C6F E268 +6C70 E269 +6C71 E26A +6C72 E26B +6C73 E26C +6C74 E26D +6C75 E26E +6C76 E26F +6C77 E270 +6C78 E271 +6C79 E272 +6C7A E273 +6C7B E274 +6C7C E275 +6C7D E276 +6C7E E277 +6C7F E278 +6C80 E279 +6C81 E27A +6C82 E27B +6C83 E27C +6C84 E27D +6C85 E27E +6C86 E27F +6C87 E280 +6C88 E281 +6C89 E282 +6C8A E283 +6C8B E284 +6C8C E285 +6C8D E286 +6C8E E287 +6C8F E288 +6C90 E289 +6C91 E28A +6C92 E28B +6C93 E28C +6C94 E28D +6C95 E28E +6C96 E28F +6C97 E290 +6C98 E291 +6C99 E292 +6C9A E293 +6C9B E294 +6C9C E295 +6C9D E296 +6C9E E297 +6C9F E298 +6CA0 E299 +6CA1 E29A +6CA2 E29B +6CA3 E29C +6CA4 E29D +6CA5 E29E +6CA6 E29F +6CA7 E2A0 +6CA8 E2A1 +6CA9 E2A2 +6CAA E2A3 +6CAB E2A4 +6CAC E2A5 +6CAD E2A6 +6CAE E2A7 +6CAF E2A8 +6CB0 E2A9 +6CB1 E2AA +6CB2 E2AB +6CB3 E2AC +6CB4 E2AD +6CB5 E2AE +6CB6 E2AF +6CB7 E2B0 +6CB8 E2B1 +6CB9 E2B2 +6CBA E2B3 +6CBB E2B4 +6CBC E2B5 +6CBD E2B6 +6CBE E2B7 +6CBF E2B8 +6CC0 E2B9 +6CC1 E2BA +6CC2 E2BB +6CC3 E2BC +6CC4 E2BD +6CC5 E2BE +6CC6 E2BF +6CC7 E2C0 +6CC8 E2C1 +6CC9 E2C2 +6CCA E2C3 +6CCB E2C4 +6CCC E2C5 +6CCD E2C6 +6CCE E2C7 +6CCF E2C8 +6CD0 E2C9 +6CD1 E2CA +6CD2 E2CB +6CD3 E2CC +6CD4 E2CD +6CD5 E2CE +6CD6 E2CF +6CD7 E2D0 +6CD8 E2D1 +6CD9 E2D2 +6CDA E2D3 +6CDB E2D4 +6CDC E2D5 +6CDD E2D6 +6CDE E2D7 +6CDF E2D8 +6CE0 E2D9 +6CE1 E2DA +6CE2 E2DB +6CE3 E2DC +6CE4 E2DD +6CE5 E2DE +6CE6 E2DF +6CE7 E2E0 +6CE8 E2E1 +6CE9 E2E2 +6CEA E2E3 +6CEB E2E4 +6CEC E2E5 +6CED E2E6 +6CEE E2E7 +6CEF E2E8 +6CF0 E2E9 +6CF1 E2EA +6CF2 E2EB +6CF3 E2EC +6CF4 E2ED +6CF5 E2EE +6CF6 E2EF +6CF7 E2F0 +6CF8 E2F1 +6CF9 E2F2 +6CFA E2F3 +6CFB E2F4 +6CFC E2F5 +6CFD E2F6 +6CFE E2F7 +6D41 E2F8 +6D42 E2F9 +6D43 E2FA +6D44 E2FB +6D45 E2FC +6D46 E2FD +6D47 E2FE +6D48 E2FF +6D49 E300 +6D4A E301 +6D4B E302 +6D4C E303 +6D4D E304 +6D4E E305 +6D4F E306 +6D50 E307 +6D51 E308 +6D52 E309 +6D53 E30A +6D54 E30B +6D55 E30C +6D56 E30D +6D57 E30E +6D58 E30F +6D59 E310 +6D5A E311 +6D5B E312 +6D5C E313 +6D5D E314 +6D5E E315 +6D5F E316 +6D60 E317 +6D61 E318 +6D62 E319 +6D63 E31A +6D64 E31B +6D65 E31C +6D66 E31D +6D67 E31E +6D68 E31F +6D69 E320 +6D6A E321 +6D6B E322 +6D6C E323 +6D6D E324 +6D6E E325 +6D6F E326 +6D70 E327 +6D71 E328 +6D72 E329 +6D73 E32A +6D74 E32B +6D75 E32C +6D76 E32D +6D77 E32E +6D78 E32F +6D79 E330 +6D7A E331 +6D7B E332 +6D7C E333 +6D7D E334 +6D7E E335 +6D7F E336 +6D80 E337 +6D81 E338 +6D82 E339 +6D83 E33A +6D84 E33B +6D85 E33C +6D86 E33D +6D87 E33E +6D88 E33F +6D89 E340 +6D8A E341 +6D8B E342 +6D8C E343 +6D8D E344 +6D8E E345 +6D8F E346 +6D90 E347 +6D91 E348 +6D92 E349 +6D93 E34A +6D94 E34B +6D95 E34C +6D96 E34D +6D97 E34E +6D98 E34F +6D99 E350 +6D9A E351 +6D9B E352 +6D9C E353 +6D9D E354 +6D9E E355 +6D9F E356 +6DA0 E357 +6DA1 E358 +6DA2 E359 +6DA3 E35A +6DA4 E35B +6DA5 E35C +6DA6 E35D +6DA7 E35E +6DA8 E35F +6DA9 E360 +6DAA E361 +6DAB E362 +6DAC E363 +6DAD E364 +6DAE E365 +6DAF E366 +6DB0 E367 +6DB1 E368 +6DB2 E369 +6DB3 E36A +6DB4 E36B +6DB5 E36C +6DB6 E36D +6DB7 E36E +6DB8 E36F +6DB9 E370 +6DBA E371 +6DBB E372 +6DBC E373 +6DBD E374 +6DBE E375 +6DBF E376 +6DC0 E377 +6DC1 E378 +6DC2 E379 +6DC3 E37A +6DC4 E37B +6DC5 E37C +6DC6 E37D +6DC7 E37E +6DC8 E37F +6DC9 E380 +6DCA E381 +6DCB E382 +6DCC E383 +6DCD E384 +6DCE E385 +6DCF E386 +6DD0 E387 +6DD1 E388 +6DD2 E389 +6DD3 E38A +6DD4 E38B +6DD5 E38C +6DD6 E38D +6DD7 E38E +6DD8 E38F +6DD9 E390 +6DDA E391 +6DDB E392 +6DDC E393 +6DDD E394 +6DDE E395 +6DDF E396 +6DE0 E397 +6DE1 E398 +6DE2 E399 +6DE3 E39A +6DE4 E39B +6DE5 E39C +6DE6 E39D +6DE7 E39E +6DE8 E39F +6DE9 E3A0 +6DEA E3A1 +6DEB E3A2 +6DEC E3A3 +6DED E3A4 +6DEE E3A5 +6DEF E3A6 +6DF0 E3A7 +6DF1 E3A8 +6DF2 E3A9 +6DF3 E3AA +6DF4 E3AB +6DF5 E3AC +6DF6 E3AD +6DF7 E3AE +6DF8 E3AF +6DF9 E3B0 +6DFA E3B1 +6DFB E3B2 +6DFC E3B3 +6DFD E3B4 +6DFE E3B5 +6E41 E3B6 +6E42 E3B7 +6E43 E3B8 +6E44 E3B9 +6E45 E3BA +6E46 E3BB +6E47 E3BC +6E48 E3BD +6E49 E3BE +6E4A E3BF +6E4B E3C0 +6E4C E3C1 +6E4D E3C2 +6E4E E3C3 +6E4F E3C4 +6E50 E3C5 +6E51 E3C6 +6E52 E3C7 +6E53 E3C8 +6E54 E3C9 +6E55 E3CA +6E56 E3CB +6E57 E3CC +6E58 E3CD +6E59 E3CE +6E5A E3CF +6E5B E3D0 +6E5C E3D1 +6E5D E3D2 +6E5E E3D3 +6E5F E3D4 +6E60 E3D5 +6E61 E3D6 +6E62 E3D7 +6E63 E3D8 +6E64 E3D9 +6E65 E3DA +6E66 E3DB +6E67 E3DC +6E68 E3DD +6E69 E3DE +6E6A E3DF +6E6B E3E0 +6E6C E3E1 +6E6D E3E2 +6E6E E3E3 +6E6F E3E4 +6E70 E3E5 +6E71 E3E6 +6E72 E3E7 +6E73 E3E8 +6E74 E3E9 +6E75 E3EA +6E76 E3EB +6E77 E3EC +6E78 E3ED +6E79 E3EE +6E7A E3EF +6E7B E3F0 +6E7C E3F1 +6E7D E3F2 +6E7E E3F3 +6E7F E3F4 +6E80 E3F5 +6E81 E3F6 +6E82 E3F7 +6E83 E3F8 +6E84 E3F9 +6E85 E3FA +6E86 E3FB +6E87 E3FC +6E88 E3FD +6E89 E3FE +6E8A E3FF +6E8B E400 +6E8C E401 +6E8D E402 +6E8E E403 +6E8F E404 +6E90 E405 +6E91 E406 +6E92 E407 +6E93 E408 +6E94 E409 +6E95 E40A +6E96 E40B +6E97 E40C +6E98 E40D +6E99 E40E +6E9A E40F +6E9B E410 +6E9C E411 +6E9D E412 +6E9E E413 +6E9F E414 +6EA0 E415 +6EA1 E416 +6EA2 E417 +6EA3 E418 +6EA4 E419 +6EA5 E41A +6EA6 E41B +6EA7 E41C +6EA8 E41D +6EA9 E41E +6EAA E41F +6EAB E420 +6EAC E421 +6EAD E422 +6EAE E423 +6EAF E424 +6EB0 E425 +6EB1 E426 +6EB2 E427 +6EB3 E428 +6EB4 E429 +6EB5 E42A +6EB6 E42B +6EB7 E42C +6EB8 E42D +6EB9 E42E +6EBA E42F +6EBB E430 +6EBC E431 +6EBD E432 +6EBE E433 +6EBF E434 +6EC0 E435 +6EC1 E436 +6EC2 E437 +6EC3 E438 +6EC4 E439 +6EC5 E43A +6EC6 E43B +6EC7 E43C +6EC8 E43D +6EC9 E43E +6ECA E43F +6ECB E440 +6ECC E441 +6ECD E442 +6ECE E443 +6ECF E444 +6ED0 E445 +6ED1 E446 +6ED2 E447 +6ED3 E448 +6ED4 E449 +6ED5 E44A +6ED6 E44B +6ED7 E44C +6ED8 E44D +6ED9 E44E +6EDA E44F +6EDB E450 +6EDC E451 +6EDD E452 +6EDE E453 +6EDF E454 +6EE0 E455 +6EE1 E456 +6EE2 E457 +6EE3 E458 +6EE4 E459 +6EE5 E45A +6EE6 E45B +6EE7 E45C +6EE8 E45D +6EE9 E45E +6EEA E45F +6EEB E460 +6EEC E461 +6EED E462 +6EEE E463 +6EEF E464 +6EF0 E465 +6EF1 E466 +6EF2 E467 +6EF3 E468 +6EF4 E469 +6EF5 E46A +6EF6 E46B +6EF7 E46C +6EF8 E46D +6EF9 E46E +6EFA E46F +6EFB E470 +6EFC E471 +6EFD E472 +6EFE E473 +6F41 E474 +6F42 E475 +6F43 E476 +6F44 E477 +6F45 E478 +6F46 E479 +6F47 E47A +6F48 E47B +6F49 E47C +6F4A E47D +6F4B E47E +6F4C E47F +6F4D E480 +6F4E E481 +6F4F E482 +6F50 E483 +6F51 E484 +6F52 E485 +6F53 E486 +6F54 E487 +6F55 E488 +6F56 E489 +6F57 E48A +6F58 E48B +6F59 E48C +6F5A E48D +6F5B E48E +6F5C E48F +6F5D E490 +6F5E E491 +6F5F E492 +6F60 E493 +6F61 E494 +6F62 E495 +6F63 E496 +6F64 E497 +6F65 E498 +6F66 E499 +6F67 E49A +6F68 E49B +6F69 E49C +6F6A E49D +6F6B E49E +6F6C E49F +6F6D E4A0 +6F6E E4A1 +6F6F E4A2 +6F70 E4A3 +6F71 E4A4 +6F72 E4A5 +6F73 E4A6 +6F74 E4A7 +6F75 E4A8 +6F76 E4A9 +6F77 E4AA +6F78 E4AB +6F79 E4AC +6F7A E4AD +6F7B E4AE +6F7C E4AF +6F7D E4B0 +6F7E E4B1 +6F7F E4B2 +6F80 E4B3 +6F81 E4B4 +6F82 E4B5 +6F83 E4B6 +6F84 E4B7 +6F85 E4B8 +6F86 E4B9 +6F87 E4BA +6F88 E4BB +6F89 E4BC +6F8A E4BD +6F8B E4BE +6F8C E4BF +6F8D E4C0 +6F8E E4C1 +6F8F E4C2 +6F90 E4C3 +6F91 E4C4 +6F92 E4C5 +6F93 E4C6 +6F94 E4C7 +6F95 E4C8 +6F96 E4C9 +6F97 E4CA +6F98 E4CB +6F99 E4CC +6F9A E4CD +6F9B E4CE +6F9C E4CF +6F9D E4D0 +6F9E E4D1 +6F9F E4D2 +6FA0 E4D3 +6FA1 E4D4 +6FA2 E4D5 +6FA3 E4D6 +6FA4 E4D7 +6FA5 E4D8 +6FA6 E4D9 +6FA7 E4DA +6FA8 E4DB +6FA9 E4DC +6FAA E4DD +6FAB E4DE +6FAC E4DF +6FAD E4E0 +6FAE E4E1 +6FAF E4E2 +6FB0 E4E3 +6FB1 E4E4 +6FB2 E4E5 +6FB3 E4E6 +6FB4 E4E7 +6FB5 E4E8 +6FB6 E4E9 +6FB7 E4EA +6FB8 E4EB +6FB9 E4EC +6FBA E4ED +6FBB E4EE +6FBC E4EF +6FBD E4F0 +6FBE E4F1 +6FBF E4F2 +6FC0 E4F3 +6FC1 E4F4 +6FC2 E4F5 +6FC3 E4F6 +6FC4 E4F7 +6FC5 E4F8 +6FC6 E4F9 +6FC7 E4FA +6FC8 E4FB +6FC9 E4FC +6FCA E4FD +6FCB E4FE +6FCC E4FF +6FCD E500 +6FCE E501 +6FCF E502 +6FD0 E503 +6FD1 E504 +6FD2 E505 +6FD3 E506 +6FD4 E507 +6FD5 E508 +6FD6 E509 +6FD7 E50A +6FD8 E50B +6FD9 E50C +6FDA E50D +6FDB E50E +6FDC E50F +6FDD E510 +6FDE E511 +6FDF E512 +6FE0 E513 +6FE1 E514 +6FE2 E515 +6FE3 E516 +6FE4 E517 +6FE5 E518 +6FE6 E519 +6FE7 E51A +6FE8 E51B +6FE9 E51C +6FEA E51D +6FEB E51E +6FEC E51F +6FED E520 +6FEE E521 +6FEF E522 +6FF0 E523 +6FF1 E524 +6FF2 E525 +6FF3 E526 +6FF4 E527 +6FF5 E528 +6FF6 E529 +6FF7 E52A +6FF8 E52B +6FF9 E52C +6FFA E52D +6FFB E52E +6FFC E52F +6FFD E530 +6FFE E531 +7041 E532 +7042 E533 +7043 E534 +7044 E535 +7045 E536 +7046 E537 +7047 E538 +7048 E539 +7049 E53A +704A E53B +704B E53C +704C E53D +704D E53E +704E E53F +704F E540 +7050 E541 +7051 E542 +7052 E543 +7053 E544 +7054 E545 +7055 E546 +7056 E547 +7057 E548 +7058 E549 +7059 E54A +705A E54B +705B E54C +705C E54D +705D E54E +705E E54F +705F E550 +7060 E551 +7061 E552 +7062 E553 +7063 E554 +7064 E555 +7065 E556 +7066 E557 +7067 E558 +7068 E559 +7069 E55A +706A E55B +706B E55C +706C E55D +706D E55E +706E E55F +706F E560 +7070 E561 +7071 E562 +7072 E563 +7073 E564 +7074 E565 +7075 E566 +7076 E567 +7077 E568 +7078 E569 +7079 E56A +707A E56B +707B E56C +707C E56D +707D E56E +707E E56F +707F E570 +7080 E571 +7081 E572 +7082 E573 +7083 E574 +7084 E575 +7085 E576 +7086 E577 +7087 E578 +7088 E579 +7089 E57A +708A E57B +708B E57C +708C E57D +708D E57E +708E E57F +708F E580 +7090 E581 +7091 E582 +7092 E583 +7093 E584 +7094 E585 +7095 E586 +7096 E587 +7097 E588 +7098 E589 +7099 E58A +709A E58B +709B E58C +709C E58D +709D E58E +709E E58F +709F E590 +70A0 E591 +70A1 E592 +70A2 E593 +70A3 E594 +70A4 E595 +70A5 E596 +70A6 E597 +70A7 E598 +70A8 E599 +70A9 E59A +70AA E59B +70AB E59C +70AC E59D +70AD E59E +70AE E59F +70AF E5A0 +70B0 E5A1 +70B1 E5A2 +70B2 E5A3 +70B3 E5A4 +70B4 E5A5 +70B5 E5A6 +70B6 E5A7 +70B7 E5A8 +70B8 E5A9 +70B9 E5AA +70BA E5AB +70BB E5AC +70BC E5AD +70BD E5AE +70BE E5AF +70BF E5B0 +70C0 E5B1 +70C1 E5B2 +70C2 E5B3 +70C3 E5B4 +70C4 E5B5 +70C5 E5B6 +70C6 E5B7 +70C7 E5B8 +70C8 E5B9 +70C9 E5BA +70CA E5BB +70CB E5BC +70CC E5BD +70CD E5BE +70CE E5BF +70CF E5C0 +70D0 E5C1 +70D1 E5C2 +70D2 E5C3 +70D3 E5C4 +70D4 E5C5 +70D5 E5C6 +70D6 E5C7 +70D7 E5C8 +70D8 E5C9 +70D9 E5CA +70DA E5CB +70DB E5CC +70DC E5CD +70DD E5CE +70DE E5CF +70DF E5D0 +70E0 E5D1 +70E1 E5D2 +70E2 E5D3 +70E3 E5D4 +70E4 E5D5 +70E5 E5D6 +70E6 E5D7 +70E7 E5D8 +70E8 E5D9 +70E9 E5DA +70EA E5DB +70EB E5DC +70EC E5DD +70ED E5DE +70EE E5DF +70EF E5E0 +70F0 E5E1 +70F1 E5E2 +70F2 E5E3 +70F3 E5E4 +70F4 E5E5 +70F5 E5E6 +70F6 E5E7 +70F7 E5E8 +70F8 E5E9 +70F9 E5EA +70FA E5EB +70FB E5EC +70FC E5ED +70FD E5EE +70FE E5EF +7141 E5F0 +7142 E5F1 +7143 E5F2 +7144 E5F3 +7145 E5F4 +7146 E5F5 +7147 E5F6 +7148 E5F7 +7149 E5F8 +714A E5F9 +714B E5FA +714C E5FB +714D E5FC +714E E5FD +714F E5FE +7150 E5FF +7151 E600 +7152 E601 +7153 E602 +7154 E603 +7155 E604 +7156 E605 +7157 E606 +7158 E607 +7159 E608 +715A E609 +715B E60A +715C E60B +715D E60C +715E E60D +715F E60E +7160 E60F +7161 E610 +7162 E611 +7163 E612 +7164 E613 +7165 E614 +7166 E615 +7167 E616 +7168 E617 +7169 E618 +716A E619 +716B E61A +716C E61B +716D E61C +716E E61D +716F E61E +7170 E61F +7171 E620 +7172 E621 +7173 E622 +7174 E623 +7175 E624 +7176 E625 +7177 E626 +7178 E627 +7179 E628 +717A E629 +717B E62A +717C E62B +717D E62C +717E E62D +717F E62E +7180 E62F +7181 E630 +7182 E631 +7183 E632 +7184 E633 +7185 E634 +7186 E635 +7187 E636 +7188 E637 +7189 E638 +718A E639 +718B E63A +718C E63B +718D E63C +718E E63D +718F E63E +7190 E63F +7191 E640 +7192 E641 +7193 E642 +7194 E643 +7195 E644 +7196 E645 +7197 E646 +7198 E647 +7199 E648 +719A E649 +719B E64A +719C E64B +719D E64C +719E E64D +719F E64E +71A0 E64F +71A1 E650 +71A2 E651 +71A3 E652 +71A4 E653 +71A5 E654 +71A6 E655 +71A7 E656 +71A8 E657 +71A9 E658 +71AA E659 +71AB E65A +71AC E65B +71AD E65C +71AE E65D +71AF E65E +71B0 E65F +71B1 E660 +71B2 E661 +71B3 E662 +71B4 E663 +71B5 E664 +71B6 E665 +71B7 E666 +71B8 E667 +71B9 E668 +71BA E669 +71BB E66A +71BC E66B +71BD E66C +71BE E66D +71BF E66E +71C0 E66F +71C1 E670 +71C2 E671 +71C3 E672 +71C4 E673 +71C5 E674 +71C6 E675 +71C7 E676 +71C8 E677 +71C9 E678 +71CA E679 +71CB E67A +71CC E67B +71CD E67C +71CE E67D +71CF E67E +71D0 E67F +71D1 E680 +71D2 E681 +71D3 E682 +71D4 E683 +71D5 E684 +71D6 E685 +71D7 E686 +71D8 E687 +71D9 E688 +71DA E689 +71DB E68A +71DC E68B +71DD E68C +71DE E68D +71DF E68E +71E0 E68F +71E1 E690 +71E2 E691 +71E3 E692 +71E4 E693 +71E5 E694 +71E6 E695 +71E7 E696 +71E8 E697 +71E9 E698 +71EA E699 +71EB E69A +71EC E69B +71ED E69C +71EE E69D +71EF E69E +71F0 E69F +71F1 E6A0 +71F2 E6A1 +71F3 E6A2 +71F4 E6A3 +71F5 E6A4 +71F6 E6A5 +71F7 E6A6 +71F8 E6A7 +71F9 E6A8 +71FA E6A9 +71FB E6AA +71FC E6AB +71FD E6AC +71FE E6AD +7241 E6AE +7242 E6AF +7243 E6B0 +7244 E6B1 +7245 E6B2 +7246 E6B3 +7247 E6B4 +7248 E6B5 +7249 E6B6 +724A E6B7 +724B E6B8 +724C E6B9 +724D E6BA +724E E6BB +724F E6BC +7250 E6BD +7251 E6BE +7252 E6BF +7253 E6C0 +7254 E6C1 +7255 E6C2 +7256 E6C3 +7257 E6C4 +7258 E6C5 +7259 E6C6 +725A E6C7 +725B E6C8 +725C E6C9 +725D E6CA +725E E6CB +725F E6CC +7260 E6CD +7261 E6CE +7262 E6CF +7263 E6D0 +7264 E6D1 +7265 E6D2 +7266 E6D3 +7267 E6D4 +7268 E6D5 +7269 E6D6 +726A E6D7 +726B E6D8 +726C E6D9 +726D E6DA +726E E6DB +726F E6DC +7270 E6DD +7271 E6DE +7272 E6DF +7273 E6E0 +7274 E6E1 +7275 E6E2 +7276 E6E3 +7277 E6E4 +7278 E6E5 +7279 E6E6 +727A E6E7 +727B E6E8 +727C E6E9 +727D E6EA +727E E6EB +727F E6EC +7280 E6ED +7281 E6EE +7282 E6EF +7283 E6F0 +7284 E6F1 +7285 E6F2 +7286 E6F3 +7287 E6F4 +7288 E6F5 +7289 E6F6 +728A E6F7 +728B E6F8 +728C E6F9 +728D E6FA +728E E6FB +728F E6FC +7290 E6FD +7291 E6FE +7292 E6FF +7293 E700 +7294 E701 +7295 E702 +7296 E703 +7297 E704 +7298 E705 +7299 E706 +729A E707 +729B E708 +729C E709 +729D E70A +729E E70B +729F E70C +72A0 E70D +72A1 E70E +72A2 E70F +72A3 E710 +72A4 E711 +72A5 E712 +72A6 E713 +72A7 E714 +72A8 E715 +72A9 E716 +72AA E717 +72AB E718 +72AC E719 +72AD E71A +72AE E71B +72AF E71C +72B0 E71D +72B1 E71E +72B2 E71F +72B3 E720 +72B4 E721 +72B5 E722 +72B6 E723 +72B7 E724 +72B8 E725 +72B9 E726 +72BA E727 +72BB E728 +72BC E729 +72BD E72A +72BE E72B +72BF E72C +72C0 E72D +72C1 E72E +72C2 E72F +72C3 E730 +72C4 E731 +72C5 E732 +72C6 E733 +72C7 E734 +72C8 E735 +72C9 E736 +72CA E737 +72CB E738 +72CC E739 +72CD E73A +72CE E73B +72CF E73C +72D0 E73D +72D1 E73E +72D2 E73F +72D3 E740 +72D4 E741 +72D5 E742 +72D6 E743 +72D7 E744 +72D8 E745 +72D9 E746 +72DA E747 +72DB E748 +72DC E749 +72DD E74A +72DE E74B +72DF E74C +72E0 E74D +72E1 E74E +72E2 E74F +72E3 E750 +72E4 E751 +72E5 E752 +72E6 E753 +72E7 E754 +72E8 E755 +72E9 E756 +72EA E757 +72EB E758 +72EC E759 +72ED E75A +72EE E75B +72EF E75C +72F0 E75D +72F1 E75E +72F2 E75F +72F3 E760 +72F4 E761 +72F5 E762 +72F6 E763 +72F7 E764 +72F8 E765 +72F9 E766 +72FA E767 +72FB E768 +72FC E769 +72FD E76A +72FE E76B +7341 E76C +7342 E76D +7343 E76E +7344 E76F +7345 E770 +7346 E771 +7347 E772 +7348 E773 +7349 E774 +734A E775 +734B E776 +734C E777 +734D E778 +734E E779 +734F E77A +7350 E77B +7351 E77C +7352 E77D +7353 E77E +7354 E77F +7355 E780 +7356 E781 +7357 E782 +7358 E783 +7359 E784 +735A E785 +735B E786 +735C E787 +735D E788 +735E E789 +735F E78A +7360 E78B +7361 E78C +7362 E78D +7363 E78E +7364 E78F +7365 E790 +7366 E791 +7367 E792 +7368 E793 +7369 E794 +736A E795 +736B E796 +736C E797 +736D E798 +736E E799 +736F E79A +7370 E79B +7371 E79C +7372 E79D +7373 E79E +7374 E79F +7375 E7A0 +7376 E7A1 +7377 E7A2 +7378 E7A3 +7379 E7A4 +737A E7A5 +737B E7A6 +737C E7A7 +737D E7A8 +737E E7A9 +737F E7AA +7380 E7AB +7381 E7AC +7382 E7AD +7383 E7AE +7384 E7AF +7385 E7B0 +7386 E7B1 +7387 E7B2 +7388 E7B3 +7389 E7B4 +738A E7B5 +738B E7B6 +738C E7B7 +738D E7B8 +738E E7B9 +738F E7BA +7390 E7BB +7391 E7BC +7392 E7BD +7393 E7BE +7394 E7BF +7395 E7C0 +7396 E7C1 +7397 E7C2 +7398 E7C3 +7399 E7C4 +739A E7C5 +739B E7C6 +739C E7C7 +739D E7C8 +739E E7C9 +739F E7CA +73A0 E7CB +73A1 E7CC +73A2 E7CD +73A3 E7CE +73A4 E7CF +73A5 E7D0 +73A6 E7D1 +73A7 E7D2 +73A8 E7D3 +73A9 E7D4 +73AA E7D5 +73AB E7D6 +73AC E7D7 +73AD E7D8 +73AE E7D9 +73AF E7DA +73B0 E7DB +73B1 E7DC +73B2 E7DD +73B3 E7DE +73B4 E7DF +73B5 E7E0 +73B6 E7E1 +73B7 E7E2 +73B8 E7E3 +73B9 E7E4 +73BA E7E5 +73BB E7E6 +73BC E7E7 +73BD E7E8 +73BE E7E9 +73BF E7EA +73C0 E7EB +73C1 E7EC +73C2 E7ED +73C3 E7EE +73C4 E7EF +73C5 E7F0 +73C6 E7F1 +73C7 E7F2 +73C8 E7F3 +73C9 E7F4 +73CA E7F5 +73CB E7F6 +73CC E7F7 +73CD E7F8 +73CE E7F9 +73CF E7FA +73D0 E7FB +73D1 E7FC +73D2 E7FD +73D3 E7FE +73D4 E7FF +73D5 E800 +73D6 E801 +73D7 E802 +73D8 E803 +73D9 E804 +73DA E805 +73DB E806 +73DC E807 +73DD E808 +73DE E809 +73DF E80A +73E0 E80B +73E1 E80C +73E2 E80D +73E3 E80E +73E4 E80F +73E5 E810 +73E6 E811 +73E7 E812 +73E8 E813 +73E9 E814 +73EA E815 +73EB E816 +73EC E817 +73ED E818 +73EE E819 +73EF E81A +73F0 E81B +73F1 E81C +73F2 E81D +73F3 E81E +73F4 E81F +73F5 E820 +73F6 E821 +73F7 E822 +73F8 E823 +73F9 E824 +73FA E825 +73FB E826 +73FC E827 +73FD E828 +73FE E829 +7441 E82A +7442 E82B +7443 E82C +7444 E82D +7445 E82E +7446 E82F +7447 E830 +7448 E831 +7449 E832 +744A E833 +744B E834 +744C E835 +744D E836 +744E E837 +744F E838 +7450 E839 +7451 E83A +7452 E83B +7453 E83C +7454 E83D +7455 E83E +7456 E83F +7457 E840 +7458 E841 +7459 E842 +745A E843 +745B E844 +745C E845 +745D E846 +745E E847 +745F E848 +7460 E849 +7461 E84A +7462 E84B +7463 E84C +7464 E84D +7465 E84E +7466 E84F +7467 E850 +7468 E851 +7469 E852 +746A E853 +746B E854 +746C E855 +746D E856 +746E E857 +746F E858 +7470 E859 +7471 E85A +7472 E85B +7473 E85C +7474 E85D +7475 E85E +7476 E85F +7477 E860 +7478 E861 +7479 E862 +747A E863 +747B E864 +747C E865 +747D E866 +747E E867 +747F E868 +7480 E869 +7481 E86A +7482 E86B +7483 E86C +7484 E86D +7485 E86E +7486 E86F +7487 E870 +7488 E871 +7489 E872 +748A E873 +748B E874 +748C E875 +748D E876 +748E E877 +748F E878 +7490 E879 +7491 E87A +7492 E87B +7493 E87C +7494 E87D +7495 E87E +7496 E87F +7497 E880 +7498 E881 +7499 E882 +749A E883 +749B E884 +749C E885 +749D E886 +749E E887 +749F E888 +74A0 E889 +74A1 E88A +74A2 E88B +74A3 E88C +74A4 E88D +74A5 E88E +74A6 E88F +74A7 E890 +74A8 E891 +74A9 E892 +74AA E893 +74AB E894 +74AC E895 +74AD E896 +74AE E897 +74AF E898 +74B0 E899 +74B1 E89A +74B2 E89B +74B3 E89C +74B4 E89D +74B5 E89E +74B6 E89F +74B7 E8A0 +74B8 E8A1 +74B9 E8A2 +74BA E8A3 +74BB E8A4 +74BC E8A5 +74BD E8A6 +74BE E8A7 +74BF E8A8 +74C0 E8A9 +74C1 E8AA +74C2 E8AB +74C3 E8AC +74C4 E8AD +74C5 E8AE +74C6 E8AF +74C7 E8B0 +74C8 E8B1 +74C9 E8B2 +74CA E8B3 +74CB E8B4 +74CC E8B5 +74CD E8B6 +74CE E8B7 +74CF E8B8 +74D0 E8B9 +74D1 E8BA +74D2 E8BB +74D3 E8BC +74D4 E8BD +74D5 E8BE +74D6 E8BF +74D7 E8C0 +74D8 E8C1 +74D9 E8C2 +74DA E8C3 +74DB E8C4 +74DC E8C5 +74DD E8C6 +74DE E8C7 +74DF E8C8 +74E0 E8C9 +74E1 E8CA +74E2 E8CB +74E3 E8CC +74E4 E8CD +74E5 E8CE +74E6 E8CF +74E7 E8D0 +74E8 E8D1 +74E9 E8D2 +74EA E8D3 +74EB E8D4 +74EC E8D5 +74ED E8D6 +74EE E8D7 +74EF E8D8 +74F0 E8D9 +74F1 E8DA +74F2 E8DB +74F3 E8DC +74F4 E8DD +74F5 E8DE +74F6 E8DF +74F7 E8E0 +74F8 E8E1 +74F9 E8E2 +74FA E8E3 +74FB E8E4 +74FC E8E5 +74FD E8E6 +74FE E8E7 +7541 E8E8 +7542 E8E9 +7543 E8EA +7544 E8EB +7545 E8EC +7546 E8ED +7547 E8EE +7548 E8EF +7549 E8F0 +754A E8F1 +754B E8F2 +754C E8F3 +754D E8F4 +754E E8F5 +754F E8F6 +7550 E8F7 +7551 E8F8 +7552 E8F9 +7553 E8FA +7554 E8FB +7555 E8FC +7556 E8FD +7557 E8FE +7558 E8FF +7559 E900 +755A E901 +755B E902 +755C E903 +755D E904 +755E E905 +755F E906 +7560 E907 +7561 E908 +7562 E909 +7563 E90A +7564 E90B +7565 E90C +7566 E90D +7567 E90E +7568 E90F +7569 E910 +756A E911 +756B E912 +756C E913 +756D E914 +756E E915 +756F E916 +7570 E917 +7571 E918 +7572 E919 +7573 E91A +7574 E91B +7575 E91C +7576 E91D +7577 E91E +7578 E91F +7579 E920 +757A E921 +757B E922 +757C E923 +757D E924 +757E E925 +757F E926 +7580 E927 +7581 E928 +7582 E929 +7583 E92A +7584 E92B +7585 E92C +7586 E92D +7587 E92E +7588 E92F +7589 E930 +758A E931 +758B E932 +758C E933 +758D E934 +758E E935 +758F E936 +7590 E937 +7591 E938 +7592 E939 +7593 E93A +7594 E93B +7595 E93C +7596 E93D +7597 E93E +7598 E93F +7599 E940 +759A E941 +759B E942 +759C E943 +759D E944 +759E E945 +759F E946 +75A0 E947 +75A1 E948 +75A2 E949 +75A3 E94A +75A4 E94B +75A5 E94C +75A6 E94D +75A7 E94E +75A8 E94F +75A9 E950 +75AA E951 +75AB E952 +75AC E953 +75AD E954 +75AE E955 +75AF E956 +75B0 E957 +75B1 E958 +75B2 E959 +75B3 E95A +75B4 E95B +75B5 E95C +75B6 E95D +75B7 E95E +75B8 E95F +75B9 E960 +75BA E961 +75BB E962 +75BC E963 +75BD E964 +75BE E965 +75BF E966 +75C0 E967 +75C1 E968 +75C2 E969 +75C3 E96A +75C4 E96B +75C5 E96C +75C6 E96D +75C7 E96E +75C8 E96F +75C9 E970 +75CA E971 +75CB E972 +75CC E973 +75CD E974 +75CE E975 +75CF E976 +75D0 E977 +75D1 E978 +75D2 E979 +75D3 E97A +75D4 E97B +75D5 E97C +75D6 E97D +75D7 E97E +75D8 E97F +75D9 E980 +75DA E981 +75DB E982 +75DC E983 +75DD E984 +75DE E985 +75DF E986 +75E0 E987 +75E1 E988 +75E2 E989 +75E3 E98A +75E4 E98B +75E5 E98C +75E6 E98D +75E7 E98E +75E8 E98F +75E9 E990 +75EA E991 +75EB E992 +75EC E993 +75ED E994 +75EE E995 +75EF E996 +75F0 E997 +75F1 E998 +75F2 E999 +75F3 E99A +75F4 E99B +75F5 E99C +75F6 E99D +75F7 E99E +75F8 E99F +75F9 E9A0 +75FA E9A1 +75FB E9A2 +75FC E9A3 +75FD E9A4 +75FE E9A5 +7641 E9A6 +7642 E9A7 +7643 E9A8 +7644 E9A9 +7645 E9AA +7646 E9AB +7647 E9AC +7648 E9AD +7649 E9AE +764A E9AF +764B E9B0 +764C E9B1 +764D E9B2 +764E E9B3 +764F E9B4 +7650 E9B5 +7651 E9B6 +7652 E9B7 +7653 E9B8 +7654 E9B9 +7655 E9BA +7656 E9BB +7657 E9BC +7658 E9BD +7659 E9BE +765A E9BF +765B E9C0 +765C E9C1 +765D E9C2 +765E E9C3 +765F E9C4 +7660 E9C5 +7661 E9C6 +7662 E9C7 +7663 E9C8 +7664 E9C9 +7665 E9CA +7666 E9CB +7667 E9CC +7668 E9CD +7669 E9CE +766A E9CF +766B E9D0 +766C E9D1 +766D E9D2 +766E E9D3 +766F E9D4 +7670 E9D5 +7671 E9D6 +7672 E9D7 +7673 E9D8 +7674 E9D9 +7675 E9DA +7676 E9DB +7677 E9DC +7678 E9DD +7679 E9DE +767A E9DF +767B E9E0 +767C E9E1 +767D E9E2 +767E E9E3 +767F E9E4 +7680 E9E5 +7681 E9E6 +7682 E9E7 +7683 E9E8 +7684 E9E9 +7685 E9EA +7686 E9EB +7687 E9EC +7688 E9ED +7689 E9EE +768A E9EF +768B E9F0 +768C E9F1 +768D E9F2 +768E E9F3 +768F E9F4 +7690 E9F5 +7691 E9F6 +7692 E9F7 +7693 E9F8 +7694 E9F9 +7695 E9FA +7696 E9FB +7697 E9FC +7698 E9FD +7699 E9FE +769A E9FF +769B EA00 +769C EA01 +769D EA02 +769E EA03 +769F EA04 +76A0 EA05 +76A1 EA06 +76A2 EA07 +76A3 EA08 +76A4 EA09 +76A5 EA0A +76A6 EA0B +76A7 EA0C +76A8 EA0D +76A9 EA0E +76AA EA0F +76AB EA10 +76AC EA11 +76AD EA12 +76AE EA13 +76AF EA14 +76B0 EA15 +76B1 EA16 +76B2 EA17 +76B3 EA18 +76B4 EA19 +76B5 EA1A +76B6 EA1B +76B7 EA1C +76B8 EA1D +76B9 EA1E +76BA EA1F +76BB EA20 +76BC EA21 +76BD EA22 +76BE EA23 +76BF EA24 +76C0 EA25 +76C1 EA26 +76C2 EA27 +76C3 EA28 +76C4 EA29 +76C5 EA2A +76C6 EA2B +76C7 EA2C +76C8 EA2D +76C9 EA2E +76CA EA2F +76CB EA30 +76CC EA31 +76CD EA32 +76CE EA33 +76CF EA34 +76D0 EA35 +76D1 EA36 +76D2 EA37 +76D3 EA38 +76D4 EA39 +76D5 EA3A +76D6 EA3B +76D7 EA3C +76D8 EA3D +76D9 EA3E +76DA EA3F +76DB EA40 +76DC EA41 +76DD EA42 +76DE EA43 +76DF EA44 +76E0 EA45 +76E1 EA46 +76E2 EA47 +76E3 EA48 +76E4 EA49 +76E5 EA4A +76E6 EA4B +76E7 EA4C +76E8 EA4D +76E9 EA4E +76EA EA4F +76EB EA50 +76EC EA51 +76ED EA52 +76EE EA53 +76EF EA54 +76F0 EA55 +76F1 EA56 +76F2 EA57 +76F3 EA58 +76F4 EA59 +76F5 EA5A +76F6 EA5B +76F7 EA5C +76F8 EA5D +76F9 EA5E +76FA EA5F +76FB EA60 +76FC EA61 +76FD EA62 +76FE EA63 +7741 EA64 +7742 EA65 +7743 EA66 +7744 EA67 +7745 EA68 +7746 EA69 +7747 EA6A +7748 EA6B +7749 EA6C +774A EA6D +774B EA6E +774C EA6F +774D EA70 +774E EA71 +774F EA72 +7750 EA73 +7751 EA74 +7752 EA75 +7753 EA76 +7754 EA77 +7755 EA78 +7756 EA79 +7757 EA7A +7758 EA7B +7759 EA7C +775A EA7D +775B EA7E +775C EA7F +775D EA80 +775E EA81 +775F EA82 +7760 EA83 +7761 EA84 +7762 EA85 +7763 EA86 +7764 EA87 +7765 EA88 +7766 EA89 +7767 EA8A +7768 EA8B +7769 EA8C +776A EA8D +776B EA8E +776C EA8F +776D EA90 +776E EA91 +776F EA92 +7770 EA93 +7771 EA94 +7772 EA95 +7773 EA96 +7774 EA97 +7775 EA98 +7776 EA99 +7777 EA9A +7778 EA9B +7779 EA9C +777A EA9D +777B EA9E +777C EA9F +777D EAA0 +777E EAA1 +777F EAA2 +7780 EAA3 +7781 EAA4 +7782 EAA5 +7783 EAA6 +7784 EAA7 +7785 EAA8 +7786 EAA9 +7787 EAAA +7788 EAAB +7789 EAAC +778A EAAD +778B EAAE +778C EAAF +778D EAB0 +778E EAB1 +778F EAB2 +7790 EAB3 +7791 EAB4 +7792 EAB5 +7793 EAB6 +7794 EAB7 +7795 EAB8 +7796 EAB9 +7797 EABA +7798 EABB +7799 EABC +779A EABD +779B EABE +779C EABF +779D EAC0 +779E EAC1 +779F EAC2 +77A0 EAC3 +77A1 EAC4 +77A2 EAC5 +77A3 EAC6 +77A4 EAC7 +77A5 EAC8 +77A6 EAC9 +77A7 EACA +77A8 EACB +77A9 EACC +77AA EACD +77AB EACE +77AC EACF +77AD EAD0 +77AE EAD1 +77AF EAD2 +77B0 EAD3 +77B1 EAD4 +77B2 EAD5 +77B3 EAD6 +77B4 EAD7 +77B5 EAD8 +77B6 EAD9 +77B7 EADA +77B8 EADB +77B9 EADC +77BA EADD +77BB EADE +77BC EADF +77BD EAE0 +77BE EAE1 +77BF EAE2 +77C0 EAE3 +77C1 EAE4 +77C2 EAE5 +77C3 EAE6 +77C4 EAE7 +77C5 EAE8 +77C6 EAE9 +77C7 EAEA +77C8 EAEB +77C9 EAEC +77CA EAED +77CB EAEE +77CC EAEF +77CD EAF0 +77CE EAF1 +77CF EAF2 +77D0 EAF3 +77D1 EAF4 +77D2 EAF5 +77D3 EAF6 +77D4 EAF7 +77D5 EAF8 +77D6 EAF9 +77D7 EAFA +77D8 EAFB +77D9 EAFC +77DA EAFD +77DB EAFE +77DC EAFF +77DD EB00 +77DE EB01 +77DF EB02 +77E0 EB03 +77E1 EB04 +77E2 EB05 +77E3 EB06 +77E4 EB07 +77E5 EB08 +77E6 EB09 +77E7 EB0A +77E8 EB0B +77E9 EB0C +77EA EB0D +77EB EB0E +77EC EB0F +77ED EB10 +77EE EB11 +77EF EB12 +77F0 EB13 +77F1 EB14 +77F2 EB15 +77F3 EB16 +77F4 EB17 +77F5 EB18 +77F6 EB19 +77F7 EB1A +77F8 EB1B +77F9 EB1C +77FA EB1D +77FB EB1E +77FC EB1F +77FD EB20 +77FE EB21 +7841 EB22 +7842 EB23 +7843 EB24 +7844 EB25 +7845 EB26 +7846 EB27 +7847 EB28 +7848 EB29 +7849 EB2A +784A EB2B +784B EB2C +784C EB2D +784D EB2E +784E EB2F +784F EB30 +7850 EB31 +7851 EB32 +7852 EB33 +7853 EB34 +7854 EB35 +7855 EB36 +7856 EB37 +7857 EB38 +7858 EB39 +7859 EB3A +785A EB3B +785B EB3C +785C EB3D +785D EB3E +785E EB3F +785F EB40 +7860 EB41 +7861 EB42 +7862 EB43 +7863 EB44 +7864 EB45 +7865 EB46 +7866 EB47 +7867 EB48 +7868 EB49 +7869 EB4A +786A EB4B +786B EB4C +786C EB4D +786D EB4E +786E EB4F +786F EB50 +7870 EB51 +7871 EB52 +7872 EB53 +7873 EB54 +7874 EB55 +7875 EB56 +7876 EB57 +7877 EB58 +7878 EB59 +7879 EB5A +787A EB5B +787B EB5C +787C EB5D +787D EB5E +787E EB5F +787F EB60 +7880 EB61 +7881 EB62 +7882 EB63 +7883 EB64 +7884 EB65 +7885 EB66 +7886 EB67 +7887 EB68 +7888 EB69 +7889 EB6A +788A EB6B +788B EB6C +788C EB6D +788D EB6E +788E EB6F +788F EB70 +7890 EB71 +7891 EB72 +7892 EB73 +7893 EB74 +7894 EB75 +7895 EB76 +7896 EB77 +7897 EB78 +7898 EB79 +7899 EB7A +789A EB7B +789B EB7C +789C EB7D +789D EB7E +789E EB7F +789F EB80 +78A0 EB81 +78A1 EB82 +78A2 EB83 +78A3 EB84 +78A4 EB85 +78A5 EB86 +78A6 EB87 +78A7 EB88 +78A8 EB89 +78A9 EB8A +78AA EB8B +78AB EB8C +78AC EB8D +78AD EB8E +78AE EB8F +78AF EB90 +78B0 EB91 +78B1 EB92 +78B2 EB93 +78B3 EB94 +78B4 EB95 +78B5 EB96 +78B6 EB97 +78B7 EB98 +78B8 EB99 +78B9 EB9A +78BA EB9B +78BB EB9C +78BC EB9D +78BD EB9E +78BE EB9F +78BF EBA0 +78C0 EBA1 +78C1 EBA2 +78C2 EBA3 +78C3 EBA4 +78C4 EBA5 +78C5 EBA6 +78C6 EBA7 +78C7 EBA8 +78C8 EBA9 +78C9 EBAA +78CA EBAB +78CB EBAC +78CC EBAD +78CD EBAE +78CE EBAF +78CF EBB0 +78D0 EBB1 +78D1 EBB2 +78D2 EBB3 +78D3 EBB4 +78D4 EBB5 +78D5 EBB6 +78D6 EBB7 +78D7 EBB8 +78D8 EBB9 +78D9 EBBA +78DA EBBB +78DB EBBC +78DC EBBD +78DD EBBE +78DE EBBF +78DF EBC0 +78E0 EBC1 +78E1 EBC2 +78E2 EBC3 +78E3 EBC4 +78E4 EBC5 +78E5 EBC6 +78E6 EBC7 +78E7 EBC8 +78E8 EBC9 +78E9 EBCA +78EA EBCB +78EB EBCC +78EC EBCD +78ED EBCE +78EE EBCF +78EF EBD0 +78F0 EBD1 +78F1 EBD2 +78F2 EBD3 +78F3 EBD4 +78F4 EBD5 +78F5 EBD6 +78F6 EBD7 +78F7 EBD8 +78F8 EBD9 +78F9 EBDA +78FA EBDB +78FB EBDC +78FC EBDD +78FD EBDE +78FE EBDF +7941 EBE0 +7942 EBE1 +7943 EBE2 +7944 EBE3 +7945 EBE4 +7946 EBE5 +7947 EBE6 +7948 EBE7 +7949 EBE8 +794A EBE9 +794B EBEA +794C EBEB +794D EBEC +794E EBED +794F EBEE +7950 EBEF +7951 EBF0 +7952 EBF1 +7953 EBF2 +7954 EBF3 +7955 EBF4 +7956 EBF5 +7957 EBF6 +7958 EBF7 +7959 EBF8 +795A EBF9 +795B EBFA +795C EBFB +795D EBFC +795E EBFD +795F EBFE +7960 EBFF +7961 EC00 +7962 EC01 +7963 EC02 +7964 EC03 +7965 EC04 +7966 EC05 +7967 EC06 +7968 EC07 +7969 EC08 +796A EC09 +796B EC0A +796C EC0B +796D EC0C +796E EC0D +796F EC0E +7970 EC0F +7971 EC10 +7972 EC11 +7973 EC12 +7974 EC13 +7975 EC14 +7976 EC15 +7977 EC16 +7978 EC17 +7979 EC18 +797A EC19 +797B EC1A +797C EC1B +797D EC1C +797E EC1D +797F EC1E +7980 EC1F +7981 EC20 +7982 EC21 +7983 EC22 +7984 EC23 +7985 EC24 +7986 EC25 +7987 EC26 +7988 EC27 +7989 EC28 +798A EC29 +798B EC2A +798C EC2B +798D EC2C +798E EC2D +798F EC2E +7990 EC2F +7991 EC30 +7992 EC31 +7993 EC32 +7994 EC33 +7995 EC34 +7996 EC35 +7997 EC36 +7998 EC37 +7999 EC38 +799A EC39 +799B EC3A +799C EC3B +799D EC3C +799E EC3D +799F EC3E +79A0 EC3F +79A1 EC40 +79A2 EC41 +79A3 EC42 +79A4 EC43 +79A5 EC44 +79A6 EC45 +79A7 EC46 +79A8 EC47 +79A9 EC48 +79AA EC49 +79AB EC4A +79AC EC4B +79AD EC4C +79AE EC4D +79AF EC4E +79B0 EC4F +79B1 EC50 +79B2 EC51 +79B3 EC52 +79B4 EC53 +79B5 EC54 +79B6 EC55 +79B7 EC56 +79B8 EC57 +79B9 EC58 +79BA EC59 +79BB EC5A +79BC EC5B +79BD EC5C +79BE EC5D +79BF EC5E +79C0 EC5F +79C1 EC60 +79C2 EC61 +79C3 EC62 +79C4 EC63 +79C5 EC64 +79C6 EC65 +79C7 EC66 +79C8 EC67 +79C9 EC68 +79CA EC69 +79CB EC6A +79CC EC6B +79CD EC6C +79CE EC6D +79CF EC6E +79D0 EC6F +79D1 EC70 +79D2 EC71 +79D3 EC72 +79D4 EC73 +79D5 EC74 +79D6 EC75 +79D7 EC76 +79D8 EC77 +79D9 EC78 +79DA EC79 +79DB EC7A +79DC EC7B +79DD EC7C +79DE EC7D +79DF EC7E +79E0 EC7F +79E1 EC80 +79E2 EC81 +79E3 EC82 +79E4 EC83 +79E5 EC84 +79E6 EC85 +79E7 EC86 +79E8 EC87 +79E9 EC88 +79EA EC89 +79EB EC8A +79EC EC8B +79ED EC8C +79EE EC8D +79EF EC8E +79F0 EC8F +79F1 EC90 +79F2 EC91 +79F3 EC92 +79F4 EC93 +79F5 EC94 +79F6 EC95 +79F7 EC96 +79F8 EC97 +79F9 EC98 +79FA EC99 +79FB EC9A +79FC EC9B +79FD EC9C +79FE EC9D +7A41 EC9E +7A42 EC9F +7A43 ECA0 +7A44 ECA1 +7A45 ECA2 +7A46 ECA3 +7A47 ECA4 +7A48 ECA5 +7A49 ECA6 +7A4A ECA7 +7A4B ECA8 +7A4C ECA9 +7A4D ECAA +7A4E ECAB +7A4F ECAC +7A50 ECAD +7A51 ECAE +7A52 ECAF +7A53 ECB0 +7A54 ECB1 +7A55 ECB2 +7A56 ECB3 +7A57 ECB4 +7A58 ECB5 +7A59 ECB6 +7A5A ECB7 +7A5B ECB8 +7A5C ECB9 +7A5D ECBA +7A5E ECBB +7A5F ECBC +7A60 ECBD +7A61 ECBE +7A62 ECBF +7A63 ECC0 +7A64 ECC1 +7A65 ECC2 +7A66 ECC3 +7A67 ECC4 +7A68 ECC5 +7A69 ECC6 +7A6A ECC7 +7A6B ECC8 +7A6C ECC9 +7A6D ECCA +7A6E ECCB +7A6F ECCC +7A70 ECCD +7A71 ECCE +7A72 ECCF +7A73 ECD0 +7A74 ECD1 +7A75 ECD2 +7A76 ECD3 +7A77 ECD4 +7A78 ECD5 +7A79 ECD6 +7A7A ECD7 +7A7B ECD8 +7A7C ECD9 +7A7D ECDA +7A7E ECDB +7A7F ECDC +7A80 ECDD +7A81 ECDE +7A82 ECDF +7A83 ECE0 +7A84 ECE1 +7A85 ECE2 +7A86 ECE3 +7A87 ECE4 +7A88 ECE5 +7A89 ECE6 +7A8A ECE7 +7A8B ECE8 +7A8C ECE9 +7A8D ECEA +7A8E ECEB +7A8F ECEC +7A90 ECED +7A91 ECEE +7A92 ECEF +7A93 ECF0 +7A94 ECF1 +7A95 ECF2 +7A96 ECF3 +7A97 ECF4 +7A98 ECF5 +7A99 ECF6 +7A9A ECF7 +7A9B ECF8 +7A9C ECF9 +7A9D ECFA +7A9E ECFB +7A9F ECFC +7AA0 ECFD +7AA1 ECFE +7AA2 ECFF +7AA3 ED00 +7AA4 ED01 +7AA5 ED02 +7AA6 ED03 +7AA7 ED04 +7AA8 ED05 +7AA9 ED06 +7AAA ED07 +7AAB ED08 +7AAC ED09 +7AAD ED0A +7AAE ED0B +7AAF ED0C +7AB0 ED0D +7AB1 ED0E +7AB2 ED0F +7AB3 ED10 +7AB4 ED11 +7AB5 ED12 +7AB6 ED13 +7AB7 ED14 +7AB8 ED15 +7AB9 ED16 +7ABA ED17 +7ABB ED18 +7ABC ED19 +7ABD ED1A +7ABE ED1B +7ABF ED1C +7AC0 ED1D +7AC1 ED1E +7AC2 ED1F +7AC3 ED20 +7AC4 ED21 +7AC5 ED22 +7AC6 ED23 +7AC7 ED24 +7AC8 ED25 +7AC9 ED26 +7ACA ED27 +7ACB ED28 +7ACC ED29 +7ACD ED2A +7ACE ED2B +7ACF ED2C +7AD0 ED2D +7AD1 ED2E +7AD2 ED2F +7AD3 ED30 +7AD4 ED31 +7AD5 ED32 +7AD6 ED33 +7AD7 ED34 +7AD8 ED35 +7AD9 ED36 +7ADA ED37 +7ADB ED38 +7ADC ED39 +7ADD ED3A +7ADE ED3B +7ADF ED3C +7AE0 ED3D +7AE1 ED3E +7AE2 ED3F +7AE3 ED40 +7AE4 ED41 +7AE5 ED42 +7AE6 ED43 +7AE7 ED44 +7AE8 ED45 +7AE9 ED46 +7AEA ED47 +7AEB ED48 +7AEC ED49 +7AED ED4A +7AEE ED4B +7AEF ED4C +7AF0 ED4D +7AF1 ED4E +7AF2 ED4F +7AF3 ED50 +7AF4 ED51 +7AF5 ED52 +7AF6 ED53 +7AF7 ED54 +7AF8 ED55 +7AF9 ED56 +7AFA ED57 +7AFB ED58 +7AFC ED59 +7AFD ED5A +7AFE ED5B +7B41 ED5C +7B42 ED5D +7B43 ED5E +7B44 ED5F +7B45 ED60 +7B46 ED61 +7B47 ED62 +7B48 ED63 +7B49 ED64 +7B4A ED65 +7B4B ED66 +7B4C ED67 +7B4D ED68 +7B4E ED69 +7B4F ED6A +7B50 ED6B +7B51 ED6C +7B52 ED6D +7B53 ED6E +7B54 ED6F +7B55 ED70 +7B56 ED71 +7B57 ED72 +7B58 ED73 +7B59 ED74 +7B5A ED75 +7B5B ED76 +7B5C ED77 +7B5D ED78 +7B5E ED79 +7B5F ED7A +7B60 ED7B +7B61 ED7C +7B62 ED7D +7B63 ED7E +7B64 ED7F +7B65 ED80 +7B66 ED81 +7B67 ED82 +7B68 ED83 +7B69 ED84 +7B6A ED85 +7B6B ED86 +7B6C ED87 +7B6D ED88 +7B6E ED89 +7B6F ED8A +7B70 ED8B +7B71 ED8C +7B72 ED8D +7B73 ED8E +7B74 ED8F +7B75 ED90 +7B76 ED91 +7B77 ED92 +7B78 ED93 +7B79 ED94 +7B7A ED95 +7B7B ED96 +7B7C ED97 +7B7D ED98 +7B7E ED99 +7B7F ED9A +7B80 ED9B +7B81 ED9C +7B82 ED9D +7B83 ED9E +7B84 ED9F +7B85 EDA0 +7B86 EDA1 +7B87 EDA2 +7B88 EDA3 +7B89 EDA4 +7B8A EDA5 +7B8B EDA6 +7B8C EDA7 +7B8D EDA8 +7B8E EDA9 +7B8F EDAA +7B90 EDAB +7B91 EDAC +7B92 EDAD +7B93 EDAE +7B94 EDAF +7B95 EDB0 +7B96 EDB1 +7B97 EDB2 +7B98 EDB3 +7B99 EDB4 +7B9A EDB5 +7B9B EDB6 +7B9C EDB7 +7B9D EDB8 +7B9E EDB9 +7B9F EDBA +7BA0 EDBB +7BA1 EDBC +7BA2 EDBD +7BA3 EDBE +7BA4 EDBF +7BA5 EDC0 +7BA6 EDC1 +7BA7 EDC2 +7BA8 EDC3 +7BA9 EDC4 +7BAA EDC5 +7BAB EDC6 +7BAC EDC7 +7BAD EDC8 +7BAE EDC9 +7BAF EDCA +7BB0 EDCB +7BB1 EDCC +7BB2 EDCD +7BB3 EDCE +7BB4 EDCF +7BB5 EDD0 +7BB6 EDD1 +7BB7 EDD2 +7BB8 EDD3 +7BB9 EDD4 +7BBA EDD5 +7BBB EDD6 +7BBC EDD7 +7BBD EDD8 +7BBE EDD9 +7BBF EDDA +7BC0 EDDB +7BC1 EDDC +7BC2 EDDD +7BC3 EDDE +7BC4 EDDF +7BC5 EDE0 +7BC6 EDE1 +7BC7 EDE2 +7BC8 EDE3 +7BC9 EDE4 +7BCA EDE5 +7BCB EDE6 +7BCC EDE7 +7BCD EDE8 +7BCE EDE9 +7BCF EDEA +7BD0 EDEB +7BD1 EDEC +7BD2 EDED +7BD3 EDEE +7BD4 EDEF +7BD5 EDF0 +7BD6 EDF1 +7BD7 EDF2 +7BD8 EDF3 +7BD9 EDF4 +7BDA EDF5 +7BDB EDF6 +7BDC EDF7 +7BDD EDF8 +7BDE EDF9 +7BDF EDFA +7BE0 EDFB +7BE1 EDFC +7BE2 EDFD +7BE3 EDFE +7BE4 EDFF +7BE5 EE00 +7BE6 EE01 +7BE7 EE02 +7BE8 EE03 +7BE9 EE04 +7BEA EE05 +7BEB EE06 +7BEC EE07 +7BED EE08 +7BEE EE09 +7BEF EE0A +7BF0 EE0B +7BF1 EE0C +7BF2 EE0D +7BF3 EE0E +7BF4 EE0F +7BF5 EE10 +7BF6 EE11 +7BF7 EE12 +7BF8 EE13 +7BF9 EE14 +7BFA EE15 +7BFB EE16 +7BFC EE17 +7BFD EE18 +7BFE EE19 +7C41 EE1A +7C42 EE1B +7C43 EE1C +7C44 EE1D +7C45 EE1E +7C46 EE1F +7C47 EE20 +7C48 EE21 +7C49 EE22 +7C4A EE23 +7C4B EE24 +7C4C EE25 +7C4D EE26 +7C4E EE27 +7C4F EE28 +7C50 EE29 +7C51 EE2A +7C52 EE2B +7C53 EE2C +7C54 EE2D +7C55 EE2E +7C56 EE2F +7C57 EE30 +7C58 EE31 +7C59 EE32 +7C5A EE33 +7C5B EE34 +7C5C EE35 +7C5D EE36 +7C5E EE37 +7C5F EE38 +7C60 EE39 +7C61 EE3A +7C62 EE3B +7C63 EE3C +7C64 EE3D +7C65 EE3E +7C66 EE3F +7C67 EE40 +7C68 EE41 +7C69 EE42 +7C6A EE43 +7C6B EE44 +7C6C EE45 +7C6D EE46 +7C6E EE47 +7C6F EE48 +7C70 EE49 +7C71 EE4A +7C72 EE4B +7C73 EE4C +7C74 EE4D +7C75 EE4E +7C76 EE4F +7C77 EE50 +7C78 EE51 +7C79 EE52 +7C7A EE53 +7C7B EE54 +7C7C EE55 +7C7D EE56 +7C7E EE57 +7C7F EE58 +7C80 EE59 +7C81 EE5A +7C82 EE5B +7C83 EE5C +7C84 EE5D +7C85 EE5E +7C86 EE5F +7C87 EE60 +7C88 EE61 +7C89 EE62 +7C8A EE63 +7C8B EE64 +7C8C EE65 +7C8D EE66 +7C8E EE67 +7C8F EE68 +7C90 EE69 +7C91 EE6A +7C92 EE6B +7C93 EE6C +7C94 EE6D +7C95 EE6E +7C96 EE6F +7C97 EE70 +7C98 EE71 +7C99 EE72 +7C9A EE73 +7C9B EE74 +7C9C EE75 +7C9D EE76 +7C9E EE77 +7C9F EE78 +7CA0 EE79 +7CA1 EE7A +7CA2 EE7B +7CA3 EE7C +7CA4 EE7D +7CA5 EE7E +7CA6 EE7F +7CA7 EE80 +7CA8 EE81 +7CA9 EE82 +7CAA EE83 +7CAB EE84 +7CAC EE85 +7CAD EE86 +7CAE EE87 +7CAF EE88 +7CB0 EE89 +7CB1 EE8A +7CB2 EE8B +7CB3 EE8C +7CB4 EE8D +7CB5 EE8E +7CB6 EE8F +7CB7 EE90 +7CB8 EE91 +7CB9 EE92 +7CBA EE93 +7CBB EE94 +7CBC EE95 +7CBD EE96 +7CBE EE97 +7CBF EE98 +7CC0 EE99 +7CC1 EE9A +7CC2 EE9B +7CC3 EE9C +7CC4 EE9D +7CC5 EE9E +7CC6 EE9F +7CC7 EEA0 +7CC8 EEA1 +7CC9 EEA2 +7CCA EEA3 +7CCB EEA4 +7CCC EEA5 +7CCD EEA6 +7CCE EEA7 +7CCF EEA8 +7CD0 EEA9 +7CD1 EEAA +7CD2 EEAB +7CD3 EEAC +7CD4 EEAD +7CD5 EEAE +7CD6 EEAF +7CD7 EEB0 +7CD8 EEB1 +7CD9 EEB2 +7CDA EEB3 +7CDB EEB4 +7CDC EEB5 +7CDD EEB6 +7CDE EEB7 +7CDF EEB8 +7CE0 EEB9 +7CE1 EEBA +7CE2 EEBB +7CE3 EEBC +7CE4 EEBD +7CE5 EEBE +7CE6 EEBF +7CE7 EEC0 +7CE8 EEC1 +7CE9 EEC2 +7CEA EEC3 +7CEB EEC4 +7CEC EEC5 +7CED EEC6 +7CEE EEC7 +7CEF EEC8 +7CF0 EEC9 +7CF1 EECA +7CF2 EECB +7CF3 EECC +7CF4 EECD +7CF5 EECE +7CF6 EECF +7CF7 EED0 +7CF8 EED1 +7CF9 EED2 +7CFA EED3 +7CFB EED4 +7CFC EED5 +7CFD EED6 +7CFE EED7 +7D41 EED8 +7D42 EED9 +7D43 EEDA +7D44 EEDB +7D45 EEDC +7D46 EEDD +7D47 EEDE +7D48 EEDF +7D49 EEE0 +7D4A EEE1 +7D4B EEE2 +7D4C EEE3 +7D4D EEE4 +7D4E EEE5 +7D4F EEE6 +7D50 EEE7 +7D51 EEE8 +7D52 EEE9 +7D53 EEEA +7D54 EEEB +7D55 EEEC +7D56 EEED +7D57 EEEE +7D58 EEEF +7D59 EEF0 +7D5A EEF1 +7D5B EEF2 +7D5C EEF3 +7D5D EEF4 +7D5E EEF5 +7D5F EEF6 +7D60 EEF7 +7D61 EEF8 +7D62 EEF9 +7D63 EEFA +7D64 EEFB +7D65 EEFC +7D66 EEFD +7D67 EEFE +7D68 EEFF +7D69 EF00 +7D6A EF01 +7D6B EF02 +7D6C EF03 +7D6D EF04 +7D6E EF05 +7D6F EF06 +7D70 EF07 +7D71 EF08 +7D72 EF09 +7D73 EF0A +7D74 EF0B +7D75 EF0C +7D76 EF0D +7D77 EF0E +7D78 EF0F +7D79 EF10 +7D7A EF11 +7D7B EF12 +7D7C EF13 +7D7D EF14 +7D7E EF15 +7D7F EF16 +7D80 EF17 +7D81 EF18 +7D82 EF19 +7D83 EF1A +7D84 EF1B +7D85 EF1C +7D86 EF1D +7D87 EF1E +7D88 EF1F +7D89 EF20 +7D8A EF21 +7D8B EF22 +7D8C EF23 +7D8D EF24 +7D8E EF25 +7D8F EF26 +7D90 EF27 +7D91 EF28 +7D92 EF29 +7D93 EF2A +7D94 EF2B +7D95 EF2C +7D96 EF2D +7D97 EF2E +7D98 EF2F +7D99 EF30 +7D9A EF31 +7D9B EF32 +7D9C EF33 +7D9D EF34 +7D9E EF35 +7D9F EF36 +7DA0 EF37 +7DA1 EF38 +7DA2 EF39 +7DA3 EF3A +7DA4 EF3B +7DA5 EF3C +7DA6 EF3D +7DA7 EF3E +7DA8 EF3F +7DA9 EF40 +7DAA EF41 +7DAB EF42 +7DAC EF43 +7DAD EF44 +7DAE EF45 +7DAF EF46 +7DB0 EF47 +7DB1 EF48 +7DB2 EF49 +7DB3 EF4A +7DB4 EF4B +7DB5 EF4C +7DB6 EF4D +7DB7 EF4E +7DB8 EF4F +7DB9 EF50 +7DBA EF51 +7DBB EF52 +7DBC EF53 +7DBD EF54 +7DBE EF55 +7DBF EF56 +7DC0 EF57 +7DC1 EF58 +7DC2 EF59 +7DC3 EF5A +7DC4 EF5B +7DC5 EF5C +7DC6 EF5D +7DC7 EF5E +7DC8 EF5F +7DC9 EF60 +7DCA EF61 +7DCB EF62 +7DCC EF63 +7DCD EF64 +7DCE EF65 +7DCF EF66 +7DD0 EF67 +7DD1 EF68 +7DD2 EF69 +7DD3 EF6A +7DD4 EF6B +7DD5 EF6C +7DD6 EF6D +7DD7 EF6E +7DD8 EF6F +7DD9 EF70 +7DDA EF71 +7DDB EF72 +7DDC EF73 +7DDD EF74 +7DDE EF75 +7DDF EF76 +7DE0 EF77 +7DE1 EF78 +7DE2 EF79 +7DE3 EF7A +7DE4 EF7B +7DE5 EF7C +7DE6 EF7D +7DE7 EF7E +7DE8 EF7F +7DE9 EF80 +7DEA EF81 +7DEB EF82 +7DEC EF83 +7DED EF84 +7DEE EF85 +7DEF EF86 +7DF0 EF87 +7DF1 EF88 +7DF2 EF89 +7DF3 EF8A +7DF4 EF8B +7DF5 EF8C +7DF6 EF8D +7DF7 EF8E +7DF8 EF8F +7DF9 EF90 +7DFA EF91 +7DFB EF92 +7DFC EF93 +7DFD EF94 +7DFE EF95 +7E41 EF96 +7E42 EF97 +7E43 EF98 +7E44 EF99 +7E45 EF9A +7E46 EF9B +7E47 EF9C +7E48 EF9D +7E49 EF9E +7E4A EF9F +7E4B EFA0 +7E4C EFA1 +7E4D EFA2 +7E4E EFA3 +7E4F EFA4 +7E50 EFA5 +7E51 EFA6 +7E52 EFA7 +7E53 EFA8 +7E54 EFA9 +7E55 EFAA +7E56 EFAB +7E57 EFAC +7E58 EFAD +7E59 EFAE +7E5A EFAF +7E5B EFB0 +7E5C EFB1 +7E5D EFB2 +7E5E EFB3 +7E5F EFB4 +7E60 EFB5 +7E61 EFB6 +7E62 EFB7 +7E63 EFB8 +7E64 EFB9 +7E65 EFBA +7E66 EFBB +7E67 EFBC +7E68 EFBD +7E69 EFBE +7E6A EFBF +7E6B EFC0 +7E6C EFC1 +7E6D EFC2 +7E6E EFC3 +7E6F EFC4 +7E70 EFC5 +7E71 EFC6 +7E72 EFC7 +7E73 EFC8 +7E74 EFC9 +7E75 EFCA +7E76 EFCB +7E77 EFCC +7E78 EFCD +7E79 EFCE +7E7A EFCF +7E7B EFD0 +7E7C EFD1 +7E7D EFD2 +7E7E EFD3 +7E7F EFD4 +7E80 EFD5 +7E81 EFD6 +7E82 EFD7 +7E83 EFD8 +7E84 EFD9 +7E85 EFDA +7E86 EFDB +7E87 EFDC +7E88 EFDD +7E89 EFDE +7E8A EFDF +7E8B EFE0 +7E8C EFE1 +7E8D EFE2 +7E8E EFE3 +7E8F EFE4 +7E90 EFE5 +7E91 EFE6 +7E92 EFE7 +7E93 EFE8 +7E94 EFE9 +7E95 EFEA +7E96 EFEB +7E97 EFEC +7E98 EFED +7E99 EFEE +7E9A EFEF +7E9B EFF0 +7E9C EFF1 +7E9D EFF2 +7E9E EFF3 +7E9F EFF4 +7EA0 EFF5 +7EA1 EFF6 +7EA2 EFF7 +7EA3 EFF8 +7EA4 EFF9 +7EA5 EFFA +7EA6 EFFB +7EA7 EFFC +7EA8 EFFD +7EA9 EFFE +7EAA EFFF +7EAB F000 +7EAC F001 +7EAD F002 +7EAE F003 +7EAF F004 +7EB0 F005 +7EB1 F006 +7EB2 F007 +7EB3 F008 +7EB4 F009 +7EB5 F00A +7EB6 F00B +7EB7 F00C +7EB8 F00D +7EB9 F00E +7EBA F00F +7EBB F010 +7EBC F011 +7EBD F012 +7EBE F013 +7EBF F014 +7EC0 F015 +7EC1 F016 +7EC2 F017 +7EC3 F018 +7EC4 F019 +7EC5 F01A +7EC6 F01B +7EC7 F01C +7EC8 F01D +7EC9 F01E +7ECA F01F +7ECB F020 +7ECC F021 +7ECD F022 +7ECE F023 +7ECF F024 +7ED0 F025 +7ED1 F026 +7ED2 F027 +7ED3 F028 +7ED4 F029 +7ED5 F02A +7ED6 F02B +7ED7 F02C +7ED8 F02D +7ED9 F02E +7EDA F02F +7EDB F030 +7EDC F031 +7EDD F032 +7EDE F033 +7EDF F034 +7EE0 F035 +7EE1 F036 +7EE2 F037 +7EE3 F038 +7EE4 F039 +7EE5 F03A +7EE6 F03B +7EE7 F03C +7EE8 F03D +7EE9 F03E +7EEA F03F +7EEB F040 +7EEC F041 +7EED F042 +7EEE F043 +7EEF F044 +7EF0 F045 +7EF1 F046 +7EF2 F047 +7EF3 F048 +7EF4 F049 +7EF5 F04A +7EF6 F04B +7EF7 F04C +7EF8 F04D +7EF9 F04E +7EFA F04F +7EFB F050 +7EFC F051 +7EFD F052 +7EFE F053 +7F41 F054 +7F42 F055 +7F43 F056 +7F44 F057 +7F45 F058 +7F46 F059 +7F47 F05A +7F48 F05B +7F49 F05C +7F4A F05D +7F4B F05E +7F4C F05F +7F4D F060 +7F4E F061 +7F4F F062 +7F50 F063 +7F51 F064 +7F52 F065 +7F53 F066 +7F54 F067 +7F55 F068 +7F56 F069 +7F57 F06A +7F58 F06B +7F59 F06C +7F5A F06D +7F5B F06E +7F5C F06F +7F5D F070 +7F5E F071 +7F5F F072 +7F60 F073 +7F61 F074 +7F62 F075 +7F63 F076 +7F64 F077 +7F65 F078 +7F66 F079 +7F67 F07A +7F68 F07B +7F69 F07C +7F6A F07D +7F6B F07E +7F6C F07F +7F6D F080 +7F6E F081 +7F6F F082 +7F70 F083 +7F71 F084 +7F72 F085 +7F73 F086 +7F74 F087 +7F75 F088 +7F76 F089 +7F77 F08A +7F78 F08B +7F79 F08C +7F7A F08D +7F7B F08E +7F7C F08F +7F7D F090 +7F7E F091 +7F7F F092 +7F80 F093 +7F81 F094 +7F82 F095 +7F83 F096 +7F84 F097 +7F85 F098 +7F86 F099 +7F87 F09A +7F88 F09B +7F89 F09C +7F8A F09D +7F8B F09E +7F8C F09F +7F8D F0A0 +7F8E F0A1 +7F8F F0A2 +7F90 F0A3 +7F91 F0A4 +7F92 F0A5 +7F93 F0A6 +7F94 F0A7 +7F95 F0A8 +7F96 F0A9 +7F97 F0AA +7F98 F0AB +7F99 F0AC +7F9A F0AD +7F9B F0AE +7F9C F0AF +7F9D F0B0 +7F9E F0B1 +7F9F F0B2 +7FA0 F0B3 +7FA1 F0B4 +7FA2 F0B5 +7FA3 F0B6 +7FA4 F0B7 +7FA5 F0B8 +7FA6 F0B9 +7FA7 F0BA +7FA8 F0BB +7FA9 F0BC +7FAA F0BD +7FAB F0BE +7FAC F0BF +7FAD F0C0 +7FAE F0C1 +7FAF F0C2 +7FB0 F0C3 +7FB1 F0C4 +7FB2 F0C5 +7FB3 F0C6 +7FB4 F0C7 +7FB5 F0C8 +7FB6 F0C9 +7FB7 F0CA +7FB8 F0CB +7FB9 F0CC +7FBA F0CD +7FBB F0CE +7FBC F0CF +7FBD F0D0 +7FBE F0D1 +7FBF F0D2 +7FC0 F0D3 +7FC1 F0D4 +7FC2 F0D5 +7FC3 F0D6 +7FC4 F0D7 +7FC5 F0D8 +7FC6 F0D9 +7FC7 F0DA +7FC8 F0DB +7FC9 F0DC +7FCA F0DD +7FCB F0DE +7FCC F0DF +7FCD F0E0 +7FCE F0E1 +7FCF F0E2 +7FD0 F0E3 +7FD1 F0E4 +7FD2 F0E5 +7FD3 F0E6 +7FD4 F0E7 +7FD5 F0E8 +7FD6 F0E9 +7FD7 F0EA +7FD8 F0EB +7FD9 F0EC +7FDA F0ED +7FDB F0EE +7FDC F0EF +7FDD F0F0 +7FDE F0F1 +7FDF F0F2 +7FE0 F0F3 +7FE1 F0F4 +7FE2 F0F5 +7FE3 F0F6 +7FE4 F0F7 +7FE5 F0F8 +7FE6 F0F9 +7FE7 F0FA +7FE8 F0FB +7FE9 F0FC +7FEA F0FD +7FEB F0FE +7FEC F0FF +7FED F100 +7FEE F101 +7FEF F102 +7FF0 F103 +7FF1 F104 +7FF2 F105 +7FF3 F106 +7FF4 F107 +7FF5 F108 +7FF6 F109 +7FF7 F10A +7FF8 F10B +7FF9 F10C +7FFA F10D +7FFB F10E +7FFC F10F +7FFD F110 +7FFE F111
--- a/make/tools/CharsetMapping/dbcs Tue Aug 27 13:37:38 2013 +0400 +++ b/make/tools/CharsetMapping/dbcs Tue Aug 27 21:46:00 2013 -0700 @@ -15,6 +15,7 @@ IBM1364 x-IBM1364 Cp1364 ebcdic sun.nio.cs.ext false 0x40 0xde 0x40 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 +IBM300 x-IBM300 Cp300 dbcsonly sun.nio.cs.ext false 0x40 0x7f 0x40 0xfe IBM930 x-IBM930 Cp930 ebcdic sun.nio.cs.ext false 0x40 0x7f 0x40 0xfe IBM933 x-IBM933 Cp933 ebcdic sun.nio.cs.ext false 0x40 0xdd 0x40 0xfe IBM935 x-IBM935 Cp935 ebcdic sun.nio.cs.ext false 0x40 0x7f 0x40 0xfe
--- a/make/tools/CharsetMapping/extsbcs Tue Aug 27 13:37:38 2013 +0400 +++ b/make/tools/CharsetMapping/extsbcs Tue Aug 27 21:46:00 2013 -0700 @@ -28,6 +28,7 @@ IBM280 IBM280 Cp280 false sun.nio.cs.ext IBM284 IBM284 Cp284 false sun.nio.cs.ext IBM285 IBM285 Cp285 false sun.nio.cs.ext +IBM290 IBM290 Cp290 false sun.nio.cs.ext IBM297 IBM297 Cp297 false sun.nio.cs.ext IBM420 IBM420 Cp420 false sun.nio.cs.ext IBM424 IBM424 Cp424 false sun.nio.cs.ext
--- a/make/tools/sharing/README.txt Tue Aug 27 13:37:38 2013 +0400 +++ b/make/tools/sharing/README.txt Tue Aug 27 21:46:00 2013 -0700 @@ -2,20 +2,20 @@ class list for class data sharing. The class list is produced by running the refWorkload startup3 benchmark with -the -verbose:class option. The -Xshare:off option must also be used so that -bootclasspath classes are loaded from rt.jar. The MakeClasslist program -should be built into the jar file makeclasslist.jar and is run +the -XX:+TraceClassLoadingPreorder option. The -Xshare:off option must also be +used so that bootclasspath classes are loaded from rt.jar. The MakeClasslist +program should be built into the jar file makeclasslist.jar and is run on one of the logs from each of the benchmarks in the following fashion: -cd .../results.startup3 -$JAVA_HOME/bin/java -jar makeclasslist.jar results.Noop/results_1/log results.Framer/results_1/log results.XFramer/results_1/log results.JEdit/results_1/log results.LimeWire/results_1/log results.NetBeans/results_1/log +cd .../<resultsdir>/results.startup3 +$JAVA_HOME/bin/java -jar makeclasslist.jar results.Noop/results_1/log results.Framer/results_1/log results.XFramer/results_1/log results.JEdit/results_1/log results.LimeWire/results_1/log results.NetBeans50/results_1/log Presently, $JAVA_HOME must be the same path used to run the startup3 benchmark. -The logs are deliberately concatenated in roughly smallest to largest -order based on application size. The resulting output is redirected -into a file and results in one of classlist.solaris, classlist.linux, -or classlist.windows. These files are checked in to the workspace. A +The logs are deliberately concatenated in roughly smallest to largest order +based on application size. The resulting output is redirected into a file +and results in one of classlist.solaris, classlist.linux, classlist.macosx, +or classlist.windows. These files are checked in to the workspace. A necessary checksum (AddJsum.java) is added to the final classlist (installed in lib/ or jre/lib/) during the build process by the makefiles in make/java/redist. @@ -27,8 +27,8 @@ The properties file supplied to the refworkload is approximately the following: -javahome=/usr/java/j2sdk1.5.0 +javahome=/usr/java/j2sdk1.8.0 resultsdir=classlist-run iterations=1 benchmarks=startup3 -globalvmoptions=-client -Xshare:off -verbose:class +globalvmoptions=-client -Xshare:off -XX:+TraceClassLoadingPreorder
--- a/make/tools/src/build/tools/charsetmapping/DBCS.java Tue Aug 27 13:37:38 2013 +0400 +++ b/make/tools/src/build/tools/charsetmapping/DBCS.java Tue Aug 27 21:46:00 2013 -0700 @@ -196,11 +196,14 @@ // (5) c2b replacement, only used for JIs0208/0212, which // are two pure db charsets so default '3f' does not work + // TBD: move this into configuration file String c2bRepl = ""; if (clzName.startsWith("JIS_X_0208")) { c2bRepl = "new byte[]{ (byte)0x21, (byte)0x29 },"; } else if (clzName.startsWith("JIS_X_0212")) { c2bRepl = "new byte[]{ (byte)0x22, (byte)0x44 },"; + } else if (clzName.startsWith("IBM300")) { + c2bRepl = "new byte[]{ (byte)0x42, (byte)0x6f },"; } while (s.hasNextLine()) {
--- a/make/tools/src/build/tools/cldrconverter/CLDRConverter.java Tue Aug 27 13:37:38 2013 +0400 +++ b/make/tools/src/build/tools/cldrconverter/CLDRConverter.java Tue Aug 27 21:46:00 2013 -0700 @@ -605,7 +605,23 @@ copyIfPresent(map, key, formatData); } } - + // Workaround for islamic-umalqura name support (JDK-8015986) + switch (id) { + case "ar": + map.put(CLDRConverter.CALENDAR_NAME_PREFIX + + CalendarType.ISLAMIC_UMALQURA.lname(), + // derived from CLDR 24 draft + "\u0627\u0644\u062a\u0642\u0648\u064a\u0645 " + +"\u0627\u0644\u0625\u0633\u0644\u0627\u0645\u064a " + +"[\u0623\u0645 \u0627\u0644\u0642\u0631\u0649]"); + break; + case "en": + map.put(CLDRConverter.CALENDAR_NAME_PREFIX + + CalendarType.ISLAMIC_UMALQURA.lname(), + // derived from CLDR 24 draft + "Islamic Calendar [Umm al-Qura]"); + break; + } // Copy available calendar names for (String key : map.keySet()) { if (key.startsWith(CLDRConverter.CALENDAR_NAME_PREFIX)) {
--- a/make/tools/src/build/tools/cldrconverter/CalendarType.java Tue Aug 27 13:37:38 2013 +0400 +++ b/make/tools/src/build/tools/cldrconverter/CalendarType.java Tue Aug 27 21:46:00 2013 -0700 @@ -31,7 +31,8 @@ * Constants for the Calendars supported by JRE. */ enum CalendarType { - GREGORIAN("gregory"), BUDDHIST, JAPANESE, ROC, ISLAMIC, ISLAMIC_CIVIL("islamicc"); + GREGORIAN("gregory"), BUDDHIST, JAPANESE, ROC, + ISLAMIC, ISLAMIC_CIVIL("islamicc"), ISLAMIC_UMALQURA("islamic-umalqura"); private static final int[][] ERA_DATA = { // start index, array length @@ -41,6 +42,7 @@ {0, 2}, // roc (Minguo) {0, 1}, // islamic (Hijrah) {0, 1}, // islamicc (same as islamic) + {0, 1}, // islamic-umalqura }; private final String lname; // lowercase name @@ -52,8 +54,8 @@ private CalendarType(String uname) { String lname = name().toLowerCase(Locale.ROOT); - if (lname.equals("islamic_civil")) { - lname = "islamic-civil"; + if (lname.startsWith("islamic_")) { + lname = lname.replace('_', '-'); } this.lname = lname; this.uname = (uname != null) ? uname : lname;
--- a/make/tools/src/build/tools/makeclasslist/MakeClasslist.java Tue Aug 27 13:37:38 2013 +0400 +++ b/make/tools/src/build/tools/makeclasslist/MakeClasslist.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. 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 @@ -29,11 +29,11 @@ import java.util.*; import java.util.jar.*; -/** Reads a set of files containing the output of java -verbose:class - runs. Finds all classes that were loaded from the bootstrap class - path by comparing the prefix of the load path to the current JRE's - java.home system property. Prints the names of these classes to - stdout. +/** Reads a set of files containing the output of java + -XX:+TraceClassLoadingPreorder runs. Finds all classes that were + loaded from the bootstrap class path by comparing the prefix of + the load path to the current JRE's java.home system property. + Prints the names of these classes to stdout. */ public class MakeClasslist { @@ -86,7 +86,7 @@ Set<String> seenClasses = new HashSet<>(); - for (String str : seenClasses) { + for (String str : classes) { if (seenClasses.add(str)) { System.out.println(str); }
--- a/makefiles/CompileLaunchers.gmk Tue Aug 27 13:37:38 2013 +0400 +++ b/makefiles/CompileLaunchers.gmk Tue Aug 27 21:46:00 2013 -0700 @@ -40,7 +40,7 @@ BUILD_LAUNCHERS= -# When building a legacy overlay image (on solaris 64 bit), the launchers +# When building a legacy overlay image (on solaris 64 bit), the launchers # need to be built with a different rpath and a different output dir. ifeq ($(OVERLAY_IMAGES),true) ORIGIN_ROOT:=/../.. @@ -63,7 +63,7 @@ # ifneq ($(findstring $(OPENJDK_TARGET_OS), linux solaris),) ORIGIN_ARG+=$(call SET_EXECUTABLE_ORIGIN,$(ORIGIN_ROOT)/lib$(OPENJDK_TARGET_CPU_LIBDIR)) \ - $(call SET_EXECUTABLE_ORIGIN,$(ORIGIN_ROOT)/jre/lib$(OPENJDK_TARGET_CPU_LIBDIR)) + $(call SET_EXECUTABLE_ORIGIN,$(ORIGIN_ROOT)/jre/lib$(OPENJDK_TARGET_CPU_LIBDIR)) endif define SetupLauncher @@ -189,7 +189,7 @@ ifeq ($(OPENJDK_TARGET_OS),windows) $$(BUILD_LAUNCHER_$1) : $(JDK_OUTPUTDIR)/objs/libjava/java.lib \ $$($1_WINDOWS_JLI_LIB) - endif + endif endef ########################################################################################## @@ -441,7 +441,7 @@ endif # On windows, unpack200 is linked completely differently to all other # executables, using the compiler with the compiler arguments. -# It's also linked incrementally, producing a .ilk file that needs to +# It's also linked incrementally, producing a .ilk file that needs to # be kept away. ifeq ($(OPENJDK_TARGET_OS),windows) BUILD_UNPACKEXE_LDEXE:=$(CC) @@ -490,7 +490,7 @@ endif # Build into object dir and copy executable afterwards to avoid .ilk file in -# image. The real fix would be clean up linking of unpack200 using +# image. The real fix would be clean up linking of unpack200 using # -link -incremental:no # like all other launchers. $(JDK_OUTPUTDIR)/bin$(OUTPUT_SUBDIR)/unpack200$(EXE_SUFFIX): $(BUILD_UNPACKEXE) @@ -501,7 +501,7 @@ ########################################################################################## -BUILD_JEXEC := +BUILD_JEXEC := BUILD_JEXEC_SRC := BUILD_JEXEC_INC := BUILD_JEXEC_DST_DIR := $(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_LIBDIR) @@ -581,11 +581,11 @@ endif endif -# TODO: +# TODO: # On windows java-rmi.cgi shouldn't be bundled since Java 1.2, but has been built all # this time anyway. Since jdk6, it has been built from the wrong source and resulted -# in a (almost) copy of the standard java launcher named "java-rmi.exe" ending up in -# the final images bin dir. This weird behavior is mimicked here in the converted +# in a (almost) copy of the standard java launcher named "java-rmi.exe" ending up in +# the final images bin dir. This weird behavior is mimicked here in the converted # makefiles for now. Should probably just be deleted. # http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6512052 ifeq ($(OPENJDK_TARGET_OS),windows) @@ -598,6 +598,44 @@ endif ########################################################################################## + +BUILD_JSPAWNHELPER := +BUILD_JSPAWNHELPER_SRC := $(JDK_TOPDIR)/src/solaris/native/java/lang +BUILD_JSPAWNHELPER_DST_DIR := $(JDK_OUTPUTDIR)/lib$(OPENJDK_TARGET_CPU_LIBDIR) +LINK_JSPAWNHELPER_OBJECTS := $(JDK_OUTPUTDIR)/objs/libjava/childproc.o +LINK_JSPAWNHELPER_FLAGS := + +ifneq ($(findstring $(OPENJDK_TARGET_OS), macosx solaris),) + BUILD_JSPAWNHELPER := 1 +endif + +ifeq ($(OPENJDK_TARGET_OS), macosx) + BUILD_JSPAWNHELPER_DST_DIR := $(JDK_OUTPUTDIR)/lib +endif + +ifeq ($(OPENJDK_TARGET_CPU_BITS), 64) + LINK_JSPAWNHELPER_FLAGS += -m64 +endif + +ifeq ($(BUILD_JSPAWNHELPER), 1) + $(eval $(call SetupNativeCompilation,BUILD_JSPAWNHELPER,\ + SRC:=$(BUILD_JSPAWNHELPER_SRC),\ + INCLUDE_FILES:=jspawnhelper.c,\ + LANG:=C,\ + OPTIMIZATION := LOW, \ + CFLAGS:=$(CFLAGS_JDKEXE), \ + LDFLAGS:=$(LDFLAGS_JDKEXE) $(LINK_JSPAWNHELPER_FLAGS), \ + LDFLAGS_SUFFIX:= $(LINK_JSPAWNHELPER_OBJECTS), \ + OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/jspawnhelper,\ + OUTPUT_DIR:=$(BUILD_JSPAWNHELPER_DST_DIR),\ + PROGRAM:=jspawnhelper)) + + $(BUILD_JSPAWNHELPER): $(LINK_JSPAWNHELPER_OBJECTS) + + BUILD_LAUNCHERS += $(BUILD_JSPAWNHELPER) +endif + +########################################################################################## # jabswitch ifndef OPENJDK
--- a/makefiles/CompileNativeLibraries.gmk Tue Aug 27 13:37:38 2013 +0400 +++ b/makefiles/CompileNativeLibraries.gmk Tue Aug 27 21:46:00 2013 -0700 @@ -199,13 +199,13 @@ LIBJAVA_CFLAGS += -DJDK_MAJOR_VERSION='"$(JDK_MAJOR_VERSION)"' \ -DJDK_MINOR_VERSION='"$(JDK_MINOR_VERSION)"' \ -DJDK_MICRO_VERSION='"$(JDK_MICRO_VERSION)"' \ - -DJDK_BUILD_NUMBER='"$(JDK_BUILD_NUMBER)"' + -DJDK_BUILD_NUMBER='"$(JDK_BUILD_NUMBER)"' ifneq (,$(JDK_UPDATE_VERSION)) LIBJAVA_CFLAGS += -DJDK_UPDATE_VERSION='"$(JDK_UPDATE_VERSION)"' endif -LIBJAVA_EXCLUDE_FILES:=check_code.c check_format.c +LIBJAVA_EXCLUDE_FILES:=check_code.c check_format.c jspawnhelper.c ifneq ($(OPENJDK_TARGET_OS),macosx) LIBJAVA_EXCLUDE_FILES += java_props_macosx.c @@ -279,7 +279,7 @@ BUILD_LIBMLIB_SRC:=$(JDK_TOPDIR)/src/share/native/sun/awt/medialib BUILD_LIBMLIB_CFLAGS:=-D__USE_J2D_NAMES -D__MEDIALIB_OLD_NAMES \ -I$(BUILD_LIBMLIB_SRC) \ - -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/awt/medialib + -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/awt/medialib BUILD_LIBMLIB_LDLIBS:= BUILD_LIBMLIB_IMAGE_MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libmlib_image/mapfile-vers @@ -1042,6 +1042,7 @@ LANG:=C,\ OPTIMIZATION:=LOW, \ CFLAGS:=$(CFLAGS_JDKLIB),\ + CFLAGS_windows:=/Gy,\ MAPFILE:=$(JDK_TOPDIR)/makefiles/mapfiles/libattach/mapfile-$(OPENJDK_TARGET_OS), \ VERSIONINFO_RESOURCE:=$(JDK_TOPDIR)/src/windows/resource/version.rc,\ RC_FLAGS:=$(RC_FLAGS) \ @@ -1051,6 +1052,7 @@ LDFLAGS:=$(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN),\ LDFLAGS_solaris:=-ldoor,\ + LDFLAGS_windows:=/ORDER:@$(JDK_TOPDIR)/makefiles/mapfiles/libattach/reorder-windows-$(OPENJDK_TARGET_CPU),\ LDFLAGS_SUFFIX:=$(LDFLAGS_JDKLIB_SUFFIX),\ LDFLAGS_SUFFIX_windows:=$(WIN_JAVA_LIB) advapi32.lib psapi.lib,\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libattach,\ @@ -1413,10 +1415,10 @@ # ifeq ($(OPENJDK_TARGET_OS), linux) # ifeq ("$(CC_VER_MAJOR)", "3") # OTHER_LDLIBS += -Wl,-Bstatic -lgcc_eh -Wl,-Bdynamic -# endif +# endif # endif # -# The resulting size of the t2k lib file is (at least on linux) dependant on the order of +# The resulting size of the t2k lib file is (at least on linux) dependant on the order of # the input .o files. Because of this the new build will differ in size to the old build. BUILD_LIBT2K_CFLAGS_COMMON:=-I$(JDK_TOPDIR)/src/share/native/sun/font \ -I$(JDK_TOPDIR)/src/closed/share/native/sun/font/t2k \ @@ -1590,8 +1592,8 @@ ifeq ($(OPENJDK_TARGET_OS), windows) LIBINSTRUMENT_LDFLAGS += $(JDK_OUTPUTDIR)/objs/jli_static.lib $(WIN_JAVA_LIB) \ -export:Agent_OnAttach advapi32.lib - # Statically link the C runtime so that there are not dependencies on modules - # not on the search patch when invoked from the Windows system directory + # Statically link the C runtime so that there are not dependencies on modules + # not on the search patch when invoked from the Windows system directory # (or elsewhere). LIBINSTRUMENT_CFLAGS := $(filter-out -MD,$(LIBINSTRUMENT_CFLAGS)) # equivalent of strcasecmp is stricmp on Windows @@ -2065,13 +2067,13 @@ ifeq ($(OPENJDK_TARGET_OS), windows) BUILD_LIBJLI_FILES += java_md.c \ - cmdtoargs.c + cmdtoargs.c # Staticically link with c runtime on windows. LIBJLI_CFLAGS:=$(filter-out -MD,$(LIBJLI_CFLAGS)) else ifneq ($(OPENJDK_TARGET_OS), macosx) BUILD_LIBJLI_FILES += java_md_common.c - BUILD_LIBJLI_FILES += java_md_solinux.c ergo.c + BUILD_LIBJLI_FILES += java_md_solinux.c ergo.c ERGO_ARCH_FILE = ergo_$(ERGO_FAMILY).c @@ -2518,7 +2520,7 @@ BUILD_LIBRARIES += $(LIBSPLASHSCREEN) ifeq ($(OPENJDK_TARGET_OS),macosx) -$(LIBSPLASHSCREEN) : $(INSTALL_LIBRARIES_HERE)/$(LIBRARY_PREFIX)osxapp$(SHARED_LIBRARY_SUFFIX) +$(LIBSPLASHSCREEN) : $(INSTALL_LIBRARIES_HERE)/$(LIBRARY_PREFIX)osxapp$(SHARED_LIBRARY_SUFFIX) endif endif @@ -3246,7 +3248,7 @@ BUILD_LIBRARIES += $(BUILD_LIBAWT_LWAWT) -$(BUILD_LIBAWT_LWAWT) : $(BUILD_LIBAWT) +$(BUILD_LIBAWT_LWAWT) : $(BUILD_LIBAWT) $(BUILD_LIBAWT_LWAWT) : $(BUILD_LIBMLIB_IMAGE) @@ -3287,7 +3289,7 @@ BUILD_LIBRARIES += $(BUILD_LIBOSXUI) -$(BUILD_LIBOSXUI) : $(BUILD_LIBAWT) +$(BUILD_LIBOSXUI) : $(BUILD_LIBAWT) $(BUILD_LIBOSXUI) : $(BUILD_LIBOSXAPP)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/makefiles/mapfiles/libattach/reorder-windows-x86 Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,2 @@ +jvm_attach_thread_func@4 +jvm_attach_thread_func_end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/makefiles/mapfiles/libattach/reorder-windows-x86_64 Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,2 @@ +jvm_attach_thread_func +jvm_attach_thread_func_end
--- a/makefiles/mapfiles/libjava/mapfile-vers Tue Aug 27 13:37:38 2013 +0400 +++ b/makefiles/mapfiles/libjava/mapfile-vers Tue Aug 27 21:46:00 2013 -0700 @@ -100,7 +100,7 @@ Java_java_io_RandomAccessFile_open; Java_java_io_RandomAccessFile_read; Java_java_io_RandomAccessFile_readBytes; - Java_java_io_RandomAccessFile_seek; + Java_java_io_RandomAccessFile_seek0; Java_java_io_RandomAccessFile_setLength; Java_java_io_RandomAccessFile_write; Java_java_io_RandomAccessFile_writeBytes;
--- a/makefiles/profile-includes.txt Tue Aug 27 13:37:38 2013 +0400 +++ b/makefiles/profile-includes.txt Tue Aug 27 21:46:00 2013 -0700 @@ -102,6 +102,7 @@ security/US_export_policy.jar \ security/local_policy.jar + PROFILE_2_JRE_BIN_FILES := \ rmid$(EXE_SUFFIX) \ rmiregistry$(EXE_SUFFIX) @@ -140,7 +141,6 @@ PROFILE_3_JRE_OTHER_FILES := PROFILE_3_JRE_JAR_FILES := \ - jfr.jar \ management-agent.jar @@ -253,6 +253,6 @@ ext/cldrdata.jar \ ext/dnsns.jar \ ext/nashorn.jar \ - ext/zipfs.jar + ext/zipfs.jar \ + jfr.jar -
--- a/src/share/classes/com/sun/crypto/provider/SunJCE.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/com/sun/crypto/provider/SunJCE.java Tue Aug 27 21:46:00 2013 -0700 @@ -124,7 +124,8 @@ put("Cipher.RSA", "com.sun.crypto.provider.RSACipher"); put("Cipher.RSA SupportedModes", "ECB"); put("Cipher.RSA SupportedPaddings", - "NOPADDING|PKCS1PADDING|OAEPWITHMD5ANDMGF1PADDING" + "NOPADDING|PKCS1PADDING|OAEPPADDING" + + "|OAEPWITHMD5ANDMGF1PADDING" + "|OAEPWITHSHA1ANDMGF1PADDING" + "|OAEPWITHSHA-1ANDMGF1PADDING" + "|OAEPWITHSHA-224ANDMGF1PADDING"
--- a/src/share/classes/com/sun/java/swing/Painter.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/com/sun/java/swing/Painter.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2013, Oracle and/or its affiliates. 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 @@ -29,5 +29,6 @@ * * @deprecated Use {@link javax.swing.Painter} instead. */ +@Deprecated public interface Painter<T> extends javax.swing.Painter<T> { }
--- a/src/share/classes/com/sun/java/swing/plaf/nimbus/AbstractRegionPainter.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/com/sun/java/swing/plaf/nimbus/AbstractRegionPainter.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2013, Oracle and/or its affiliates. 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 @@ -29,5 +29,6 @@ * * @deprecated Use {@link javax.swing.plaf.nimbus.AbstractRegionPainter} instead. */ +@Deprecated public abstract class AbstractRegionPainter extends javax.swing.plaf.nimbus.AbstractRegionPainter { }
--- a/src/share/classes/com/sun/java/swing/plaf/nimbus/NimbusLookAndFeel.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/com/sun/java/swing/plaf/nimbus/NimbusLookAndFeel.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2013, Oracle and/or its affiliates. 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 @@ -29,5 +29,6 @@ * * @deprecated Use {@link javax.swing.plaf.nimbus.NimbusLookAndFeel} instead. */ +@Deprecated public class NimbusLookAndFeel extends javax.swing.plaf.nimbus.NimbusLookAndFeel { }
--- a/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/DEREncodedKeyValue.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/DEREncodedKeyValue.java Tue Aug 27 21:46:00 2013 -0700 @@ -42,7 +42,7 @@ public class DEREncodedKeyValue extends Signature11ElementProxy implements KeyInfoContent { /** JCA algorithm key types supported by this implementation. */ - public static final String supportedKeyTypes[] = { "RSA", "DSA", "EC"}; + private static final String supportedKeyTypes[] = { "RSA", "DSA", "EC"}; /** * Constructor DEREncodedKeyValue
--- a/src/share/classes/com/sun/security/auth/PolicyFile.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/com/sun/security/auth/PolicyFile.java Tue Aug 27 21:46:00 2013 -0700 @@ -25,31 +25,9 @@ package com.sun.security.auth; -import java.io.*; -import java.lang.reflect.*; -import java.net.URL; -import java.util.*; - import java.security.CodeSource; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.Permission; -import java.security.Permissions; import java.security.PermissionCollection; -import java.security.Principal; -import java.security.UnresolvedPermission; -import java.security.Security; -import java.security.cert.Certificate; -import java.security.cert.X509Certificate; - import javax.security.auth.Subject; -import javax.security.auth.PrivateCredentialPermission; - -import sun.security.util.PropertyExpander; - -import sun.security.provider.PolicyParser.PrincipalEntry; -import sun.security.provider.PolicyParser.GrantEntry; -import sun.security.provider.PolicyParser.PermissionEntry; /** * This class represents a default implementation for @@ -240,61 +218,14 @@ @Deprecated public class PolicyFile extends javax.security.auth.Policy { - static final java.util.ResourceBundle rb = - java.security.AccessController.doPrivileged - (new java.security.PrivilegedAction<java.util.ResourceBundle>() { - public java.util.ResourceBundle run() { - return (java.util.ResourceBundle.getBundle - ("sun.security.util.AuthResources")); - } - }); - // needs to be package private - - private static final sun.security.util.Debug debug = - sun.security.util.Debug.getInstance("policy", "\t[Auth Policy]"); - - private static final String AUTH_POLICY = "java.security.auth.policy"; - private static final String SECURITY_MANAGER = "java.security.manager"; - private static final String AUTH_POLICY_URL = "auth.policy.url."; - - private Vector<PolicyEntry> policyEntries; - private Hashtable<Object, Object> aliasMapping; - - private boolean initialized = false; - - private boolean expandProperties = true; - private boolean ignoreIdentityScope = true; - - // for use with the reflection API - - private static final Class[] PARAMS = { String.class, String.class}; + private final sun.security.provider.AuthPolicyFile apf; /** * Initializes the Policy object and reads the default policy * configuration file(s) into the Policy object. */ public PolicyFile() { - // initialize Policy if either the AUTH_POLICY or - // SECURITY_MANAGER properties are set - String prop = System.getProperty(AUTH_POLICY); - - if (prop == null) { - prop = System.getProperty(SECURITY_MANAGER); - } - if (prop != null) - init(); - } - - private synchronized void init() { - - if (initialized) - return; - - policyEntries = new Vector<PolicyEntry>(); - aliasMapping = new Hashtable<Object, Object>(11); - - initPolicyFile(); - initialized = true; + apf = new sun.security.provider.AuthPolicyFile(); } /** @@ -305,460 +236,9 @@ * @exception SecurityException if the caller doesn't have permission * to refresh the <code>Policy</code>. */ - public synchronized void refresh() - { - - java.lang.SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - sm.checkPermission(new javax.security.auth.AuthPermission - ("refreshPolicy")); - } - - // XXX - // - // 1) if code instantiates PolicyFile directly, then it will need - // all the permissions required for the PolicyFile initialization - // 2) if code calls Policy.getPolicy, then it simply needs - // AuthPermission(getPolicy), and the javax.security.auth.Policy - // implementation instantiates PolicyFile in a doPrivileged block - // 3) if after instantiating a Policy (either via #1 or #2), - // code calls refresh, it simply needs - // AuthPermission(refreshPolicy). then PolicyFile wraps - // the refresh in a doPrivileged block. - initialized = false; - java.security.AccessController.doPrivileged - (new java.security.PrivilegedAction<Void>() { - public Void run() { - init(); - return null; - } - }); - } - - private KeyStore initKeyStore(URL policyUrl, String keyStoreName, - String keyStoreType) { - if (keyStoreName != null) { - try { - /* - * location of keystore is specified as absolute URL in policy - * file, or is relative to URL of policy file - */ - URL keyStoreUrl = null; - try { - keyStoreUrl = new URL(keyStoreName); - // absolute URL - } catch (java.net.MalformedURLException e) { - // relative URL - keyStoreUrl = new URL(policyUrl, keyStoreName); - } - - if (debug != null) { - debug.println("reading keystore"+keyStoreUrl); - } - - InputStream inStream = - new BufferedInputStream(getInputStream(keyStoreUrl)); - - KeyStore ks; - if (keyStoreType != null) - ks = KeyStore.getInstance(keyStoreType); - else - ks = KeyStore.getInstance(KeyStore.getDefaultType()); - ks.load(inStream, null); - inStream.close(); - return ks; - } catch (Exception e) { - // ignore, treat it like we have no keystore - if (debug != null) { - e.printStackTrace(); - } - return null; - } - } - return null; - } - - private void initPolicyFile() { - - String prop = Security.getProperty("policy.expandProperties"); - - if (prop != null) expandProperties = prop.equalsIgnoreCase("true"); - - String iscp = Security.getProperty("policy.ignoreIdentityScope"); - - if (iscp != null) ignoreIdentityScope = iscp.equalsIgnoreCase("true"); - - String allowSys = Security.getProperty("policy.allowSystemProperty"); - - if ((allowSys!=null) && allowSys.equalsIgnoreCase("true")) { - - String extra_policy = System.getProperty(AUTH_POLICY); - if (extra_policy != null) { - boolean overrideAll = false; - if (extra_policy.startsWith("=")) { - overrideAll = true; - extra_policy = extra_policy.substring(1); - } - try { - extra_policy = PropertyExpander.expand(extra_policy); - URL policyURL; - File policyFile = new File(extra_policy); - if (policyFile.exists()) { - policyURL = - new URL("file:" + policyFile.getCanonicalPath()); - } else { - policyURL = new URL(extra_policy); - } - if (debug != null) - debug.println("reading "+policyURL); - init(policyURL); - } catch (Exception e) { - // ignore. - if (debug != null) { - debug.println("caught exception: "+e); - } - - } - if (overrideAll) { - if (debug != null) { - debug.println("overriding other policies!"); - } - return; - } - } - } - - int n = 1; - boolean loaded_one = false; - String policy_url; - - while ((policy_url = Security.getProperty(AUTH_POLICY_URL+n)) != null) { - try { - policy_url = PropertyExpander.expand(policy_url).replace - (File.separatorChar, '/'); - if (debug != null) - debug.println("reading "+policy_url); - init(new URL(policy_url)); - loaded_one = true; - } catch (Exception e) { - if (debug != null) { - debug.println("error reading policy "+e); - e.printStackTrace(); - } - // ignore that policy - } - n++; - } - - if (loaded_one == false) { - // do not load a static policy - } - } - - /** - * Checks public key. If it is marked as trusted in - * the identity database, add it to the policy - * with the AllPermission. - */ - private boolean checkForTrustedIdentity(final Certificate cert) { - // XXX JAAS has no way to access the SUN package. - // we'll add this back in when JAAS goes into core. - return false; - } - - /** - * Reads a policy configuration into the Policy object using a - * Reader object. - * - * @param policyFile the policy Reader object. - */ - private void init(URL policy) { - sun.security.provider.PolicyParser pp = - new sun.security.provider.PolicyParser(expandProperties); - try { - InputStreamReader isr - = new InputStreamReader(getInputStream(policy)); - pp.read(isr); - isr.close(); - KeyStore keyStore = initKeyStore(policy, pp.getKeyStoreUrl(), - pp.getKeyStoreType()); - Enumeration<GrantEntry> enum_ = pp.grantElements(); - while (enum_.hasMoreElements()) { - GrantEntry ge = enum_.nextElement(); - addGrantEntry(ge, keyStore); - } - } catch (sun.security.provider.PolicyParser.ParsingException pe) { - System.err.println(AUTH_POLICY + - rb.getString(".error.parsing.") + policy); - System.err.println(AUTH_POLICY + - rb.getString("COLON") + - pe.getMessage()); - if (debug != null) - pe.printStackTrace(); - - } catch (Exception e) { - if (debug != null) { - debug.println("error parsing "+policy); - debug.println(e.toString()); - e.printStackTrace(); - } - } - } - - /* - * Fast path reading from file urls in order to avoid calling - * FileURLConnection.connect() which can be quite slow the first time - * it is called. We really should clean up FileURLConnection so that - * this is not a problem but in the meantime this fix helps reduce - * start up time noticeably for the new launcher. -- DAC - */ - private InputStream getInputStream(URL url) throws IOException { - if ("file".equals(url.getProtocol())) { - String path = url.getFile().replace('/', File.separatorChar); - return new FileInputStream(path); - } else { - return url.openStream(); - } - } - - /** - * Given a PermissionEntry, create a codeSource. - * - * @return null if signedBy alias is not recognized - */ - CodeSource getCodeSource(GrantEntry ge, KeyStore keyStore) - throws java.net.MalformedURLException - { - Certificate[] certs = null; - if (ge.signedBy != null) { - certs = getCertificates(keyStore, ge.signedBy); - if (certs == null) { - // we don't have a key for this alias, - // just return - if (debug != null) { - debug.println(" no certs for alias " + - ge.signedBy + ", ignoring."); - } - return null; - } - } - - URL location; - - if (ge.codeBase != null) - location = new URL(ge.codeBase); - else - location = null; - - if (ge.principals == null || ge.principals.size() == 0) { - return (canonicalizeCodebase - (new CodeSource(location, certs), - false)); - } else { - return (canonicalizeCodebase - (new SubjectCodeSource(null, ge.principals, location, certs), - false)); - } - } - - /** - * Add one policy entry to the vector. - */ - private void addGrantEntry(GrantEntry ge, KeyStore keyStore) { - - if (debug != null) { - debug.println("Adding policy entry: "); - debug.println(" signedBy " + ge.signedBy); - debug.println(" codeBase " + ge.codeBase); - if (ge.principals != null && ge.principals.size() > 0) { - ListIterator<PrincipalEntry> li = ge.principals.listIterator(); - while (li.hasNext()) { - PrincipalEntry pppe = li.next(); - debug.println(" " + pppe.getPrincipalClass() + - " " + pppe.getPrincipalName()); - } - } - debug.println(); - } - - try { - CodeSource codesource = getCodeSource(ge, keyStore); - // skip if signedBy alias was unknown... - if (codesource == null) return; - - PolicyEntry entry = new PolicyEntry(codesource); - Enumeration<PermissionEntry> enum_ = ge.permissionElements(); - while (enum_.hasMoreElements()) { - PermissionEntry pe = enum_.nextElement(); - try { - // XXX special case PrivateCredentialPermission-SELF - Permission perm; - if (pe.permission.equals - ("javax.security.auth.PrivateCredentialPermission") && - pe.name.endsWith(" self")) { - perm = getInstance(pe.permission, - pe.name + " \"self\"", - pe.action); - } else { - perm = getInstance(pe.permission, - pe.name, - pe.action); - } - entry.add(perm); - if (debug != null) { - debug.println(" "+perm); - } - } catch (ClassNotFoundException cnfe) { - Certificate certs[]; - if (pe.signedBy != null) - certs = getCertificates(keyStore, pe.signedBy); - else - certs = null; - - // only add if we had no signer or we had a - // a signer and found the keys for it. - if (certs != null || pe.signedBy == null) { - Permission perm = new UnresolvedPermission( - pe.permission, - pe.name, - pe.action, - certs); - entry.add(perm); - if (debug != null) { - debug.println(" "+perm); - } - } - } catch (java.lang.reflect.InvocationTargetException ite) { - System.err.println - (AUTH_POLICY + - rb.getString(".error.adding.Permission.") + - pe.permission + - rb.getString("SPACE") + - ite.getTargetException()); - } catch (Exception e) { - System.err.println - (AUTH_POLICY + - rb.getString(".error.adding.Permission.") + - pe.permission + - rb.getString("SPACE") + - e); - } - } - policyEntries.addElement(entry); - } catch (Exception e) { - System.err.println - (AUTH_POLICY + - rb.getString(".error.adding.Entry.") + - ge + - rb.getString("SPACE") + - e); - } - - if (debug != null) - debug.println(); - } - - /** - * Returns a new Permission object of the given Type. The Permission is - * created by getting the - * Class object using the <code>Class.forName</code> method, and using - * the reflection API to invoke the (String name, String actions) - * constructor on the - * object. - * - * @param type the type of Permission being created. - * @param name the name of the Permission being created. - * @param actions the actions of the Permission being created. - * - * @exception ClassNotFoundException if the particular Permission - * class could not be found. - * - * @exception IllegalAccessException if the class or initializer is - * not accessible. - * - * @exception InstantiationException if getInstance tries to - * instantiate an abstract class or an interface, or if the - * instantiation fails for some other reason. - * - * @exception NoSuchMethodException if the (String, String) constructor - * is not found. - * - * @exception InvocationTargetException if the underlying Permission - * constructor throws an exception. - * - */ - - private static final Permission getInstance(String type, - String name, - String actions) - throws ClassNotFoundException, - InstantiationException, - IllegalAccessException, - NoSuchMethodException, - InvocationTargetException - { - //XXX we might want to keep a hash of created factories... - Class<?> pc = Class.forName(type); - Constructor<?> c = pc.getConstructor(PARAMS); - return (Permission) c.newInstance(new Object[] { name, actions }); - } - - /** - * Fetch all certs associated with this alias. - */ - Certificate[] getCertificates( - KeyStore keyStore, String aliases) { - - Vector<Certificate> vcerts = null; - - StringTokenizer st = new StringTokenizer(aliases, ","); - int n = 0; - - while (st.hasMoreTokens()) { - String alias = st.nextToken().trim(); - n++; - Certificate cert = null; - //See if this alias's cert has already been cached - cert = (Certificate) aliasMapping.get(alias); - if (cert == null && keyStore != null) { - - try { - cert = keyStore.getCertificate(alias); - } catch (KeyStoreException kse) { - // never happens, because keystore has already been loaded - // when we call this - } - if (cert != null) { - aliasMapping.put(alias, cert); - aliasMapping.put(cert, alias); - } - } - - if (cert != null) { - if (vcerts == null) - vcerts = new Vector<Certificate>(); - vcerts.addElement(cert); - } - } - - // make sure n == vcerts.size, since we are doing a logical *and* - if (vcerts != null && n == vcerts.size()) { - Certificate[] certs = new Certificate[vcerts.size()]; - vcerts.copyInto(certs); - return certs; - } else { - return null; - } - } - - /** - * Enumerate all the entries in the global policy object. - * This method is used by policy admin tools. The tools - * should use the Enumeration methods on the returned object - * to fetch the elements sequentially. - */ - private final synchronized Enumeration<PolicyEntry> elements(){ - return policyEntries.elements(); + @Override + public void refresh() { + apf.refresh(); } /** @@ -816,646 +296,9 @@ * @return the Permissions granted to the provided <code>Subject</code> * <code>CodeSource</code>. */ + @Override public PermissionCollection getPermissions(final Subject subject, - final CodeSource codesource) { - - // XXX when JAAS goes into the JDK core, - // we can remove this method and simply - // rely on the getPermissions variant that takes a codesource, - // which no one can use at this point in time. - // at that time, we can also make SubjectCodeSource a public - // class. - - // XXX - // - // 1) if code instantiates PolicyFile directly, then it will need - // all the permissions required for the PolicyFile initialization - // 2) if code calls Policy.getPolicy, then it simply needs - // AuthPermission(getPolicy), and the javax.security.auth.Policy - // implementation instantiates PolicyFile in a doPrivileged block - // 3) if after instantiating a Policy (either via #1 or #2), - // code calls getPermissions, PolicyFile wraps the call - // in a doPrivileged block. - return java.security.AccessController.doPrivileged - (new java.security.PrivilegedAction<PermissionCollection>() { - public PermissionCollection run() { - SubjectCodeSource scs = new SubjectCodeSource - (subject, - null, - codesource == null ? null : codesource.getLocation(), - codesource == null ? null : codesource.getCertificates()); - if (initialized) - return getPermissions(new Permissions(), scs); - else - return new PolicyPermissions(PolicyFile.this, scs); - } - }); - } - - /** - * Examines the global policy for the specified CodeSource, and - * creates a PermissionCollection object with - * the set of permissions for that principal's protection domain. - * - * @param CodeSource the codesource associated with the caller. - * This encapsulates the original location of the code (where the code - * came from) and the public key(s) of its signer. - * - * @return the set of permissions according to the policy. - */ - PermissionCollection getPermissions(CodeSource codesource) { - - if (initialized) - return getPermissions(new Permissions(), codesource); - else - return new PolicyPermissions(this, codesource); - } - - /** - * Examines the global policy for the specified CodeSource, and - * creates a PermissionCollection object with - * the set of permissions for that principal's protection domain. - * - * @param permissions the permissions to populate - * @param codesource the codesource associated with the caller. - * This encapsulates the original location of the code (where the code - * came from) and the public key(s) of its signer. - * - * @return the set of permissions according to the policy. - */ - Permissions getPermissions(final Permissions perms, - final CodeSource cs) - { - if (!initialized) { - init(); - } - - final CodeSource codesource[] = {null}; - - codesource[0] = canonicalizeCodebase(cs, true); - - if (debug != null) { - debug.println("evaluate("+codesource[0]+")\n"); - } - - // needs to be in a begin/endPrivileged block because - // codesource.implies calls URL.equals which does an - // InetAddress lookup - - for (int i = 0; i < policyEntries.size(); i++) { - - PolicyEntry entry = policyEntries.elementAt(i); - - if (debug != null) { - debug.println("PolicyFile CodeSource implies: " + - entry.codesource.toString() + "\n\n" + - "\t" + codesource[0].toString() + "\n\n"); - } - - if (entry.codesource.implies(codesource[0])) { - for (int j = 0; j < entry.permissions.size(); j++) { - Permission p = entry.permissions.elementAt(j); - if (debug != null) { - debug.println(" granting " + p); - } - if (!addSelfPermissions(p, entry.codesource, - codesource[0], perms)) { - // we could check for duplicates - // before adding new permissions, - // but the SubjectDomainCombiner - // already checks for duplicates later - perms.add(p); - } - } - } - } - - // now see if any of the keys are trusted ids. - - if (!ignoreIdentityScope) { - Certificate certs[] = codesource[0].getCertificates(); - if (certs != null) { - for (int k=0; k < certs.length; k++) { - if ((aliasMapping.get(certs[k]) == null) && - checkForTrustedIdentity(certs[k])) { - // checkForTrustedIdentity added it - // to the policy for us. next time - // around we'll find it. This time - // around we need to add it. - perms.add(new java.security.AllPermission()); - } - } - } - } - return perms; - } - - /** - * Returns true if 'Self' permissions were added to the provided - * 'perms', and false otherwise. - * - * <p> - * - * @param p check to see if this Permission is a "SELF" - * PrivateCredentialPermission. <p> - * - * @param entryCs the codesource for the Policy entry. - * - * @param accCs the codesource for from the current AccessControlContext. - * - * @param perms the PermissionCollection where the individual - * PrivateCredentialPermissions will be added. - */ - private boolean addSelfPermissions(final Permission p, - CodeSource entryCs, - CodeSource accCs, - Permissions perms) { - - if (!(p instanceof PrivateCredentialPermission)) - return false; - - if (!(entryCs instanceof SubjectCodeSource)) - return false; - - - PrivateCredentialPermission pcp = (PrivateCredentialPermission)p; - SubjectCodeSource scs = (SubjectCodeSource)entryCs; - - // see if it is a SELF permission - String[][] pPrincipals = pcp.getPrincipals(); - if (pPrincipals.length <= 0 || - !pPrincipals[0][0].equalsIgnoreCase("self") || - !pPrincipals[0][1].equalsIgnoreCase("self")) { - - // regular PrivateCredentialPermission - return false; - } else { - - // granted a SELF permission - create a - // PrivateCredentialPermission for each - // of the Policy entry's CodeSource Principals - - if (scs.getPrincipals() == null) { - // XXX SubjectCodeSource has no Subject??? - return true; - } - - ListIterator<PrincipalEntry> pli = - scs.getPrincipals().listIterator(); - while (pli.hasNext()) { - - PrincipalEntry principal = pli.next(); - - // XXX - // if the Policy entry's Principal does not contain a - // WILDCARD for the Principal name, then a - // new PrivateCredentialPermission is created - // for the Principal listed in the Policy entry. - // if the Policy entry's Principal contains a WILDCARD - // for the Principal name, then a new - // PrivateCredentialPermission is created - // for each Principal associated with the Subject - // in the current ACC. - - String[][] principalInfo = getPrincipalInfo - (principal, accCs); - - for (int i = 0; i < principalInfo.length; i++) { - - // here's the new PrivateCredentialPermission - - PrivateCredentialPermission newPcp = - new PrivateCredentialPermission - (pcp.getCredentialClass() + - " " + - principalInfo[i][0] + - " " + - "\"" + principalInfo[i][1] + "\"", - "read"); - - if (debug != null) { - debug.println("adding SELF permission: " + - newPcp.toString()); - } - - perms.add(newPcp); - } - } - } - return true; - } - - /** - * return the principal class/name pair in the 2D array. - * array[x][y]: x corresponds to the array length. - * if (y == 0), it's the principal class. - * if (y == 1), it's the principal name. - */ - private String[][] getPrincipalInfo - (PrincipalEntry principal, final CodeSource accCs) { - - // there are 3 possibilities: - // 1) the entry's Principal class and name are not wildcarded - // 2) the entry's Principal name is wildcarded only - // 3) the entry's Principal class and name are wildcarded - - if (!principal.getPrincipalClass().equals - (PrincipalEntry.WILDCARD_CLASS) && - !principal.getPrincipalName().equals - (PrincipalEntry.WILDCARD_NAME)) { - - // build a PrivateCredentialPermission for the principal - // from the Policy entry - String[][] info = new String[1][2]; - info[0][0] = principal.getPrincipalClass(); - info[0][1] = principal.getPrincipalName(); - return info; - - } else if (!principal.getPrincipalClass().equals - (PrincipalEntry.WILDCARD_CLASS) && - principal.getPrincipalName().equals - (PrincipalEntry.WILDCARD_NAME)) { - - // build a PrivateCredentialPermission for all - // the Subject's principals that are instances of principalClass - - // the accCs is guaranteed to be a SubjectCodeSource - // because the earlier CodeSource.implies succeeded - SubjectCodeSource scs = (SubjectCodeSource)accCs; - - Set<? extends Principal> principalSet = null; - try { - // principal.principalClass should extend Principal - // If it doesn't, we should stop here with a ClassCastException. - @SuppressWarnings("unchecked") - Class<? extends Principal> pClass = (Class<? extends Principal>) - Class.forName(principal.getPrincipalClass(), false, - ClassLoader.getSystemClassLoader()); - principalSet = scs.getSubject().getPrincipals(pClass); - } catch (Exception e) { - if (debug != null) { - debug.println("problem finding Principal Class " + - "when expanding SELF permission: " + - e.toString()); - } - } - - if (principalSet == null) { - // error - return new String[0][0]; - } - - String[][] info = new String[principalSet.size()][2]; - - int i = 0; - for (Principal p : principalSet) { - info[i][0] = p.getClass().getName(); - info[i][1] = p.getName(); - i++; - } - return info; - - } else { - - // build a PrivateCredentialPermission for every - // one of the current Subject's principals - - // the accCs is guaranteed to be a SubjectCodeSource - // because the earlier CodeSource.implies succeeded - SubjectCodeSource scs = (SubjectCodeSource)accCs; - Set<Principal> principalSet = scs.getSubject().getPrincipals(); - - String[][] info = new String[principalSet.size()][2]; - java.util.Iterator<Principal> pIterator = principalSet.iterator(); - - int i = 0; - while (pIterator.hasNext()) { - Principal p = pIterator.next(); - info[i][0] = p.getClass().getName(); - info[i][1] = p.getName(); - i++; - } - return info; - } - } - - /* - * Returns the signer certificates from the list of certificates associated - * with the given code source. - * - * The signer certificates are those certificates that were used to verify - * signed code originating from the codesource location. - * - * This method assumes that in the given code source, each signer - * certificate is followed by its supporting certificate chain - * (which may be empty), and that the signer certificate and its - * supporting certificate chain are ordered bottom-to-top (i.e., with the - * signer certificate first and the (root) certificate authority last). - */ - Certificate[] getSignerCertificates(CodeSource cs) { - Certificate[] certs = null; - if ((certs = cs.getCertificates()) == null) - return null; - for (int i=0; i<certs.length; i++) { - if (!(certs[i] instanceof X509Certificate)) - return cs.getCertificates(); - } - - // Do we have to do anything? - int i = 0; - int count = 0; - while (i < certs.length) { - count++; - while (((i+1) < certs.length) - && ((X509Certificate)certs[i]).getIssuerDN().equals( - ((X509Certificate)certs[i+1]).getSubjectDN())) { - i++; - } - i++; - } - if (count == certs.length) - // Done - return certs; - - ArrayList<Certificate> userCertList = new ArrayList<>(); - i = 0; - while (i < certs.length) { - userCertList.add(certs[i]); - while (((i+1) < certs.length) - && ((X509Certificate)certs[i]).getIssuerDN().equals( - ((X509Certificate)certs[i+1]).getSubjectDN())) { - i++; - } - i++; - } - Certificate[] userCerts = new Certificate[userCertList.size()]; - userCertList.toArray(userCerts); - return userCerts; - } - - private CodeSource canonicalizeCodebase(CodeSource cs, - boolean extractSignerCerts) { - CodeSource canonCs = cs; - if (cs.getLocation() != null && - cs.getLocation().getProtocol().equalsIgnoreCase("file")) { - try { - String path = cs.getLocation().getFile().replace - ('/', - File.separatorChar); - URL csUrl = null; - if (path.endsWith("*")) { - // remove trailing '*' because it causes canonicalization - // to fail on win32 - path = path.substring(0, path.length()-1); - boolean appendFileSep = false; - if (path.endsWith(File.separator)) - appendFileSep = true; - if (path.equals("")) { - path = System.getProperty("user.dir"); - } - File f = new File(path); - path = f.getCanonicalPath(); - StringBuffer sb = new StringBuffer(path); - // reappend '*' to canonicalized filename (note that - // canonicalization may have removed trailing file - // separator, so we have to check for that, too) - if (!path.endsWith(File.separator) && - (appendFileSep || f.isDirectory())) - sb.append(File.separatorChar); - sb.append('*'); - path = sb.toString(); - } else { - path = new File(path).getCanonicalPath(); - } - csUrl = new File(path).toURL(); - - if (cs instanceof SubjectCodeSource) { - SubjectCodeSource scs = (SubjectCodeSource)cs; - if (extractSignerCerts) { - canonCs = new SubjectCodeSource - (scs.getSubject(), - scs.getPrincipals(), - csUrl, - getSignerCertificates(scs)); - } else { - canonCs = new SubjectCodeSource - (scs.getSubject(), - scs.getPrincipals(), - csUrl, - scs.getCertificates()); - } - } else { - if (extractSignerCerts) { - canonCs = new CodeSource(csUrl, - getSignerCertificates(cs)); - } else { - canonCs = new CodeSource(csUrl, - cs.getCertificates()); - } - } - } catch (IOException ioe) { - // leave codesource as it is, unless we have to extract its - // signer certificates - if (extractSignerCerts) { - if (!(cs instanceof SubjectCodeSource)) { - canonCs = new CodeSource(cs.getLocation(), - getSignerCertificates(cs)); - } else { - SubjectCodeSource scs = (SubjectCodeSource)cs; - canonCs = new SubjectCodeSource(scs.getSubject(), - scs.getPrincipals(), - scs.getLocation(), - getSignerCertificates(scs)); - } - } - } - } else { - if (extractSignerCerts) { - if (!(cs instanceof SubjectCodeSource)) { - canonCs = new CodeSource(cs.getLocation(), - getSignerCertificates(cs)); - } else { - SubjectCodeSource scs = (SubjectCodeSource)cs; - canonCs = new SubjectCodeSource(scs.getSubject(), - scs.getPrincipals(), - scs.getLocation(), - getSignerCertificates(scs)); - } - } - } - return canonCs; - } - - /** - * Each entry in the policy configuration file is represented by a - * PolicyEntry object. <p> - * - * A PolicyEntry is a (CodeSource,Permission) pair. The - * CodeSource contains the (URL, PublicKey) that together identify - * where the Java bytecodes come from and who (if anyone) signed - * them. The URL could refer to localhost. The URL could also be - * null, meaning that this policy entry is given to all comers, as - * long as they match the signer field. The signer could be null, - * meaning the code is not signed. <p> - * - * The Permission contains the (Type, Name, Action) triplet. <p> - * - * For now, the Policy object retrieves the public key from the - * X.509 certificate on disk that corresponds to the signedBy - * alias specified in the Policy config file. For reasons of - * efficiency, the Policy object keeps a hashtable of certs already - * read in. This could be replaced by a secure internal key - * store. - * - * <p> - * For example, the entry - * <pre> - * permission java.io.File "/tmp", "read,write", - * signedBy "Duke"; - * </pre> - * is represented internally - * <pre> - * - * FilePermission f = new FilePermission("/tmp", "read,write"); - * PublicKey p = publickeys.get("Duke"); - * URL u = InetAddress.getLocalHost(); - * CodeBase c = new CodeBase( p, u ); - * pe = new PolicyEntry(f, c); - * </pre> - * - * @author Marianne Mueller - * @author Roland Schemers - * @see java.security.CodeSource - * @see java.security.Policy - * @see java.security.Permissions - * @see java.security.ProtectionDomain - */ - - private static class PolicyEntry { - - CodeSource codesource; - Vector<Permission> permissions; - - /** - * Given a Permission and a CodeSource, create a policy entry. - * - * XXX Decide if/how to add validity fields and "purpose" fields to - * XXX policy entries - * - * @param cs the CodeSource, which encapsulates the URL and the public - * key - * attributes from the policy config file. Validity checks are - * performed on the public key before PolicyEntry is called. - * - */ - PolicyEntry(CodeSource cs) - { - this.codesource = cs; - this.permissions = new Vector<Permission>(); - } - - /** - * add a Permission object to this entry. - */ - void add(Permission p) { - permissions.addElement(p); - } - - /** - * Return the CodeSource for this policy entry - */ - CodeSource getCodeSource() { - return this.codesource; - } - - public String toString(){ - StringBuffer sb = new StringBuffer(); - sb.append(rb.getString("LPARAM")); - sb.append(getCodeSource()); - sb.append("\n"); - for (int j = 0; j < permissions.size(); j++) { - Permission p = permissions.elementAt(j); - sb.append(rb.getString("SPACE")); - sb.append(rb.getString("SPACE")); - sb.append(p); - sb.append(rb.getString("NEWLINE")); - } - sb.append(rb.getString("RPARAM")); - sb.append(rb.getString("NEWLINE")); - return sb.toString(); - } - + final CodeSource codesource) { + return apf.getPermissions(subject, codesource); } } - -@SuppressWarnings("deprecation") -class PolicyPermissions extends PermissionCollection { - - private static final long serialVersionUID = -1954188373270545523L; - - private CodeSource codesource; - private Permissions perms; - private PolicyFile policy; - private boolean notInit; // have we pulled in the policy permissions yet? - private Vector<Permission> additionalPerms; - - PolicyPermissions(PolicyFile policy, - CodeSource codesource) - { - this.codesource = codesource; - this.policy = policy; - this.perms = null; - this.notInit = true; - this.additionalPerms = null; - } - - public void add(Permission permission) { - if (isReadOnly()) - throw new SecurityException - (PolicyFile.rb.getString - ("attempt.to.add.a.Permission.to.a.readonly.PermissionCollection")); - - if (perms == null) { - if (additionalPerms == null) - additionalPerms = new Vector<Permission>(); - additionalPerms.add(permission); - } else { - perms.add(permission); - } - } - - private synchronized void init() { - if (notInit) { - if (perms == null) - perms = new Permissions(); - - if (additionalPerms != null) { - Enumeration<Permission> e = additionalPerms.elements(); - while (e.hasMoreElements()) { - perms.add(e.nextElement()); - } - additionalPerms = null; - } - policy.getPermissions(perms,codesource); - notInit=false; - } - } - - public boolean implies(Permission permission) { - if (notInit) - init(); - return perms.implies(permission); - } - - public Enumeration<Permission> elements() { - if (notInit) - init(); - return perms.elements(); - } - - public String toString() { - if (notInit) - init(); - return perms.toString(); - } -}
--- a/src/share/classes/com/sun/security/auth/PolicyParser.java Tue Aug 27 13:37:38 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,964 +0,0 @@ -/* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.security.auth; - -import java.io.*; -import java.lang.RuntimePermission; -import java.net.MalformedURLException; -import java.net.SocketPermission; -import java.net.URL; -import java.security.GeneralSecurityException; -import java.text.MessageFormat; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.LinkedList; -import java.util.ListIterator; -import java.util.Vector; -import java.util.StringTokenizer; -import sun.security.util.PropertyExpander; - -/** - * The policy for a Java runtime (specifying - * which permissions are available for code from various principals) - * is represented as a separate - * persistent configuration. The configuration may be stored as a - * flat ASCII file, as a serialized binary file of - * the Policy class, or as a database. <p> - * - * <p>The Java runtime creates one global Policy object, which is used to - * represent the static policy configuration file. It is consulted by - * a ProtectionDomain when the protection domain initializes its set of - * permissions. <p> - * - * <p>The Policy <code>init</code> method parses the policy - * configuration file, and then - * populates the Policy object. The Policy object is agnostic in that - * it is not involved in making policy decisions. It is merely the - * Java runtime representation of the persistent policy configuration - * file. <p> - * - * <p>When a protection domain needs to initialize its set of - * permissions, it executes code such as the following - * to ask the global Policy object to populate a - * Permissions object with the appropriate permissions: - * <pre> - * policy = Policy.getPolicy(); - * Permissions perms = policy.getPermissions(MyCodeSource) - * </pre> - * - * <p>The protection domain passes in a CodeSource - * object, which encapsulates its codebase (URL) and public key attributes. - * The Policy object evaluates the global policy in light of who the - * principal is and returns an appropriate Permissions object. - * - * @deprecated As of JDK 1.4, replaced by - * {@link sun.security.provider.PolicyParser}. - * This class is entirely deprecated. - * - * @author Roland Schemers - * - * @since 1.2 - */ -@Deprecated -class PolicyParser { - - private static final java.util.ResourceBundle rb = - java.security.AccessController.doPrivileged - (new java.security.PrivilegedAction<java.util.ResourceBundle>() { - public java.util.ResourceBundle run() { - return (java.util.ResourceBundle.getBundle - ("sun.security.util.AuthResources")); - } - }); - - private Vector<GrantEntry> grantEntries; - - // Convenience variables for parsing - private static final sun.security.util.Debug debug = - sun.security.util.Debug.getInstance("parser", "\t[Auth Policy Parser]"); - private StreamTokenizer st; - private int lookahead; - private int linenum; - private boolean expandProp = false; - private String keyStoreUrlString = null; // unexpanded - private String keyStoreType = null; - - private String expand(String value) - throws PropertyExpander.ExpandException - { - if (expandProp) - return PropertyExpander.expand(value); - else - return value; - } - /** - * Creates a PolicyParser object. - */ - - public PolicyParser() { - grantEntries = new Vector<GrantEntry>(); - } - - - public PolicyParser(boolean expandProp) { - this(); - this.expandProp = expandProp; - } - - /** - * Reads a policy configuration into the Policy object using a - * Reader object. <p> - * - * @param policy the policy Reader object. - * - * @exception ParsingException if the policy configuration contains - * a syntax error. - * - * @exception IOException if an error occurs while reading the policy - * configuration. - */ - - public void read(Reader policy) - throws ParsingException, IOException - { - if (!(policy instanceof BufferedReader)) { - policy = new BufferedReader(policy); - } - - /** - * Configure the stream tokenizer: - * Recognize strings between "..." - * Don't convert words to lowercase - * Recognize both C-style and C++-style comments - * Treat end-of-line as white space, not as a token - */ - st = new StreamTokenizer(policy); - - st.resetSyntax(); - st.wordChars('a', 'z'); - st.wordChars('A', 'Z'); - st.wordChars('.', '.'); - st.wordChars('0', '9'); - st.wordChars('_', '_'); - st.wordChars('$', '$'); - st.wordChars(128 + 32, 255); - st.whitespaceChars(0, ' '); - st.commentChar('/'); - st.quoteChar('\''); - st.quoteChar('"'); - st.lowerCaseMode(false); - st.ordinaryChar('/'); - st.slashSlashComments(true); - st.slashStarComments(true); - - /** - * The main parsing loop. The loop is executed once - * for each entry in the config file. The entries - * are delimited by semicolons. Once we've read in - * the information for an entry, go ahead and try to - * add it to the policy vector. - * - */ - - lookahead = st.nextToken(); - while (lookahead != StreamTokenizer.TT_EOF) { - if (peek("grant")) { - GrantEntry ge = parseGrantEntry(); - // could be null if we couldn't expand a property - if (ge != null) - add(ge); - } else if (peek("keystore") && keyStoreUrlString==null) { - // only one keystore entry per policy file, others will be - // ignored - parseKeyStoreEntry(); - } else { - // error? - } - match(";"); - } - } - - public void add(GrantEntry ge) - { - grantEntries.addElement(ge); - } - - public void replace(GrantEntry origGe, GrantEntry newGe) - { - grantEntries.setElementAt(newGe, grantEntries.indexOf(origGe)); - } - - public boolean remove(GrantEntry ge) - { - return grantEntries.removeElement(ge); - } - - /** - * Returns the (possibly expanded) keystore location, or null if the - * expansion fails. - */ - public String getKeyStoreUrl() { - try { - if (keyStoreUrlString!=null && keyStoreUrlString.length()!=0) { - return expand(keyStoreUrlString).replace(File.separatorChar, - '/'); - } - } catch (PropertyExpander.ExpandException peee) { - return null; - } - return null; - } - - public void setKeyStoreUrl(String url) { - keyStoreUrlString = url; - } - - public String getKeyStoreType() { - return keyStoreType; - } - - public void setKeyStoreType(String type) { - keyStoreType = type; - } - - /** - * Enumerate all the entries in the global policy object. - * This method is used by policy admin tools. The tools - * should use the Enumeration methods on the returned object - * to fetch the elements sequentially. - */ - public Enumeration<GrantEntry> grantElements(){ - return grantEntries.elements(); - } - - /** - * write out the policy - */ - - public void write(Writer policy) - { - PrintWriter out = new PrintWriter(new BufferedWriter(policy)); - - Enumeration<GrantEntry> enum_ = grantElements(); - - out.println("/* AUTOMATICALLY GENERATED ON "+ - (new java.util.Date()) + "*/"); - out.println("/* DO NOT EDIT */"); - out.println(); - - // write the (unexpanded) keystore entry as the first entry of the - // policy file - if (keyStoreUrlString != null) { - writeKeyStoreEntry(out); - } - - // write "grant" entries - while (enum_.hasMoreElements()) { - GrantEntry ge = enum_.nextElement(); - ge.write(out); - out.println(); - } - out.flush(); - } - - /** - * parses a keystore entry - */ - private void parseKeyStoreEntry() throws ParsingException, IOException { - match("keystore"); - keyStoreUrlString = match("quoted string"); - - // parse keystore type - if (!peek(",")) { - return; // default type - } - match(","); - - if (peek("\"")) { - keyStoreType = match("quoted string"); - } else { - throw new ParsingException(st.lineno(), - rb.getString("expected.keystore.type")); - } - } - - /** - * writes the (unexpanded) keystore entry - */ - private void writeKeyStoreEntry(PrintWriter out) { - out.print("keystore \""); - out.print(keyStoreUrlString); - out.print('"'); - if (keyStoreType != null && keyStoreType.length() > 0) - out.print(", \"" + keyStoreType + "\""); - out.println(";"); - out.println(); - } - - /** - * parse a Grant entry - */ - private GrantEntry parseGrantEntry() - throws ParsingException, IOException - { - GrantEntry e = new GrantEntry(); - LinkedList<PrincipalEntry> principals = null; - boolean ignoreEntry = false; - - match("grant"); - - while(!peek("{")) { - - if (peekAndMatch("Codebase")) { - e.codeBase = match("quoted string"); - peekAndMatch(","); - } else if (peekAndMatch("SignedBy")) { - e.signedBy = match("quoted string"); - peekAndMatch(","); - } else if (peekAndMatch("Principal")) { - if (principals == null) { - principals = new LinkedList<PrincipalEntry>(); - } - - // check for principalClass wildcard - String principalClass; - if (peek("*")) { - match("*"); - principalClass = PrincipalEntry.WILDCARD_CLASS; - } else { - principalClass = match("principal type"); - } - - // check for principalName wildcard - String principalName; - if (peek("*")) { - match("*"); - principalName = PrincipalEntry.WILDCARD_NAME; - } else { - principalName = match("quoted string"); - } - - // disallow WILDCARD_CLASS && actual name - if (principalClass.equals(PrincipalEntry.WILDCARD_CLASS) && - !principalName.equals(PrincipalEntry.WILDCARD_NAME)) { - if (debug != null) - debug.println("disallowing principal that has " + - "WILDCARD class but no WILDCARD name"); - throw new ParsingException - (st.lineno(), - rb.getString("can.not.specify.Principal.with.a." + - "wildcard.class.without.a.wildcard.name")); - } - - try { - principalName = expand(principalName); - principals.add - (new PrincipalEntry(principalClass, principalName)); - } catch (PropertyExpander.ExpandException peee) { - // ignore the entire policy entry - // but continue parsing all the info - // so we can get to the next entry - if (debug != null) - debug.println("principal name expansion failed: " + - principalName); - ignoreEntry = true; - } - peekAndMatch(","); - } else { - throw new - ParsingException(st.lineno(), - rb.getString("expected.codeBase.or.SignedBy")); - } - } - - // disallow non principal-based grant entries - if (principals == null) { - throw new ParsingException - (st.lineno(), - rb.getString("only.Principal.based.grant.entries.permitted")); - } - - e.principals = principals; - match("{"); - - while(!peek("}")) { - if (peek("Permission")) { - try { - PermissionEntry pe = parsePermissionEntry(); - e.add(pe); - } catch (PropertyExpander.ExpandException peee) { - // ignore. The add never happened - skipEntry(); // BugId 4219343 - } - match(";"); - } else { - throw new - ParsingException(st.lineno(), - rb.getString("expected.permission.entry")); - } - } - match("}"); - - try { - if (e.codeBase != null) - e.codeBase = expand(e.codeBase).replace(File.separatorChar, '/'); - e.signedBy = expand(e.signedBy); - } catch (PropertyExpander.ExpandException peee) { - return null; - } - - return (ignoreEntry == true) ? null : e; - } - - /** - * parse a Permission entry - */ - private PermissionEntry parsePermissionEntry() - throws ParsingException, IOException, PropertyExpander.ExpandException - { - PermissionEntry e = new PermissionEntry(); - - // Permission - match("Permission"); - e.permission = match("permission type"); - - if (peek("\"")) { - // Permission name - e.name = expand(match("quoted string")); - } - - if (!peek(",")) { - return e; - } - match(","); - - if (peek("\"")) { - e.action = expand(match("quoted string")); - if (!peek(",")) { - return e; - } - match(","); - } - - if (peekAndMatch("SignedBy")) { - e.signedBy = expand(match("quoted string")); - } - return e; - } - - private boolean peekAndMatch(String expect) - throws ParsingException, IOException - { - if (peek(expect)) { - match(expect); - return true; - } else { - return false; - } - } - - private boolean peek(String expect) { - boolean found = false; - - switch (lookahead) { - - case StreamTokenizer.TT_WORD: - if (expect.equalsIgnoreCase(st.sval)) - found = true; - break; - case ',': - if (expect.equalsIgnoreCase(",")) - found = true; - break; - case '{': - if (expect.equalsIgnoreCase("{")) - found = true; - break; - case '}': - if (expect.equalsIgnoreCase("}")) - found = true; - break; - case '"': - if (expect.equalsIgnoreCase("\"")) - found = true; - break; - case '*': - if (expect.equalsIgnoreCase("*")) - found = true; - break; - default: - - } - return found; - } - - private String match(String expect) - throws ParsingException, IOException - { - String value = null; - - switch (lookahead) { - case StreamTokenizer.TT_NUMBER: - throw new ParsingException(st.lineno(), expect, - rb.getString("number.") + - String.valueOf(st.nval)); - case StreamTokenizer.TT_EOF: - MessageFormat form = new MessageFormat( - rb.getString("expected.expect.read.end.of.file.")); - Object[] source = {expect}; - throw new ParsingException(form.format(source)); - case StreamTokenizer.TT_WORD: - if (expect.equalsIgnoreCase(st.sval)) { - lookahead = st.nextToken(); - } else if (expect.equalsIgnoreCase("permission type")) { - value = st.sval; - lookahead = st.nextToken(); - } else if (expect.equalsIgnoreCase("principal type")) { - value = st.sval; - lookahead = st.nextToken(); - } else { - throw new ParsingException(st.lineno(), expect, st.sval); - } - break; - case '"': - if (expect.equalsIgnoreCase("quoted string")) { - value = st.sval; - lookahead = st.nextToken(); - } else if (expect.equalsIgnoreCase("permission type")) { - value = st.sval; - lookahead = st.nextToken(); - } else if (expect.equalsIgnoreCase("principal type")) { - value = st.sval; - lookahead = st.nextToken(); - } else { - throw new ParsingException(st.lineno(), expect, st.sval); - } - break; - case ',': - if (expect.equalsIgnoreCase(",")) - lookahead = st.nextToken(); - else - throw new ParsingException(st.lineno(), expect, ","); - break; - case '{': - if (expect.equalsIgnoreCase("{")) - lookahead = st.nextToken(); - else - throw new ParsingException(st.lineno(), expect, "{"); - break; - case '}': - if (expect.equalsIgnoreCase("}")) - lookahead = st.nextToken(); - else - throw new ParsingException(st.lineno(), expect, "}"); - break; - case ';': - if (expect.equalsIgnoreCase(";")) - lookahead = st.nextToken(); - else - throw new ParsingException(st.lineno(), expect, ";"); - break; - case '*': - if (expect.equalsIgnoreCase("*")) - lookahead = st.nextToken(); - else - throw new ParsingException(st.lineno(), expect, "*"); - break; - default: - throw new ParsingException(st.lineno(), expect, - new String(new char[] {(char)lookahead})); - } - return value; - } - - /** - * skip all tokens for this entry leaving the delimiter ";" - * in the stream. - */ - private void skipEntry() - throws ParsingException, IOException - { - while(lookahead != ';') { - switch (lookahead) { - case StreamTokenizer.TT_NUMBER: - throw new ParsingException(st.lineno(), ";", - rb.getString("number.") + - String.valueOf(st.nval)); - case StreamTokenizer.TT_EOF: - throw new ParsingException - (rb.getString("expected.read.end.of.file")); - default: - lookahead = st.nextToken(); - } - } - } - - /** - * Each grant entry in the policy configuration file is - * represented by a - * GrantEntry object. <p> - * - * <p> - * For example, the entry - * <pre> - * grant signedBy "Duke" { - * permission java.io.FilePermission "/tmp", "read,write"; - * }; - * - * </pre> - * is represented internally - * <pre> - * - * pe = new PermissionEntry("java.io.FilePermission", - * "/tmp", "read,write"); - * - * ge = new GrantEntry("Duke", null); - * - * ge.add(pe); - * - * </pre> - * - * @author Roland Schemers - * - * version 1.19, 05/21/98 - */ - - static class GrantEntry { - - public String signedBy; - public String codeBase; - public LinkedList<PrincipalEntry> principals; - public Vector<PermissionEntry> permissionEntries; - - public GrantEntry() { - permissionEntries = new Vector<PermissionEntry>(); - } - - public GrantEntry(String signedBy, String codeBase) { - this.codeBase = codeBase; - this.signedBy = signedBy; - permissionEntries = new Vector<PermissionEntry>(); - } - - public void add(PermissionEntry pe) - { - permissionEntries.addElement(pe); - } - - public boolean remove(PermissionEntry pe) - { - return permissionEntries.removeElement(pe); - } - - public boolean contains(PermissionEntry pe) - { - return permissionEntries.contains(pe); - } - - /** - * Enumerate all the permission entries in this GrantEntry. - */ - public Enumeration<PermissionEntry> permissionElements(){ - return permissionEntries.elements(); - } - - - public void write(PrintWriter out) { - out.print("grant"); - if (signedBy != null) { - out.print(" signedBy \""); - out.print(signedBy); - out.print('"'); - if (codeBase != null) - out.print(", "); - } - if (codeBase != null) { - out.print(" codeBase \""); - out.print(codeBase); - out.print('"'); - if (principals != null && principals.size() > 0) - out.print(",\n"); - } - if (principals != null && principals.size() > 0) { - ListIterator<PrincipalEntry> pli = principals.listIterator(); - while (pli.hasNext()) { - out.print("\tPrincipal "); - PrincipalEntry pe = pli.next(); - out.print(pe.principalClass + - " \"" + pe.principalName + "\""); - if (pli.hasNext()) - out.print(",\n"); - } - } - out.println(" {"); - Enumeration<PermissionEntry> enum_ = permissionEntries.elements(); - while (enum_.hasMoreElements()) { - PermissionEntry pe = enum_.nextElement(); - out.write(" "); - pe.write(out); - } - out.println("};"); - } - - } - - /** - * Principal info (class and name) in a grant entry - */ - static class PrincipalEntry { - - static final String WILDCARD_CLASS = "WILDCARD_PRINCIPAL_CLASS"; - static final String WILDCARD_NAME = "WILDCARD_PRINCIPAL_NAME"; - - String principalClass; - String principalName; - - /** - * A PrincipalEntry consists of the <code>Principal</code> - * class and <code>Principal</code> name. - * - * <p> - * - * @param principalClass the <code>Principal</code> class. <p> - * - * @param principalName the <code>Principal</code> name. <p> - */ - public PrincipalEntry(String principalClass, String principalName) { - if (principalClass == null || principalName == null) - throw new NullPointerException - ("null principalClass or principalName"); - this.principalClass = principalClass; - this.principalName = principalName; - } - - /** - * Test for equality between the specified object and this object. - * Two PrincipalEntries are equal if their PrincipalClass and - * PrincipalName values are equal. - * - * <p> - * - * @param obj the object to test for equality with this object. - * - * @return true if the objects are equal, false otherwise. - */ - public boolean equals(Object obj) { - if (this == obj) - return true; - - if (!(obj instanceof PrincipalEntry)) - return false; - - PrincipalEntry that = (PrincipalEntry)obj; - if (this.principalClass.equals(that.principalClass) && - this.principalName.equals(that.principalName)) { - return true; - } - - return false; - } - - /** - * Return a hashcode for this <code>PrincipalEntry</code>. - * - * <p> - * - * @return a hashcode for this <code>PrincipalEntry</code>. - */ - public int hashCode() { - return principalClass.hashCode(); - } - } - - /** - * Each permission entry in the policy configuration file is - * represented by a - * PermissionEntry object. <p> - * - * <p> - * For example, the entry - * <pre> - * permission java.io.FilePermission "/tmp", "read,write"; - * </pre> - * is represented internally - * <pre> - * - * pe = new PermissionEntry("java.io.FilePermission", - * "/tmp", "read,write"); - * </pre> - * - * @author Roland Schemers - * - * version 1.19, 05/21/98 - */ - - static class PermissionEntry { - - public String permission; - public String name; - public String action; - public String signedBy; - - public PermissionEntry() { - } - - public PermissionEntry(String permission, - String name, - String action) { - this.permission = permission; - this.name = name; - this.action = action; - } - - /** - * Calculates a hash code value for the object. Objects - * which are equal will also have the same hashcode. - */ - public int hashCode() { - int retval = permission.hashCode(); - if (name != null) retval ^= name.hashCode(); - if (action != null) retval ^= action.hashCode(); - return retval; - } - - public boolean equals(Object obj) { - if (obj == this) - return true; - - if (! (obj instanceof PermissionEntry)) - return false; - - PermissionEntry that = (PermissionEntry) obj; - - if (this.permission == null) { - if (that.permission != null) return false; - } else { - if (!this.permission.equals(that.permission)) return false; - } - - if (this.name == null) { - if (that.name != null) return false; - } else { - if (!this.name.equals(that.name)) return false; - } - - if (this.action == null) { - if (that.action != null) return false; - } else { - if (!this.action.equals(that.action)) return false; - } - - if (this.signedBy == null) { - if (that.signedBy != null) return false; - } else { - if (!this.signedBy.equals(that.signedBy)) return false; - } - - // everything matched -- the 2 objects are equal - return true; - } - - public void write(PrintWriter out) { - out.print("permission "); - out.print(permission); - if (name != null) { - out.print(" \""); - - // have to add escape chars for quotes - if (name.indexOf("\"") != -1) { - int numQuotes = 0; - char[] chars = name.toCharArray(); - - // count the number of quote chars - for (int i = 0; i < chars.length; i++) { - if (chars[i] == '"') - numQuotes++; - } - - // now, add an escape char before each quote - char[] newChars = new char[chars.length + numQuotes]; - for (int i = 0, j = 0; i < chars.length; i++) { - if (chars[i] != '"') { - newChars[j++] = chars[i]; - } else { - newChars[j++] = '\\'; - newChars[j++] = chars[i]; - } - } - name = new String(newChars); - } - out.print(name); - out.print('"'); - } - if (action != null) { - out.print(", \""); - out.print(action); - out.print('"'); - } - if (signedBy != null) { - out.print(", signedBy \""); - out.print(signedBy); - out.print('"'); - } - out.println(";"); - } - } - - static class ParsingException extends GeneralSecurityException { - - private static final long serialVersionUID = 8240970523155877400L; - - /** - * Constructs a ParsingException with the specified - * detail message. A detail message is a String that describes - * this particular exception, which may, for example, specify which - * algorithm is not available. - * - * @param msg the detail message. - */ - public ParsingException(String msg) { - super(msg); - } - - public ParsingException(int line, String msg) { - super(rb.getString("line.") + line + rb.getString("COLON") + msg); - } - - public ParsingException(int line, String expect, String actual) { - super(rb.getString("line.") + line + rb.getString(".expected.") + - expect + rb.getString(".found.") + actual + - rb.getString("QUOTE")); - } - } - - public static void main(String arg[]) throws Exception { - PolicyParser pp = new PolicyParser(true); - pp.read(new FileReader(arg[0])); - FileWriter fr = new FileWriter(arg[1]); - pp.write(fr); - fr.close(); - } -}
--- a/src/share/classes/com/sun/security/auth/SubjectCodeSource.java Tue Aug 27 13:37:38 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,398 +0,0 @@ -/* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.security.auth; - -import java.net.URL; -import java.util.*; -import java.security.CodeSource; -import java.security.Principal; -import java.security.cert.Certificate; -import java.lang.reflect.Constructor; - -import javax.security.auth.Subject; -import sun.security.provider.PolicyParser.PrincipalEntry; - -/** - * <p> This <code>SubjectCodeSource</code> class contains - * a <code>URL</code>, signer certificates, and either a <code>Subject</code> - * (that represents the <code>Subject</code> in the current - * <code>AccessControlContext</code>), - * or a linked list of Principals/PrincipalComparators - * (that represent a "subject" in a <code>Policy</code>). - * - */ -class SubjectCodeSource extends CodeSource implements java.io.Serializable { - - private static final long serialVersionUID = 6039418085604715275L; - - private static final java.util.ResourceBundle rb = - java.security.AccessController.doPrivileged - (new java.security.PrivilegedAction<java.util.ResourceBundle>() { - public java.util.ResourceBundle run() { - return (java.util.ResourceBundle.getBundle - ("sun.security.util.AuthResources")); - } - }); - - private Subject subject; - private LinkedList<PrincipalEntry> principals; - private static final Class[] PARAMS = { String.class }; - private static final sun.security.util.Debug debug = - sun.security.util.Debug.getInstance("auth", "\t[Auth Access]"); - private ClassLoader sysClassLoader; - - /** - * Creates a new <code>SubjectCodeSource</code> - * with the given <code>Subject</code>, principals, <code>URL</code>, - * and signers (Certificates). The <code>Subject</code> - * represents the <code>Subject</code> associated with the current - * <code>AccessControlContext</code>. - * The Principals are given as a <code>LinkedList</code> - * of <code>PolicyParser.PrincipalEntry</code> objects. - * Typically either a <code>Subject</code> will be provided, - * or a list of <code>principals</code> will be provided - * (not both). - * - * <p> - * - * @param subject the <code>Subject</code> associated with this - * <code>SubjectCodeSource</code> <p> - * - * @param url the <code>URL</code> associated with this - * <code>SubjectCodeSource</code> <p> - * - * @param certs the signers associated with this - * <code>SubjectCodeSource</code> <p> - */ - SubjectCodeSource(Subject subject, - LinkedList<PrincipalEntry> principals, - URL url, Certificate[] certs) { - - super(url, certs); - this.subject = subject; - this.principals = (principals == null ? - new LinkedList<PrincipalEntry>() : - new LinkedList<PrincipalEntry>(principals)); - sysClassLoader = java.security.AccessController.doPrivileged - (new java.security.PrivilegedAction<ClassLoader>() { - public ClassLoader run() { - return ClassLoader.getSystemClassLoader(); - } - }); - } - - /** - * Get the Principals associated with this <code>SubjectCodeSource</code>. - * The Principals are retrieved as a <code>LinkedList</code> - * of <code>PolicyParser.PrincipalEntry</code> objects. - * - * <p> - * - * @return the Principals associated with this - * <code>SubjectCodeSource</code> as a <code>LinkedList</code> - * of <code>PolicyParser.PrincipalEntry</code> objects. - */ - LinkedList<PrincipalEntry> getPrincipals() { - return principals; - } - - /** - * Get the <code>Subject</code> associated with this - * <code>SubjectCodeSource</code>. The <code>Subject</code> - * represents the <code>Subject</code> associated with the - * current <code>AccessControlContext</code>. - * - * <p> - * - * @return the <code>Subject</code> associated with this - * <code>SubjectCodeSource</code>. - */ - Subject getSubject() { - return subject; - } - - /** - * Returns true if this <code>SubjectCodeSource</code> object "implies" - * the specified <code>CodeSource</code>. - * More specifically, this method makes the following checks. - * If any fail, it returns false. If they all succeed, it returns true. - * - * <p> - * <ol> - * <li> The provided codesource must not be <code>null</code>. - * <li> codesource must be an instance of <code>SubjectCodeSource</code>. - * <li> super.implies(codesource) must return true. - * <li> for each principal in this codesource's principal list: - * <ol> - * <li> if the principal is an instanceof - * <code>PrincipalComparator</code>, then the principal must - * imply the provided codesource's <code>Subject</code>. - * <li> if the principal is not an instanceof - * <code>PrincipalComparator</code>, then the provided - * codesource's <code>Subject</code> must have an - * associated <code>Principal</code>, <i>P</i>, where - * P.getClass().getName equals principal.principalClass, - * and P.getName() equals principal.principalName. - * </ol> - * </ol> - * - * <p> - * - * @param codesource the <code>CodeSource</code> to compare against. - * - * @return true if this <code>SubjectCodeSource</code> implies the - * the specified <code>CodeSource</code>. - */ - public boolean implies(CodeSource codesource) { - - LinkedList<PrincipalEntry> subjectList = null; - - if (codesource == null || - !(codesource instanceof SubjectCodeSource) || - !(super.implies(codesource))) { - - if (debug != null) - debug.println("\tSubjectCodeSource.implies: FAILURE 1"); - return false; - } - - SubjectCodeSource that = (SubjectCodeSource)codesource; - - // if the principal list in the policy "implies" - // the Subject associated with the current AccessControlContext, - // then return true - - if (this.principals == null) { - if (debug != null) - debug.println("\tSubjectCodeSource.implies: PASS 1"); - return true; - } - - if (that.getSubject() == null || - that.getSubject().getPrincipals().size() == 0) { - if (debug != null) - debug.println("\tSubjectCodeSource.implies: FAILURE 2"); - return false; - } - - ListIterator<PrincipalEntry> li = this.principals.listIterator(0); - while (li.hasNext()) { - PrincipalEntry pppe = li.next(); - try { - - // handle PrincipalComparators - - Class<?> principalComparator = Class.forName( - pppe.getPrincipalClass(), true, sysClassLoader); - Constructor<?> c = principalComparator.getConstructor(PARAMS); - PrincipalComparator pc = - (PrincipalComparator)c.newInstance - (new Object[] { pppe.getPrincipalName() }); - - if (!pc.implies(that.getSubject())) { - if (debug != null) - debug.println("\tSubjectCodeSource.implies: FAILURE 3"); - return false; - } else { - if (debug != null) - debug.println("\tSubjectCodeSource.implies: PASS 2"); - return true; - } - } catch (Exception e) { - - // no PrincipalComparator, simply compare Principals - - if (subjectList == null) { - - if (that.getSubject() == null) { - if (debug != null) - debug.println("\tSubjectCodeSource.implies: " + - "FAILURE 4"); - return false; - } - Iterator<Principal> i = - that.getSubject().getPrincipals().iterator(); - - subjectList = new LinkedList<PrincipalEntry>(); - while (i.hasNext()) { - Principal p = i.next(); - PrincipalEntry spppe = new PrincipalEntry - (p.getClass().getName(), p.getName()); - subjectList.add(spppe); - } - } - - if (!subjectListImpliesPrincipalEntry(subjectList, pppe)) { - if (debug != null) - debug.println("\tSubjectCodeSource.implies: FAILURE 5"); - return false; - } - } - } - - if (debug != null) - debug.println("\tSubjectCodeSource.implies: PASS 3"); - return true; - } - - /** - * This method returns, true, if the provided <i>subjectList</i> - * "contains" the <code>Principal</code> specified - * in the provided <i>pppe</i> argument. - * - * Note that the provided <i>pppe</i> argument may have - * wildcards (*) for the <code>Principal</code> class and name, - * which need to be considered. - * - * <p> - * - * @param subjectList a list of PolicyParser.PrincipalEntry objects - * that correspond to all the Principals in the Subject currently - * on this thread's AccessControlContext. <p> - * - * @param pppe the Principals specified in a grant entry. - * - * @return true if the provided <i>subjectList</i> "contains" - * the <code>Principal</code> specified in the provided - * <i>pppe</i> argument. - */ - private boolean subjectListImpliesPrincipalEntry( - LinkedList<PrincipalEntry> subjectList, PrincipalEntry pppe) { - - ListIterator<PrincipalEntry> li = subjectList.listIterator(0); - while (li.hasNext()) { - PrincipalEntry listPppe = li.next(); - - if (pppe.getPrincipalClass().equals - (PrincipalEntry.WILDCARD_CLASS) || - pppe.getPrincipalClass().equals(listPppe.getPrincipalClass())) - { - if (pppe.getPrincipalName().equals - (PrincipalEntry.WILDCARD_NAME) || - pppe.getPrincipalName().equals(listPppe.getPrincipalName())) - return true; - } - } - return false; - } - - /** - * Tests for equality between the specified object and this - * object. Two <code>SubjectCodeSource</code> objects are considered equal - * if their locations are of identical value, if the two sets of - * Certificates are of identical values, and if the - * Subjects are equal, and if the PolicyParser.PrincipalEntry values - * are of identical values. It is not required that - * the Certificates or PolicyParser.PrincipalEntry values - * be in the same order. - * - * <p> - * - * @param obj the object to test for equality with this object. - * - * @return true if the objects are considered equal, false otherwise. - */ - public boolean equals(Object obj) { - - if (obj == this) - return true; - - if (super.equals(obj) == false) - return false; - - if (!(obj instanceof SubjectCodeSource)) - return false; - - SubjectCodeSource that = (SubjectCodeSource)obj; - - // the principal lists must match - try { - if (this.getSubject() != that.getSubject()) - return false; - } catch (SecurityException se) { - return false; - } - - if ((this.principals == null && that.principals != null) || - (this.principals != null && that.principals == null)) - return false; - - if (this.principals != null && that.principals != null) { - if (!this.principals.containsAll(that.principals) || - !that.principals.containsAll(this.principals)) - - return false; - } - - return true; - } - - /** - * Return a hashcode for this <code>SubjectCodeSource</code>. - * - * <p> - * - * @return a hashcode for this <code>SubjectCodeSource</code>. - */ - public int hashCode() { - return super.hashCode(); - } - - /** - * Return a String representation of this <code>SubjectCodeSource</code>. - * - * <p> - * - * @return a String representation of this <code>SubjectCodeSource</code>. - */ - public String toString() { - String returnMe = super.toString(); - if (getSubject() != null) { - if (debug != null) { - final Subject finalSubject = getSubject(); - returnMe = returnMe + "\n" + - java.security.AccessController.doPrivileged - (new java.security.PrivilegedAction<String>() { - public String run() { - return finalSubject.toString(); - } - }); - } else { - returnMe = returnMe + "\n" + getSubject().toString(); - } - } - if (principals != null) { - ListIterator<PrincipalEntry> li = principals.listIterator(); - while (li.hasNext()) { - PrincipalEntry pppe = li.next(); - returnMe = returnMe + rb.getString("NEWLINE") + - pppe.getPrincipalClass() + " " + - pppe.getPrincipalName(); - } - } - return returnMe; - } -}
--- a/src/share/classes/com/sun/security/auth/login/ConfigFile.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/com/sun/security/auth/login/ConfigFile.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2013, Oracle and/or its affiliates. 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 @@ -30,9 +30,9 @@ import java.net.URI; // NOTE: As of JDK 8, this class instantiates -// sun.security.provider.ConfigSpiFile and forwards all methods to that +// sun.security.provider.ConfigFile.Spi and forwards all methods to that // implementation. All implementation fixes and enhancements should be made to -// sun.security.provider.ConfigSpiFile and not this class. +// sun.security.provider.ConfigFile.Spi and not this class. // See JDK-8005117 for more information. /** @@ -85,7 +85,7 @@ */ public class ConfigFile extends Configuration { - private sun.security.provider.ConfigSpiFile configFile; + private final sun.security.provider.ConfigFile.Spi spi; /** * Create a new {@code Configuration} object. @@ -94,7 +94,7 @@ * initialized */ public ConfigFile() { - configFile = new sun.security.provider.ConfigSpiFile(); + spi = new sun.security.provider.ConfigFile.Spi(); } /** @@ -106,7 +106,7 @@ * @throws NullPointerException if {@code uri} is null */ public ConfigFile(URI uri) { - configFile = new sun.security.provider.ConfigSpiFile(uri); + spi = new sun.security.provider.ConfigFile.Spi(uri); } /** @@ -123,7 +123,7 @@ public AppConfigurationEntry[] getAppConfigurationEntry (String applicationName) { - return configFile.engineGetAppConfigurationEntry(applicationName); + return spi.engineGetAppConfigurationEntry(applicationName); } /** @@ -134,7 +134,7 @@ * to refresh the {@code Configuration} */ @Override - public synchronized void refresh() { - configFile.engineRefresh(); + public void refresh() { + spi.engineRefresh(); } }
--- a/src/share/classes/com/sun/tools/hat/resources/hat.js Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/com/sun/tools/hat/resources/hat.js Tue Aug 27 21:46:00 2013 -0700 @@ -1144,7 +1144,7 @@ } else { for (var index in array) { var it = array[index]; - if (func(it, index, array)) { + if (func(it, String(index), array)) { return true; } } @@ -1244,7 +1244,7 @@ var result = new Array(); for (var index in array) { var it = array[index]; - if (func(it, index, array, result)) { + if (func(it, String(index), array, result)) { result[result.length] = it; } } @@ -1317,7 +1317,7 @@ var result = new Array(); for (var index in array) { var it = array[index]; - result[result.length] = func(it, index, array, result); + result[result.length] = func(it, String(index), array, result); } return result; }
--- a/src/share/classes/java/io/RandomAccessFile.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/io/RandomAccessFile.java Tue Aug 27 21:46:00 2013 -0700 @@ -518,7 +518,15 @@ * @exception IOException if {@code pos} is less than * {@code 0} or if an I/O error occurs. */ - public native void seek(long pos) throws IOException; + public void seek(long pos) throws IOException { + if (pos < 0) { + throw new IOException("Negative seek offset"); + } else { + seek0(pos); + } + } + + private native void seek0(long pos) throws IOException; /** * Returns the length of this file.
--- a/src/share/classes/java/lang/Math.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/lang/Math.java Tue Aug 27 21:46:00 2013 -0700 @@ -825,7 +825,7 @@ public static int multiplyExact(int x, int y) { long r = (long)x * (long)y; if ((int)r != r) { - throw new ArithmeticException("long overflow"); + throw new ArithmeticException("integer overflow"); } return (int)r; } @@ -857,6 +857,108 @@ } /** + * Returns the argument incremented by one, throwing an exception if the + * result overflows an {@code int}. + * + * @param a the value to increment + * @return the result + * @throws ArithmeticException if the result overflows an int + * @since 1.8 + */ + public static int incrementExact(int a) { + if (a == Integer.MAX_VALUE) { + throw new ArithmeticException("integer overflow"); + } + + return a + 1; + } + + /** + * Returns the argument incremented by one, throwing an exception if the + * result overflows a {@code long}. + * + * @param a the value to increment + * @return the result + * @throws ArithmeticException if the result overflows a long + * @since 1.8 + */ + public static long incrementExact(long a) { + if (a == Long.MAX_VALUE) { + throw new ArithmeticException("long overflow"); + } + + return a + 1L; + } + + /** + * Returns the argument decremented by one, throwing an exception if the + * result overflows an {@code int}. + * + * @param a the value to decrement + * @return the result + * @throws ArithmeticException if the result overflows an int + * @since 1.8 + */ + public static int decrementExact(int a) { + if (a == Integer.MIN_VALUE) { + throw new ArithmeticException("integer overflow"); + } + + return a - 1; + } + + /** + * Returns the argument decremented by one, throwing an exception if the + * result overflows a {@code long}. + * + * @param a the value to decrement + * @return the result + * @throws ArithmeticException if the result overflows a long + * @since 1.8 + */ + public static long decrementExact(long a) { + if (a == Long.MIN_VALUE) { + throw new ArithmeticException("long overflow"); + } + + return a - 1L; + } + + /** + * Returns the negation of the argument, throwing an exception if the + * result overflows an {@code int}. + * + * @param a the value to negate + * @return the result + * @throws ArithmeticException if the result overflows an int + * @since 1.8 + */ + public static int negateExact(int a) { + if (a == Integer.MIN_VALUE) { + throw new ArithmeticException("integer overflow"); + } + + return -a; + } + + /** + * Returns the negation of the argument, throwing an exception if the + * result overflows a {@code long}. + * + * @param a the value to negate + * @return the result + * @throws ArithmeticException if the result overflows a long + * @since 1.8 + */ + public static long negateExact(long a) { + if (a == Long.MIN_VALUE) { + throw new ArithmeticException("long overflow"); + } + + return -a; + } + + /** * Returns the value of the {@code long} argument; * throwing an exception if the value overflows an {@code int}. *
--- a/src/share/classes/java/math/MutableBigInteger.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/math/MutableBigInteger.java Tue Aug 27 21:46:00 2013 -0700 @@ -1242,6 +1242,9 @@ int r = intLen; int s = b.intLen; + // Clear the quotient + quotient.offset = quotient.intLen = 0; + if (r < s) { return this; } else { @@ -1276,7 +1279,6 @@ // do schoolbook division on blocks, dividing 2-block numbers by 1-block numbers MutableBigInteger qi = new MutableBigInteger(); MutableBigInteger ri; - quotient.offset = quotient.intLen = 0; for (int i=t-2; i > 0; i--) { // step 8a: compute (qi,ri) such that z=b*qi+ri ri = z.divide2n1n(bShifted, qi);
--- a/src/share/classes/java/net/DatagramPacket.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/net/DatagramPacket.java Tue Aug 27 21:46:00 2013 -0700 @@ -139,8 +139,7 @@ * * @since 1.4 */ - public DatagramPacket(byte buf[], int offset, int length, - SocketAddress address) throws SocketException { + public DatagramPacket(byte buf[], int offset, int length, SocketAddress address) { setData(buf, offset, length); setSocketAddress(address); } @@ -175,8 +174,7 @@ * @since 1.4 * @see java.net.InetAddress */ - public DatagramPacket(byte buf[], int length, - SocketAddress address) throws SocketException { + public DatagramPacket(byte buf[], int length, SocketAddress address) { this(buf, 0, length, address); }
--- a/src/share/classes/java/net/IDN.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/net/IDN.java Tue Aug 27 21:46:00 2013 -0700 @@ -113,11 +113,18 @@ int p = 0, q = 0; StringBuffer out = new StringBuffer(); + if (isRootLabel(input)) { + return "."; + } + while (p < input.length()) { q = searchDots(input, p); out.append(toASCIIInternal(input.substring(p, q), flag)); + if (q != (input.length())) { + // has more labels, or keep the trailing dot as at present + out.append('.'); + } p = q + 1; - if (p < input.length()) out.append('.'); } return out.toString(); @@ -167,11 +174,18 @@ int p = 0, q = 0; StringBuffer out = new StringBuffer(); + if (isRootLabel(input)) { + return "."; + } + while (p < input.length()) { q = searchDots(input, p); out.append(toUnicodeInternal(input.substring(p, q), flag)); + if (q != (input.length())) { + // has more labels, or keep the trailing dot as at present + out.append('.'); + } p = q + 1; - if (p < input.length()) out.append('.'); } return out.toString(); @@ -263,6 +277,13 @@ dest = new StringBuffer(label); } + // step 8, move forward to check the smallest number of the code points + // the length must be inside 1..63 + if (dest.length() == 0) { + throw new IllegalArgumentException( + "Empty label is not a legal name"); + } + // step 3 // Verify the absence of non-LDH ASCII code points // 0..0x2c, 0x2e..0x2f, 0x3a..0x40, 0x5b..0x60, 0x7b..0x7f @@ -311,7 +332,7 @@ // step 8 // the length must be inside 1..63 - if(dest.length() > MAX_LABEL_LENGTH){ + if (dest.length() > MAX_LABEL_LENGTH) { throw new IllegalArgumentException("The label in the input is too long"); } @@ -409,8 +430,7 @@ private static int searchDots(String s, int start) { int i; for (i = start; i < s.length(); i++) { - char c = s.charAt(i); - if (c == '.' || c == '\u3002' || c == '\uFF0E' || c == '\uFF61') { + if (isLabelSeparator(s.charAt(i))) { break; } } @@ -418,6 +438,19 @@ return i; } + // + // to check if a string is a root label, ".". + // + private static boolean isRootLabel(String s) { + return (s.length() == 1 && isLabelSeparator(s.charAt(0))); + } + + // + // to check if a character is a label separator, i.e. a dot character. + // + private static boolean isLabelSeparator(char c) { + return (c == '.' || c == '\u3002' || c == '\uFF0E' || c == '\uFF61'); + } // // to check if a string only contains US-ASCII code point
--- a/src/share/classes/java/net/InetAddress.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/net/InetAddress.java Tue Aug 27 21:46:00 2013 -0700 @@ -1601,7 +1601,6 @@ pf.put("address", holder().getAddress()); pf.put("family", holder().getFamily()); s.writeFields(); - s.flush(); } }
--- a/src/share/classes/java/net/URLClassLoader.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/net/URLClassLoader.java Tue Aug 27 21:46:00 2013 -0700 @@ -57,12 +57,6 @@ * <p> * The classes that are loaded are by default granted permission only to * access the URLs specified when the URLClassLoader was created. - * <p> - * Where a JAR file contains the {@link Name#PROFILE Profile} attribute - * then its value is the name of the Java SE profile that the library - * minimally requires. If this runtime does not support the profile then - * it causes {@link java.util.jar.UnsupportedProfileException} to be - * thrown at some unspecified time. * * @author David Connelly * @since 1.2
--- a/src/share/classes/java/sql/SQLXML.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/sql/SQLXML.java Tue Aug 27 21:46:00 2013 -0700 @@ -98,7 +98,7 @@ * or, to set the result value from SAX events: * <pre> * SAXResult saxResult = sqlxml.setResult(SAXResult.class); - * ContentHandler contentHandler = saxResult.getXMLReader().getContentHandler(); + * ContentHandler contentHandler = saxResult.getHandler(); * contentHandler.startDocument(); * // set the XML elements and attributes into the result * contentHandler.endDocument();
--- a/src/share/classes/java/time/chrono/JapaneseEra.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/time/chrono/JapaneseEra.java Tue Aug 27 21:46:00 2013 -0700 @@ -107,7 +107,7 @@ * The singleton instance for the 'Meiji' era (1868-09-08 - 1912-07-29) * which has the value -1. */ - public static final JapaneseEra MEIJI = new JapaneseEra(-1, LocalDate.of(1868, 9, 8)); + public static final JapaneseEra MEIJI = new JapaneseEra(-1, LocalDate.of(1868, 1, 1)); /** * The singleton instance for the 'Taisho' era (1912-07-30 - 1926-12-24) * which has the value 0.
--- a/src/share/classes/java/util/ArrayDeque.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/ArrayDeque.java Tue Aug 27 21:46:00 2013 -0700 @@ -888,6 +888,19 @@ elements[i] = s.readObject(); } + /** + * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em> + * and <em>fail-fast</em> {@link Spliterator} over the elements in this + * deque. + * + * <p>The {@code Spliterator} reports {@link Spliterator#SIZED}, + * {@link Spliterator#SUBSIZED}, {@link Spliterator#ORDERED}, and + * {@link Spliterator#NONNULL}. Overriding implementations should document + * the reporting of additional characteristic values. + * + * @return a {@code Spliterator} over the elements in this deque + * @since 1.8 + */ public Spliterator<E> spliterator() { return new DeqSpliterator<E>(this, -1, -1); }
--- a/src/share/classes/java/util/ArrayList.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/ArrayList.java Tue Aug 27 21:46:00 2013 -0700 @@ -1238,6 +1238,20 @@ } } + /** + * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em> + * and <em>fail-fast</em> {@link Spliterator} over the elements in this + * list. + * + * <p>The {@code Spliterator} reports {@link Spliterator#SIZED}, + * {@link Spliterator#SUBSIZED}, and {@link Spliterator#ORDERED}. + * Overriding implementations should document the reporting of additional + * characteristic values. + * + * @return a {@code Spliterator} over the elements in this list + * @since 1.8 + */ + @Override public Spliterator<E> spliterator() { return new ArrayListSpliterator<>(this, 0, -1, 0); }
--- a/src/share/classes/java/util/Collection.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/Collection.java Tue Aug 27 21:46:00 2013 -0700 @@ -504,7 +504,10 @@ * * <p>The returned {@code Spliterator} must report the characteristic * {@link Spliterator#SIZED}; implementations should document any additional - * characteristic values reported by the returned Spliterator. + * characteristic values reported by the returned spliterator. If + * this collection contains no elements then the returned spliterator is + * only required to report {@link Spliterator#SIZED} and is not required to + * report additional characteristic values (if any). * * <p>The default implementation should be overridden by subclasses that * can return a more efficient spliterator. In order to @@ -535,6 +538,14 @@ * The returned {@code Spliterator} additionally reports * {@link Spliterator#SUBSIZED}. * + * <p>If a spliterator covers no elements then the reporting of additional + * characteristic values, beyond that of {@code SIZED} and {@code SUBSIZED}, + * does not aid clients to control, specialize or simplify computation. + * However, this does enable shared use of an immutable and empty + * spliterator instance (see {@link Spliterators#emptySpliterator()}) for + * empty collections, and enables clients to determine if such a spliterator + * covers no elements. + * * @return a {@code Spliterator} over the elements in this collection * @since 1.8 */
--- a/src/share/classes/java/util/Collections.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/Collections.java Tue Aug 27 21:46:00 2013 -0700 @@ -4508,7 +4508,6 @@ } @Override public void sort(Comparator<? super E> c) { - Objects.requireNonNull(c); } // Override default methods in Collection
--- a/src/share/classes/java/util/CurrencyData.properties Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/CurrencyData.properties Tue Aug 27 21:46:00 2013 -0700 @@ -28,7 +28,7 @@ # Version of the currency code information in this class. # It is a serial number that accompanies with each amendment. -dataVersion=155 +dataVersion=156 # List of all valid ISO 4217 currency codes. # To ensure compatibility, do not remove codes. @@ -320,7 +320,7 @@ # LAO PEOPLE'S DEMOCRATIC REPUBLIC LA=LAK # LATVIA -LV=LVL +LV=LVL;2013-12-31-22-00-00;EUR # LEBANON LB=LBP # LESOTHO
--- a/src/share/classes/java/util/Formatter.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/Formatter.java Tue Aug 27 21:46:00 2013 -0700 @@ -4196,7 +4196,7 @@ case DateTime.CENTURY: // 'C' (00 - 99) case DateTime.YEAR_2: // 'y' (00 - 99) case DateTime.YEAR_4: { // 'Y' (0000 - 9999) - int i = t.get(ChronoField.YEAR); + int i = t.get(ChronoField.YEAR_OF_ERA); int size = 2; switch (c) { case DateTime.CENTURY:
--- a/src/share/classes/java/util/HashSet.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/HashSet.java Tue Aug 27 21:46:00 2013 -0700 @@ -312,6 +312,18 @@ } } + /** + * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em> + * and <em>fail-fast</em> {@link Spliterator} over the elements in this + * set. + * + * <p>The {@code Spliterator} reports {@link Spliterator#SIZED} and + * {@link Spliterator#DISTINCT}. Overriding implementations should document + * the reporting of additional characteristic values. + * + * @return a {@code Spliterator} over the elements in this set + * @since 1.8 + */ public Spliterator<E> spliterator() { return new HashMap.KeySpliterator<E,Object>(map, 0, -1, 0, 0); }
--- a/src/share/classes/java/util/LinkedHashMap.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/LinkedHashMap.java Tue Aug 27 21:46:00 2013 -0700 @@ -129,10 +129,20 @@ * exception for its correctness: <i>the fail-fast behavior of iterators * should be used only to detect bugs.</i> * + * <p>The spliterators returned by the spliterator method of the collections + * returned by all of this class's collection view methods are + * <em><a href="Spliterator.html#binding">late-binding</a></em>, + * <em>fail-fast</em>, and additionally report {@link Spliterator#ORDERED}. + * * <p>This class is a member of the * <a href="{@docRoot}/../technotes/guides/collections/index.html"> * Java Collections Framework</a>. * + * @implNote + * The spliterators returned by the spliterator method of the collections + * returned by all of this class's collection view methods are created from + * the iterators of the corresponding collections. + * * @param <K> the type of keys maintained by this map * @param <V> the type of mapped values *
--- a/src/share/classes/java/util/LinkedHashSet.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/LinkedHashSet.java Tue Aug 27 21:46:00 2013 -0700 @@ -170,13 +170,23 @@ } /** - * Creates a {@code Spliterator}, over the elements in this set, that - * reports {@code SIZED}, {@code DISTINCT} and {@code ORDERED}. - * Overriding implementations are expected to document if the - * {@code Spliterator} reports any additional and relevant characteristic - * values. + * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em> + * and <em>fail-fast</em> {@code Spliterator} over the elements in this set. + * + * <p>The {@code Spliterator} reports {@link Spliterator#SIZED}, + * {@link Spliterator#DISTINCT}, and {@code ORDERED}. Implementations + * should document the reporting of additional characteristic values. + * + * @implNote + * The implementation creates a + * <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator + * from the set's {@code Iterator}. The spliterator inherits the + * <em>fail-fast</em> properties of the set's iterator. + * The created {@code Spliterator} additionally reports + * {@link Spliterator#SUBSIZED}. * * @return a {@code Spliterator} over the elements in this set + * @since 1.8 */ @Override public Spliterator<E> spliterator() {
--- a/src/share/classes/java/util/LinkedList.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/LinkedList.java Tue Aug 27 21:46:00 2013 -0700 @@ -1149,6 +1149,23 @@ linkLast((E)s.readObject()); } + /** + * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em> + * and <em>fail-fast</em> {@link Spliterator} over the elements in this + * list. + * + * <p>The {@code Spliterator} reports {@link Spliterator#SIZED} and + * {@link Spliterator#ORDERED}. Overriding implementations should document + * the reporting of additional characteristic values. + * + * @implNote + * The {@code Spliterator} additionally reports {@link Spliterator#SUBSIZED} + * and implements {@code trySplit} to permit limited parallelism.. + * + * @return a {@code Spliterator} over the elements in this list + * @since 1.8 + */ + @Override public Spliterator<E> spliterator() { return new LLSpliterator<E>(this, -1, 0); }
--- a/src/share/classes/java/util/List.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/List.java Tue Aug 27 21:46:00 2013 -0700 @@ -671,7 +671,7 @@ * The default implementation creates a * <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator * from the list's {@code Iterator}. The spliterator inherits the - * <em>fail-fast</em> properties of the collection's iterator. + * <em>fail-fast</em> properties of the list's iterator. * * @implNote * The created {@code Spliterator} additionally reports
--- a/src/share/classes/java/util/PriorityQueue.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/PriorityQueue.java Tue Aug 27 21:46:00 2013 -0700 @@ -795,6 +795,19 @@ heapify(); } + /** + * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em> + * and <em>fail-fast</em> {@link Spliterator} over the elements in this + * queue. + * + * <p>The {@code Spliterator} reports {@link Spliterator#SIZED}, + * {@link Spliterator#SUBSIZED}, and {@link Spliterator#NONNULL}. + * Overriding implementations should document the reporting of additional + * characteristic values. + * + * @return a {@code Spliterator} over the elements in this queue + * @since 1.8 + */ public final Spliterator<E> spliterator() { return new PriorityQueueSpliterator<E>(this, 0, -1, 0); }
--- a/src/share/classes/java/util/Set.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/Set.java Tue Aug 27 21:46:00 2013 -0700 @@ -394,7 +394,7 @@ * The default implementation creates a * <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator * from the set's {@code Iterator}. The spliterator inherits the - * <em>fail-fast</em> properties of the collection's iterator. + * <em>fail-fast</em> properties of the set's iterator. * * @implNote * The created {@code Spliterator} additionally reports
--- a/src/share/classes/java/util/SortedSet.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/SortedSet.java Tue Aug 27 21:46:00 2013 -0700 @@ -238,7 +238,7 @@ * The default implementation creates a * <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator * from the sorted set's {@code Iterator}. The spliterator inherits the - * <em>fail-fast</em> properties of the collection's iterator. The + * <em>fail-fast</em> properties of the set's iterator. The * spliterator's comparator is the same as the sorted set's comparator. * * @implNote
--- a/src/share/classes/java/util/Spliterator.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/Spliterator.java Tue Aug 27 21:46:00 2013 -0700 @@ -74,7 +74,11 @@ * source prior to binding are reflected when the Spliterator is traversed. * After binding a Spliterator should, on a best-effort basis, throw * {@link ConcurrentModificationException} if structural interference is - * detected. Spliterators that do this are called <em>fail-fast</em>. + * detected. Spliterators that do this are called <em>fail-fast</em>. The + * bulk traversal method ({@link #forEachRemaining forEachRemaining()}) of a + * Spliterator may optimize traversal and check for structural interference + * after all elements have been traversed, rather than checking per-element and + * failing immediately. * * <p>Spliterators can provide an estimate of the number of remaining elements * via the {@link #estimateSize} method. Ideally, as reflected in characteristic
--- a/src/share/classes/java/util/TreeMap.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/TreeMap.java Tue Aug 27 21:46:00 2013 -0700 @@ -790,8 +790,19 @@ /** * Returns a {@link Set} view of the keys contained in this map. - * The set's iterator returns the keys in ascending order. - * The set is backed by the map, so changes to the map are + * + * <p>The set's iterator returns the keys in ascending order. + * The set's spliterator is + * <em><a href="Spliterator.html#binding">late-binding</a></em>, + * <em>fail-fast</em>, and additionally reports {@link Spliterator#SORTED} + * and {@link Spliterator#ORDERED} with an encounter order that is ascending + * key order. The spliterator's comparator (see + * {@link java.util.Spliterator#getComparator()}) is {@code null} if + * the tree map's comparator (see {@link #comparator()}) is {@code null}. + * Otherwise, the spliterator's comparator is the same as or imposes the + * same total ordering as the tree map's comparator. + * + * <p>The set is backed by the map, so changes to the map are * reflected in the set, and vice-versa. If the map is modified * while an iteration over the set is in progress (except through * the iterator's own {@code remove} operation), the results of @@ -823,9 +834,15 @@ /** * Returns a {@link Collection} view of the values contained in this map. - * The collection's iterator returns the values in ascending order - * of the corresponding keys. - * The collection is backed by the map, so changes to the map are + * + * <p>The collection's iterator returns the values in ascending order + * of the corresponding keys. The collection's spliterator is + * <em><a href="Spliterator.html#binding">late-binding</a></em>, + * <em>fail-fast</em>, and additionally reports {@link Spliterator#ORDERED} + * with an encounter order that is ascending order of the corresponding + * keys. + * + * <p>The collection is backed by the map, so changes to the map are * reflected in the collection, and vice-versa. If the map is * modified while an iteration over the collection is in progress * (except through the iterator's own {@code remove} operation), @@ -843,8 +860,15 @@ /** * Returns a {@link Set} view of the mappings contained in this map. - * The set's iterator returns the entries in ascending key order. - * The set is backed by the map, so changes to the map are + * + * <p>The set's iterator returns the entries in ascending key order. The + * sets's spliterator is + * <em><a href="Spliterator.html#binding">late-binding</a></em>, + * <em>fail-fast</em>, and additionally reports {@link Spliterator#SORTED} and + * {@link Spliterator#ORDERED} with an encounter order that is ascending key + * order. + * + * <p>The set is backed by the map, so changes to the map are * reflected in the set, and vice-versa. If the map is modified * while an iteration over the set is in progress (except through * the iterator's own {@code remove} operation, or through the @@ -2944,16 +2968,11 @@ @Override public Comparator<Map.Entry<K, V>> getComparator() { - // Since SORTED is reported and Map.Entry elements are not comparable - // then a non-null comparator needs to be returned + // Adapt or create a key-based comparator if (tree.comparator != null) { - // Adapt the existing non-null comparator to compare entries - // by key return Map.Entry.comparingByKey(tree.comparator); } else { - // Return a comparator of entries by key, with K assumed to be - // of Comparable return (Comparator<Map.Entry<K, V>> & Serializable) (e1, e2) -> { @SuppressWarnings("unchecked") Comparable<? super K> k1 = (Comparable<? super K>) e1.getKey();
--- a/src/share/classes/java/util/TreeSet.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/TreeSet.java Tue Aug 27 21:46:00 2013 -0700 @@ -533,6 +533,25 @@ tm.readTreeSet(size, s, PRESENT); } + /** + * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em> + * and <em>fail-fast</em> {@link Spliterator} over the elements in this + * set. + * + * <p>The {@code Spliterator} reports {@link Spliterator#SIZED}, + * {@link Spliterator#DISTINCT}, {@link Spliterator#SORTED}, and + * {@link Spliterator#ORDERED}. Overriding implementations should document + * the reporting of additional characteristic values. + * + * <p>The spliterator's comparator (see + * {@link java.util.Spliterator#getComparator()}) is {@code null} if + * the tree set's comparator (see {@link #comparator()}) is {@code null}. + * Otherwise, the spliterator's comparator is the same as or imposes the + * same total ordering as the tree set's comparator. + * + * @return a {@code Spliterator} over the elements in this set + * @since 1.8 + */ public Spliterator<E> spliterator() { return TreeMap.keySpliteratorFor(m); }
--- a/src/share/classes/java/util/Vector.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/Vector.java Tue Aug 27 21:46:00 2013 -0700 @@ -1323,6 +1323,19 @@ modCount++; } + /** + * Creates a <em><a href="Spliterator.html#binding">late-binding</a></em> + * and <em>fail-fast</em> {@link Spliterator} over the elements in this + * list. + * + * <p>The {@code Spliterator} reports {@link Spliterator#SIZED}, + * {@link Spliterator#SUBSIZED}, and {@link Spliterator#ORDERED}. + * Overriding implementations should document the reporting of additional + * characteristic values. + * + * @return a {@code Spliterator} over the elements in this list + * @since 1.8 + */ @Override public Spliterator<E> spliterator() { return new VectorSpliterator<>(this, null, 0, -1, 0);
--- a/src/share/classes/java/util/concurrent/ArrayBlockingQueue.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/ArrayBlockingQueue.java Tue Aug 27 21:46:00 2013 -0700 @@ -757,12 +757,8 @@ * Returns an iterator over the elements in this queue in proper sequence. * The elements will be returned in order from first (head) to last (tail). * - * <p>The returned iterator is a "weakly consistent" iterator that - * will never throw {@link java.util.ConcurrentModificationException - * ConcurrentModificationException}, and guarantees to traverse - * elements as they existed upon construction of the iterator, and - * may (but is not guaranteed to) reflect any modifications - * subsequent to construction. + * <p>The returned iterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * @return an iterator over the elements in this queue in proper sequence */ @@ -1396,9 +1392,26 @@ // } } + /** + * Returns a {@link Spliterator} over the elements in this queue. + * + * <p>The returned spliterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. + * + * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT}, + * {@link Spliterator#ORDERED}, and {@link Spliterator#NONNULL}. + * + * @implNote + * The {@code Spliterator} implements {@code trySplit} to permit limited + * parallelism. + * + * @return a {@code Spliterator} over the elements in this queue + * @since 1.8 + */ public Spliterator<E> spliterator() { return Spliterators.spliterator (this, Spliterator.ORDERED | Spliterator.NONNULL | Spliterator.CONCURRENT); } + }
--- a/src/share/classes/java/util/concurrent/CompletableFuture.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/CompletableFuture.java Tue Aug 27 21:46:00 2013 -0700 @@ -420,6 +420,7 @@ } /** Base class can act as either FJ or plain Runnable */ + @SuppressWarnings("serial") abstract static class Async extends ForkJoinTask<Void> implements Runnable, AsynchronousCompletionTask { public final Void getRawResult() { return null; } @@ -671,6 +672,7 @@ } // Opportunistically subclass AtomicInteger to use compareAndSet to claim. + @SuppressWarnings("serial") abstract static class Completion extends AtomicInteger implements Runnable { }
--- a/src/share/classes/java/util/concurrent/ConcurrentHashMap.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/ConcurrentHashMap.java Tue Aug 27 21:46:00 2013 -0700 @@ -43,7 +43,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Comparator; -import java.util.ConcurrentModificationException; import java.util.Enumeration; import java.util.HashMap; import java.util.Hashtable; @@ -94,14 +93,14 @@ * that key reporting the updated value.) For aggregate operations * such as {@code putAll} and {@code clear}, concurrent retrievals may * reflect insertion or removal of only some entries. Similarly, - * Iterators and Enumerations return elements reflecting the state of - * the hash table at some point at or since the creation of the + * Iterators, Spliterators and Enumerations return elements reflecting the + * state of the hash table at some point at or since the creation of the * iterator/enumeration. They do <em>not</em> throw {@link - * ConcurrentModificationException}. However, iterators are designed - * to be used by only one thread at a time. Bear in mind that the - * results of aggregate status methods including {@code size}, {@code - * isEmpty}, and {@code containsValue} are typically useful only when - * a map is not undergoing concurrent updates in other threads. + * java.util.ConcurrentModificationException ConcurrentModificationException}. + * However, iterators are designed to be used by only one thread at a time. + * Bear in mind that the results of aggregate status methods including + * {@code size}, {@code isEmpty}, and {@code containsValue} are typically + * useful only when a map is not undergoing concurrent updates in other threads. * Otherwise the results of these methods reflect transient states * that may be adequate for monitoring or estimation purposes, but not * for program control. @@ -1200,11 +1199,11 @@ * operations. It does not support the {@code add} or * {@code addAll} operations. * - * <p>The view's {@code iterator} is a "weakly consistent" iterator - * that will never throw {@link ConcurrentModificationException}, - * and guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not guaranteed to) - * reflect any modifications subsequent to construction. + * <p>The view's iterators and spliterators are + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. + * + * <p>The view's {@code spliterator} reports {@link Spliterator#CONCURRENT}, + * {@link Spliterator#DISTINCT}, and {@link Spliterator#NONNULL}. * * @return the set view */ @@ -1223,11 +1222,11 @@ * {@code retainAll}, and {@code clear} operations. It does not * support the {@code add} or {@code addAll} operations. * - * <p>The view's {@code iterator} is a "weakly consistent" iterator - * that will never throw {@link ConcurrentModificationException}, - * and guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not guaranteed to) - * reflect any modifications subsequent to construction. + * <p>The view's iterators and spliterators are + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. + * + * <p>The view's {@code spliterator} reports {@link Spliterator#CONCURRENT} + * and {@link Spliterator#NONNULL}. * * @return the collection view */ @@ -1245,11 +1244,11 @@ * {@code removeAll}, {@code retainAll}, and {@code clear} * operations. * - * <p>The view's {@code iterator} is a "weakly consistent" iterator - * that will never throw {@link ConcurrentModificationException}, - * and guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not guaranteed to) - * reflect any modifications subsequent to construction. + * <p>The view's iterators and spliterators are + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. + * + * <p>The view's {@code spliterator} reports {@link Spliterator#CONCURRENT}, + * {@link Spliterator#DISTINCT}, and {@link Spliterator#NONNULL}. * * @return the set view */ @@ -2785,7 +2784,7 @@ return; } } - else if ((s | WAITER) == 0) { + else if ((s & WAITER) == 0) { if (U.compareAndSwapInt(this, LOCKSTATE, s, s | WAITER)) { waiting = true; waiter = Thread.currentThread(); @@ -4308,12 +4307,12 @@ // implementations below rely on concrete classes supplying these // abstract methods /** - * Returns a "weakly consistent" iterator that will never - * throw {@link ConcurrentModificationException}, and - * guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not - * guaranteed to) reflect any modifications subsequent to - * construction. + * Returns an iterator over the elements in this collection. + * + * <p>The returned iterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. + * + * @return an iterator over the elements in this collection */ public abstract Iterator<E> iterator(); public abstract boolean contains(Object o); @@ -4716,6 +4715,7 @@ * Base class for bulk tasks. Repeats some fields and code from * class Traverser, because we need to subclass CountedCompleter. */ + @SuppressWarnings("serial") abstract static class BulkTask<K,V,R> extends CountedCompleter<R> { Node<K,V>[] tab; // same as Traverser Node<K,V> next;
--- a/src/share/classes/java/util/concurrent/ConcurrentLinkedDeque.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/ConcurrentLinkedDeque.java Tue Aug 27 21:46:00 2013 -0700 @@ -55,12 +55,8 @@ * Like most other concurrent collection implementations, this class * does not permit the use of {@code null} elements. * - * <p>Iterators are <i>weakly consistent</i>, returning elements - * reflecting the state of the deque at some point at or since the - * creation of the iterator. They do <em>not</em> throw {@link - * java.util.ConcurrentModificationException - * ConcurrentModificationException}, and may proceed concurrently with - * other operations. + * <p>Iterators and spliterators are + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * <p>Beware that, unlike in most collections, the {@code size} method * is <em>NOT</em> a constant-time operation. Because of the @@ -1290,12 +1286,8 @@ * Returns an iterator over the elements in this deque in proper sequence. * The elements will be returned in order from first (head) to last (tail). * - * <p>The returned iterator is a "weakly consistent" iterator that - * will never throw {@link java.util.ConcurrentModificationException - * ConcurrentModificationException}, and guarantees to traverse - * elements as they existed upon construction of the iterator, and - * may (but is not guaranteed to) reflect any modifications - * subsequent to construction. + * <p>The returned iterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * @return an iterator over the elements in this deque in proper sequence */ @@ -1308,12 +1300,8 @@ * sequential order. The elements will be returned in order from * last (tail) to first (head). * - * <p>The returned iterator is a "weakly consistent" iterator that - * will never throw {@link java.util.ConcurrentModificationException - * ConcurrentModificationException}, and guarantees to traverse - * elements as they existed upon construction of the iterator, and - * may (but is not guaranteed to) reflect any modifications - * subsequent to construction. + * <p>The returned iterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * @return an iterator over the elements in this deque in reverse order */ @@ -1493,6 +1481,22 @@ } } + /** + * Returns a {@link Spliterator} over the elements in this deque. + * + * <p>The returned spliterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. + * + * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT}, + * {@link Spliterator#ORDERED}, and {@link Spliterator#NONNULL}. + * + * @implNote + * The {@code Spliterator} implements {@code trySplit} to permit limited + * parallelism. + * + * @return a {@code Spliterator} over the elements in this deque + * @since 1.8 + */ public Spliterator<E> spliterator() { return new CLDSpliterator<E>(this); } @@ -1500,6 +1504,8 @@ /** * Saves this deque to a stream (that is, serializes it). * + * @param s the stream + * @throws java.io.IOException if an I/O error occurs * @serialData All of the elements (each an {@code E}) in * the proper order, followed by a null */ @@ -1522,6 +1528,10 @@ /** * Reconstitutes this deque from a stream (that is, deserializes it). + * @param s the stream + * @throws ClassNotFoundException if the class of a serialized object + * could not be found + * @throws java.io.IOException if an I/O error occurs */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {
--- a/src/share/classes/java/util/concurrent/ConcurrentLinkedQueue.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/ConcurrentLinkedQueue.java Tue Aug 27 21:46:00 2013 -0700 @@ -654,12 +654,8 @@ * Returns an iterator over the elements in this queue in proper sequence. * The elements will be returned in order from first (head) to last (tail). * - * <p>The returned iterator is a "weakly consistent" iterator that - * will never throw {@link java.util.ConcurrentModificationException - * ConcurrentModificationException}, and guarantees to traverse - * elements as they existed upon construction of the iterator, and - * may (but is not guaranteed to) reflect any modifications - * subsequent to construction. + * <p>The returned iterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * @return an iterator over the elements in this queue in proper sequence */ @@ -749,6 +745,8 @@ /** * Saves this queue to a stream (that is, serializes it). * + * @param s the stream + * @throws java.io.IOException if an I/O error occurs * @serialData All of the elements (each an {@code E}) in * the proper order, followed by a null */ @@ -771,6 +769,10 @@ /** * Reconstitutes this queue from a stream (that is, deserializes it). + * @param s the stream + * @throws ClassNotFoundException if the class of a serialized object + * could not be found + * @throws java.io.IOException if an I/O error occurs */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { @@ -881,6 +883,23 @@ } } + /** + * Returns a {@link Spliterator} over the elements in this queue. + * + * <p>The returned spliterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. + * + * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT}, + * {@link Spliterator#ORDERED}, and {@link Spliterator#NONNULL}. + * + * @implNote + * The {@code Spliterator} implements {@code trySplit} to permit limited + * parallelism. + * + * @return a {@code Spliterator} over the elements in this queue + * @since 1.8 + */ + @Override public Spliterator<E> spliterator() { return new CLQSpliterator<E>(this); }
--- a/src/share/classes/java/util/concurrent/ConcurrentNavigableMap.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/ConcurrentNavigableMap.java Tue Aug 27 21:46:00 2013 -0700 @@ -120,11 +120,8 @@ * operations. It does not support the {@code add} or {@code addAll} * operations. * - * <p>The view's {@code iterator} is a "weakly consistent" iterator - * that will never throw {@link ConcurrentModificationException}, - * and guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not guaranteed to) - * reflect any modifications subsequent to construction. + * <p>The view's iterators and spliterators are + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * @return a navigable set view of the keys in this map */ @@ -141,11 +138,8 @@ * operations. It does not support the {@code add} or {@code addAll} * operations. * - * <p>The view's {@code iterator} is a "weakly consistent" iterator - * that will never throw {@link ConcurrentModificationException}, - * and guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not guaranteed to) - * reflect any modifications subsequent to construction. + * <p>The view's iterators and spliterators are + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * <p>This method is equivalent to method {@code navigableKeySet}. * @@ -164,11 +158,8 @@ * operations. It does not support the {@code add} or {@code addAll} * operations. * - * <p>The view's {@code iterator} is a "weakly consistent" iterator - * that will never throw {@link ConcurrentModificationException}, - * and guarantees to traverse elements as they existed upon - * construction of the iterator, and may (but is not guaranteed to) - * reflect any modifications subsequent to construction. + * <p>The view's iterators and spliterators are + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * @return a reverse order navigable set view of the keys in this map */
--- a/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/ConcurrentSkipListMap.java Tue Aug 27 21:46:00 2013 -0700 @@ -34,6 +34,7 @@ */ package java.util.concurrent; +import java.io.Serializable; import java.util.AbstractCollection; import java.util.AbstractMap; import java.util.AbstractSet; @@ -44,11 +45,15 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.NavigableMap; import java.util.NavigableSet; import java.util.NoSuchElementException; import java.util.Set; import java.util.SortedMap; +import java.util.SortedSet; import java.util.Spliterator; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ConcurrentNavigableMap; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.BiConsumer; @@ -66,12 +71,13 @@ * {@code containsKey}, {@code get}, {@code put} and * {@code remove} operations and their variants. Insertion, removal, * update, and access operations safely execute concurrently by - * multiple threads. Iterators are <i>weakly consistent</i>, returning - * elements reflecting the state of the map at some point at or since - * the creation of the iterator. They do <em>not</em> throw {@link - * java.util.ConcurrentModificationException ConcurrentModificationException}, - * and may proceed concurrently with other operations. Ascending key ordered - * views and their iterators are faster than descending ones. + * multiple threads. + * + * <p>Iterators and spliterators are + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. + * + * <p>Ascending key ordered views and their iterators are faster than + * descending ones. * * <p>All {@code Map.Entry} pairs returned by methods in this class * and its views represent snapshots of mappings at the time they were @@ -108,9 +114,7 @@ * @since 1.6 */ public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V> - implements ConcurrentNavigableMap<K,V>, - Cloneable, - java.io.Serializable { + implements ConcurrentNavigableMap<K,V>, Cloneable, Serializable { /* * This class implements a tree-like two-dimensionally linked skip * list in which the index levels are represented in separate @@ -1412,6 +1416,8 @@ /** * Saves this map to a stream (that is, serializes it). * + * @param s the stream + * @throws java.io.IOException if an I/O error occurs * @serialData The key (Object) and value (Object) for each * key-value mapping represented by the map, followed by * {@code null}. The key-value mappings are emitted in key-order @@ -1436,6 +1442,10 @@ /** * Reconstitutes this map from a stream (that is, deserializes it). + * @param s the stream + * @throws ClassNotFoundException if the class of a serialized object + * could not be found + * @throws java.io.IOException if an I/O error occurs */ @SuppressWarnings("unchecked") private void readObject(final java.io.ObjectInputStream s) @@ -1795,8 +1805,18 @@ /** * Returns a {@link NavigableSet} view of the keys contained in this map. - * The set's iterator returns the keys in ascending order. - * The set is backed by the map, so changes to the map are + * + * <p>The set's iterator returns the keys in ascending order. + * The set's spliterator additionally reports {@link Spliterator#CONCURRENT}, + * {@link Spliterator#NONNULL}, {@link Spliterator#SORTED} and + * {@link Spliterator#ORDERED}, with an encounter order that is ascending + * key order. The spliterator's comparator (see + * {@link java.util.Spliterator#getComparator()}) is {@code null} if + * the map's comparator (see {@link #comparator()}) is {@code null}. + * Otherwise, the spliterator's comparator is the same as or imposes the + * same total ordering as the map's comparator. + * + * <p>The set is backed by the map, so changes to the map are * reflected in the set, and vice-versa. The set supports element * removal, which removes the corresponding mapping from the map, * via the {@code Iterator.remove}, {@code Set.remove}, @@ -1804,11 +1824,8 @@ * operations. It does not support the {@code add} or {@code addAll} * operations. * - * <p>The view's {@code iterator} is a "weakly consistent" iterator that - * will never throw {@link java.util.ConcurrentModificationException - * ConcurrentModificationException}, and guarantees to traverse elements - * as they existed upon construction of the iterator, and may (but is not - * guaranteed to) reflect any modifications subsequent to construction. + * <p>The view's iterators and spliterators are + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * <p>This method is equivalent to method {@code navigableKeySet}. * @@ -1826,9 +1843,13 @@ /** * Returns a {@link Collection} view of the values contained in this map. - * The collection's iterator returns the values in ascending order - * of the corresponding keys. - * The collection is backed by the map, so changes to the map are + * <p>The collection's iterator returns the values in ascending order + * of the corresponding keys. The collections's spliterator additionally + * reports {@link Spliterator#CONCURRENT}, {@link Spliterator#NONNULL} and + * {@link Spliterator#ORDERED}, with an encounter order that is ascending + * order of the corresponding keys. + * + * <p>The collection is backed by the map, so changes to the map are * reflected in the collection, and vice-versa. The collection * supports element removal, which removes the corresponding * mapping from the map, via the {@code Iterator.remove}, @@ -1836,11 +1857,8 @@ * {@code retainAll} and {@code clear} operations. It does not * support the {@code add} or {@code addAll} operations. * - * <p>The view's {@code iterator} is a "weakly consistent" iterator that - * will never throw {@link java.util.ConcurrentModificationException - * ConcurrentModificationException}, and guarantees to traverse elements - * as they existed upon construction of the iterator, and may (but is not - * guaranteed to) reflect any modifications subsequent to construction. + * <p>The view's iterators and spliterators are + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. */ public Collection<V> values() { Values<V> vs = values; @@ -1849,8 +1867,14 @@ /** * Returns a {@link Set} view of the mappings contained in this map. - * The set's iterator returns the entries in ascending key order. - * The set is backed by the map, so changes to the map are + * + * <p>The set's iterator returns the entries in ascending key order. The + * set's spliterator additionally reports {@link Spliterator#CONCURRENT}, + * {@link Spliterator#NONNULL}, {@link Spliterator#SORTED} and + * {@link Spliterator#ORDERED}, with an encounter order that is ascending + * key order. + * + * <p>The set is backed by the map, so changes to the map are * reflected in the set, and vice-versa. The set supports element * removal, which removes the corresponding mapping from the map, * via the {@code Iterator.remove}, {@code Set.remove}, @@ -1858,15 +1882,12 @@ * operations. It does not support the {@code add} or * {@code addAll} operations. * - * <p>The view's {@code iterator} is a "weakly consistent" iterator that - * will never throw {@link java.util.ConcurrentModificationException - * ConcurrentModificationException}, and guarantees to traverse elements - * as they existed upon construction of the iterator, and may (but is not - * guaranteed to) reflect any modifications subsequent to construction. + * <p>The view's iterators and spliterators are + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * - * <p>The {@code Map.Entry} elements returned by - * {@code iterator.next()} do <em>not</em> support the - * {@code setValue} operation. + * <p>The {@code Map.Entry} elements traversed by the {@code iterator} + * or {@code spliterator} do <em>not</em> support the {@code setValue} + * operation. * * @return a set view of the mappings contained in this map, * sorted in ascending key order @@ -2548,8 +2569,7 @@ * @serial include */ static final class SubMap<K,V> extends AbstractMap<K,V> - implements ConcurrentNavigableMap<K,V>, Cloneable, - java.io.Serializable { + implements ConcurrentNavigableMap<K,V>, Cloneable, Serializable { private static final long serialVersionUID = -7647078645895051609L; /** Underlying map */ @@ -3180,6 +3200,7 @@ public long estimateSize() { return Long.MAX_VALUE; } + } final class SubMapValueIterator extends SubMapIter<V> { @@ -3434,7 +3455,8 @@ } public int characteristics() { - return Spliterator.CONCURRENT | Spliterator.NONNULL; + return Spliterator.CONCURRENT | Spliterator.ORDERED | + Spliterator.NONNULL; } } @@ -3528,8 +3550,17 @@ } public final Comparator<Map.Entry<K,V>> getComparator() { - return comparator == null ? null : - Map.Entry.comparingByKey(comparator); + // Adapt or create a key-based comparator + if (comparator != null) { + return Map.Entry.comparingByKey(comparator); + } + else { + return (Comparator<Map.Entry<K,V>> & Serializable) (e1, e2) -> { + @SuppressWarnings("unchecked") + Comparable<? super K> k1 = (Comparable<? super K>) e1.getKey(); + return k1.compareTo(e2.getKey()); + }; + } } }
--- a/src/share/classes/java/util/concurrent/ConcurrentSkipListSet.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/ConcurrentSkipListSet.java Tue Aug 27 21:46:00 2013 -0700 @@ -57,12 +57,12 @@ * cost for the {@code contains}, {@code add}, and {@code remove} * operations and their variants. Insertion, removal, and access * operations safely execute concurrently by multiple threads. - * Iterators are <i>weakly consistent</i>, returning elements - * reflecting the state of the set at some point at or since the - * creation of the iterator. They do <em>not</em> throw {@link - * java.util.ConcurrentModificationException}, and may proceed - * concurrently with other operations. Ascending ordered views and - * their iterators are faster than descending ones. + * + * <p>Iterators and spliterators are + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. + * + * <p>Ascending ordered views and their iterators are faster than + * descending ones. * * <p>Beware that, unlike in most collections, the {@code size} * method is <em>not</em> a constant-time operation. Because of the @@ -480,6 +480,24 @@ return new ConcurrentSkipListSet<E>(m.descendingMap()); } + /** + * Returns a {@link Spliterator} over the elements in this set. + * + * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT}, + * {@link Spliterator#NONNULL}, {@link Spliterator#DISTINCT}, + * {@link Spliterator#SORTED} and {@link Spliterator#ORDERED}, with an + * encounter order that is ascending order. Overriding implementations + * should document the reporting of additional characteristic values. + * + * <p>The spliterator's comparator (see + * {@link java.util.Spliterator#getComparator()}) is {@code null} if + * the set's comparator (see {@link #comparator()}) is {@code null}. + * Otherwise, the spliterator's comparator is the same as or imposes the + * same total ordering as the set's comparator. + * + * @return a {@code Spliterator} over the elements in this set + * @since 1.8 + */ @SuppressWarnings("unchecked") public Spliterator<E> spliterator() { if (m instanceof ConcurrentSkipListMap)
--- a/src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/CopyOnWriteArrayList.java Tue Aug 27 21:46:00 2013 -0700 @@ -952,6 +952,8 @@ /** * Saves this list to a stream (that is, serializes it). * + * @param s the stream + * @throws java.io.IOException if an I/O error occurs * @serialData The length of the array backing the list is emitted * (int), followed by all of its elements (each an Object) * in the proper order. @@ -972,6 +974,10 @@ /** * Reconstitutes this list from a stream (that is, deserializes it). + * @param s the stream + * @throws ClassNotFoundException if the class of a serialized object + * could not be found + * @throws java.io.IOException if an I/O error occurs */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { @@ -1092,15 +1098,29 @@ * * @throws IndexOutOfBoundsException {@inheritDoc} */ - public ListIterator<E> listIterator(final int index) { + public ListIterator<E> listIterator(int index) { Object[] elements = getArray(); int len = elements.length; - if (index<0 || index>len) + if (index < 0 || index > len) throw new IndexOutOfBoundsException("Index: "+index); return new COWIterator<E>(elements, index); } + /** + * Returns a {@link Spliterator} over the elements in this list. + * + * <p>The {@code Spliterator} reports {@link Spliterator#IMMUTABLE}, + * {@link Spliterator#ORDERED}, {@link Spliterator#SIZED}, and + * {@link Spliterator#SUBSIZED}. + * + * <p>The spliterator provides a snapshot of the state of the list + * when the spliterator was constructed. No synchronization is needed while + * operating on the spliterator. + * + * @return a {@code Spliterator} over the elements in this list + * @since 1.8 + */ public Spliterator<E> spliterator() { return Spliterators.spliterator (getArray(), Spliterator.IMMUTABLE | Spliterator.ORDERED); @@ -1257,7 +1277,7 @@ // only call this holding l's lock private void rangeCheck(int index) { - if (index<0 || index>=size) + if (index < 0 || index >= size) throw new IndexOutOfBoundsException("Index: "+index+ ",Size: "+size); } @@ -1304,7 +1324,7 @@ lock.lock(); try { checkForComodification(); - if (index<0 || index>size) + if (index < 0 || index > size) throw new IndexOutOfBoundsException(); l.add(index+offset, element); expectedArray = l.getArray(); @@ -1361,12 +1381,12 @@ } } - public ListIterator<E> listIterator(final int index) { + public ListIterator<E> listIterator(int index) { final ReentrantLock lock = l.lock; lock.lock(); try { checkForComodification(); - if (index<0 || index>size) + if (index < 0 || index > size) throw new IndexOutOfBoundsException("Index: "+index+ ", Size: "+size); return new COWSubListIterator<E>(l, index, offset, size); @@ -1380,7 +1400,7 @@ lock.lock(); try { checkForComodification(); - if (fromIndex<0 || toIndex>size) + if (fromIndex < 0 || toIndex > size) throw new IndexOutOfBoundsException(); return new COWSubList<E>(l, fromIndex + offset, toIndex + offset); @@ -1580,6 +1600,7 @@ return Spliterators.spliterator (a, lo, hi, Spliterator.IMMUTABLE | Spliterator.ORDERED); } + } private static class COWSubListIterator<E> implements ListIterator<E> {
--- a/src/share/classes/java/util/concurrent/CopyOnWriteArraySet.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/CopyOnWriteArraySet.java Tue Aug 27 21:46:00 2013 -0700 @@ -404,6 +404,21 @@ al.forEach(action); } + /** + * Returns a {@link Spliterator} over the elements in this set in the order + * in which these elements were added. + * + * <p>The {@code Spliterator} reports {@link Spliterator#IMMUTABLE}, + * {@link Spliterator#DISTINCT}, {@link Spliterator#SIZED}, and + * {@link Spliterator#SUBSIZED}. + * + * <p>The spliterator provides a snapshot of the state of the set + * when the spliterator was constructed. No synchronization is needed while + * operating on the spliterator. + * + * @return a {@code Spliterator} over the elements in this set + * @since 1.8 + */ public Spliterator<E> spliterator() { return Spliterators.spliterator (al.getArray(), Spliterator.IMMUTABLE | Spliterator.DISTINCT);
--- a/src/share/classes/java/util/concurrent/DelayQueue.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/DelayQueue.java Tue Aug 27 21:46:00 2013 -0700 @@ -512,12 +512,8 @@ * unexpired) in this queue. The iterator does not return the * elements in any particular order. * - * <p>The returned iterator is a "weakly consistent" iterator that - * will never throw {@link java.util.ConcurrentModificationException - * ConcurrentModificationException}, and guarantees to traverse - * elements as they existed upon construction of the iterator, and - * may (but is not guaranteed to) reflect any modifications - * subsequent to construction. + * <p>The returned iterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * @return an iterator over the elements in this queue */
--- a/src/share/classes/java/util/concurrent/ForkJoinPool.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/ForkJoinPool.java Tue Aug 27 21:46:00 2013 -0700 @@ -144,7 +144,8 @@ * Upon any error in establishing these settings, default parameters * are used. It is possible to disable or limit the use of threads in * the common pool by setting the parallelism property to zero, and/or - * using a factory that may return {@code null}. + * using a factory that may return {@code null}. However doing so may + * cause unjoined tasks to never be executed. * * <p><b>Implementation notes</b>: This implementation restricts the * maximum number of running threads to 32767. Attempts to create @@ -3303,8 +3304,8 @@ } if (parallelism < 0 && // default 1 less than #cores - (parallelism = Runtime.getRuntime().availableProcessors() - 1) < 0) - parallelism = 0; + (parallelism = Runtime.getRuntime().availableProcessors() - 1) <= 0) + parallelism = 1; if (parallelism > MAX_CAP) parallelism = MAX_CAP; return new ForkJoinPool(parallelism, factory, handler, LIFO_QUEUE,
--- a/src/share/classes/java/util/concurrent/LinkedBlockingDeque.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/LinkedBlockingDeque.java Tue Aug 27 21:46:00 2013 -0700 @@ -1008,12 +1008,8 @@ * Returns an iterator over the elements in this deque in proper sequence. * The elements will be returned in order from first (head) to last (tail). * - * <p>The returned iterator is a "weakly consistent" iterator that - * will never throw {@link java.util.ConcurrentModificationException - * ConcurrentModificationException}, and guarantees to traverse - * elements as they existed upon construction of the iterator, and - * may (but is not guaranteed to) reflect any modifications - * subsequent to construction. + * <p>The returned iterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * @return an iterator over the elements in this deque in proper sequence */ @@ -1026,12 +1022,8 @@ * sequential order. The elements will be returned in order from * last (tail) to first (head). * - * <p>The returned iterator is a "weakly consistent" iterator that - * will never throw {@link java.util.ConcurrentModificationException - * ConcurrentModificationException}, and guarantees to traverse - * elements as they existed upon construction of the iterator, and - * may (but is not guaranteed to) reflect any modifications - * subsequent to construction. + * <p>The returned iterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * @return an iterator over the elements in this deque in reverse order */ @@ -1270,6 +1262,22 @@ } } + /** + * Returns a {@link Spliterator} over the elements in this deque. + * + * <p>The returned spliterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. + * + * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT}, + * {@link Spliterator#ORDERED}, and {@link Spliterator#NONNULL}. + * + * @implNote + * The {@code Spliterator} implements {@code trySplit} to permit limited + * parallelism. + * + * @return a {@code Spliterator} over the elements in this deque + * @since 1.8 + */ public Spliterator<E> spliterator() { return new LBDSpliterator<E>(this); } @@ -1277,6 +1285,8 @@ /** * Saves this deque to a stream (that is, serializes it). * + * @param s the stream + * @throws java.io.IOException if an I/O error occurs * @serialData The capacity (int), followed by elements (each an * {@code Object}) in the proper order, followed by a null */ @@ -1299,6 +1309,10 @@ /** * Reconstitutes this deque from a stream (that is, deserializes it). + * @param s the stream + * @throws ClassNotFoundException if the class of a serialized object + * could not be found + * @throws java.io.IOException if an I/O error occurs */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {
--- a/src/share/classes/java/util/concurrent/LinkedBlockingQueue.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/LinkedBlockingQueue.java Tue Aug 27 21:46:00 2013 -0700 @@ -766,12 +766,8 @@ * Returns an iterator over the elements in this queue in proper sequence. * The elements will be returned in order from first (head) to last (tail). * - * <p>The returned iterator is a "weakly consistent" iterator that - * will never throw {@link java.util.ConcurrentModificationException - * ConcurrentModificationException}, and guarantees to traverse - * elements as they existed upon construction of the iterator, and - * may (but is not guaranteed to) reflect any modifications - * subsequent to construction. + * <p>The returned iterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * @return an iterator over the elements in this queue in proper sequence */ @@ -973,6 +969,22 @@ } } + /** + * Returns a {@link Spliterator} over the elements in this queue. + * + * <p>The returned spliterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. + * + * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT}, + * {@link Spliterator#ORDERED}, and {@link Spliterator#NONNULL}. + * + * @implNote + * The {@code Spliterator} implements {@code trySplit} to permit limited + * parallelism. + * + * @return a {@code Spliterator} over the elements in this queue + * @since 1.8 + */ public Spliterator<E> spliterator() { return new LBQSpliterator<E>(this); } @@ -980,6 +992,8 @@ /** * Saves this queue to a stream (that is, serializes it). * + * @param s the stream + * @throws java.io.IOException if an I/O error occurs * @serialData The capacity is emitted (int), followed by all of * its elements (each an {@code Object}) in the proper order, * followed by a null @@ -1005,6 +1019,10 @@ /** * Reconstitutes this queue from a stream (that is, deserializes it). + * @param s the stream + * @throws ClassNotFoundException if the class of a serialized object + * could not be found + * @throws java.io.IOException if an I/O error occurs */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {
--- a/src/share/classes/java/util/concurrent/LinkedTransferQueue.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/LinkedTransferQueue.java Tue Aug 27 21:46:00 2013 -0700 @@ -40,6 +40,7 @@ import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Queue; +import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.LockSupport; import java.util.Spliterator; import java.util.Spliterators; @@ -1018,6 +1019,22 @@ } } + /** + * Returns a {@link Spliterator} over the elements in this queue. + * + * <p>The returned spliterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. + * + * <p>The {@code Spliterator} reports {@link Spliterator#CONCURRENT}, + * {@link Spliterator#ORDERED}, and {@link Spliterator#NONNULL}. + * + * @implNote + * The {@code Spliterator} implements {@code trySplit} to permit limited + * parallelism. + * + * @return a {@code Spliterator} over the elements in this queue + * @since 1.8 + */ public Spliterator<E> spliterator() { return new LTQSpliterator<E>(this); } @@ -1301,12 +1318,8 @@ * Returns an iterator over the elements in this queue in proper sequence. * The elements will be returned in order from first (head) to last (tail). * - * <p>The returned iterator is a "weakly consistent" iterator that - * will never throw {@link java.util.ConcurrentModificationException - * ConcurrentModificationException}, and guarantees to traverse - * elements as they existed upon construction of the iterator, and - * may (but is not guaranteed to) reflect any modifications - * subsequent to construction. + * <p>The returned iterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * @return an iterator over the elements in this queue in proper sequence */ @@ -1407,6 +1420,8 @@ /** * Saves this queue to a stream (that is, serializes it). * + * @param s the stream + * @throws java.io.IOException if an I/O error occurs * @serialData All of the elements (each an {@code E}) in * the proper order, followed by a null */ @@ -1421,6 +1436,10 @@ /** * Reconstitutes this queue from a stream (that is, deserializes it). + * @param s the stream + * @throws ClassNotFoundException if the class of a serialized object + * could not be found + * @throws java.io.IOException if an I/O error occurs */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {
--- a/src/share/classes/java/util/concurrent/PriorityBlockingQueue.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/PriorityBlockingQueue.java Tue Aug 27 21:46:00 2013 -0700 @@ -229,7 +229,7 @@ /** * Creates a {@code PriorityBlockingQueue} containing the elements * in the specified collection. If the specified collection is a - * {@link SortedSet} or a {@link PriorityQueue}, this + * {@link SortedSet} or a {@link PriorityQueue}, this * priority queue will be ordered according to the same ordering. * Otherwise, this priority queue will be ordered according to the * {@linkplain Comparable natural ordering} of its elements. @@ -864,12 +864,8 @@ * Returns an iterator over the elements in this queue. The * iterator does not return the elements in any particular order. * - * <p>The returned iterator is a "weakly consistent" iterator that - * will never throw {@link java.util.ConcurrentModificationException - * ConcurrentModificationException}, and guarantees to traverse - * elements as they existed upon construction of the iterator, and - * may (but is not guaranteed to) reflect any modifications - * subsequent to construction. + * <p>The returned iterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. * * @return an iterator over the elements in this queue */ @@ -915,6 +911,9 @@ * For compatibility with previous version of this class, elements * are first copied to a java.util.PriorityQueue, which is then * serialized. + * + * @param s the stream + * @throws java.io.IOException if an I/O error occurs */ private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { @@ -932,6 +931,10 @@ /** * Reconstitutes this queue from a stream (that is, deserializes it). + * @param s the stream + * @throws ClassNotFoundException if the class of a serialized object + * could not be found + * @throws java.io.IOException if an I/O error occurs */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { @@ -1005,6 +1008,21 @@ } } + /** + * Returns a {@link Spliterator} over the elements in this queue. + * + * <p>The returned spliterator is + * <a href="package-summary.html#Weakly"><i>weakly consistent</i></a>. + * + * <p>The {@code Spliterator} reports {@link Spliterator#SIZED} and + * {@link Spliterator#NONNULL}. + * + * @implNote + * The {@code Spliterator} additionally reports {@link Spliterator#SUBSIZED}. + * + * @return a {@code Spliterator} over the elements in this queue + * @since 1.8 + */ public Spliterator<E> spliterator() { return new PBQSpliterator<E>(this, null, 0, -1); }
--- a/src/share/classes/java/util/concurrent/SynchronousQueue.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/SynchronousQueue.java Tue Aug 27 21:46:00 2013 -0700 @@ -38,6 +38,8 @@ import java.util.concurrent.locks.LockSupport; import java.util.concurrent.locks.ReentrantLock; import java.util.*; +import java.util.Spliterator; +import java.util.Spliterators; /** * A {@linkplain BlockingQueue blocking queue} in which each insert @@ -1062,21 +1064,17 @@ * * @return an empty iterator */ - @SuppressWarnings("unchecked") public Iterator<E> iterator() { - return (Iterator<E>) EmptyIterator.EMPTY_ITERATOR; + return Collections.emptyIterator(); } - // Replicated from a previous version of Collections - private static class EmptyIterator<E> implements Iterator<E> { - static final EmptyIterator<Object> EMPTY_ITERATOR - = new EmptyIterator<Object>(); - - public boolean hasNext() { return false; } - public E next() { throw new NoSuchElementException(); } - public void remove() { throw new IllegalStateException(); } - } - + /** + * Returns an empty spliterator in which calls to + * {@link java.util.Spliterator#trySplit()} always return {@code null}. + * + * @return an empty spliterator + * @since 1.8 + */ public Spliterator<E> spliterator() { return Spliterators.emptySpliterator(); } @@ -1163,6 +1161,8 @@ /** * Saves this queue to a stream (that is, serializes it). + * @param s the stream + * @throws java.io.IOException if an I/O error occurs */ private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { @@ -1182,8 +1182,12 @@ /** * Reconstitutes this queue from a stream (that is, deserializes it). + * @param s the stream + * @throws ClassNotFoundException if the class of a serialized object + * could not be found + * @throws java.io.IOException if an I/O error occurs */ - private void readObject(final java.io.ObjectInputStream s) + private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { s.defaultReadObject(); if (waitingProducers instanceof FifoWaitQueue)
--- a/src/share/classes/java/util/concurrent/atomic/Striped64.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/atomic/Striped64.java Tue Aug 27 21:46:00 2013 -0700 @@ -43,6 +43,7 @@ * for classes supporting dynamic striping on 64bit values. The class * extends Number so that concrete subclasses must publicly do so. */ +@SuppressWarnings("serial") abstract class Striped64 extends Number { /* * This class maintains a lazily-initialized table of atomically
--- a/src/share/classes/java/util/concurrent/package-info.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/concurrent/package-info.java Tue Aug 27 21:46:00 2013 -0700 @@ -210,13 +210,19 @@ * collections are unshared, or are accessible only when * holding other locks. * - * <p>Most concurrent Collection implementations (including most - * Queues) also differ from the usual java.util conventions in that - * their Iterators provide <em>weakly consistent</em> rather than - * fast-fail traversal. A weakly consistent iterator is thread-safe, - * but does not necessarily freeze the collection while iterating, so - * it may (or may not) reflect any updates since the iterator was - * created. + * <p id="Weakly">Most concurrent Collection implementations + * (including most Queues) also differ from the usual {@code java.util} + * conventions in that their {@linkplain java.util.Iterator Iterators} + * and {@linkplain java.util.Spliterator Spliterators} provide + * <em>weakly consistent</em> rather than fast-fail traversal: + * <ul> + * <li>they may proceed concurrently with other operations + * <li>they will never throw {@link java.util.ConcurrentModificationException + * ConcurrentModificationException} + * <li>they are guaranteed to traverse elements as they existed upon + * construction exactly once, and may (but are not guaranteed to) + * reflect any modifications subsequent to construction. + * </ul> * * <h2 id="MemoryVisibility">Memory Consistency Properties</h2> *
--- a/src/share/classes/java/util/jar/Attributes.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/jar/Attributes.java Tue Aug 27 21:46:00 2013 -0700 @@ -565,15 +565,6 @@ public static final Name MAIN_CLASS = new Name("Main-Class"); /** - * {@code Name} object for {@code Profile} manifest attribute used by - * applications or libraries packaged as JAR files to indicate the - * minimum profile required to execute the application. - * @since 1.8 - * @see UnsupportedProfileException - */ - public static final Name PROFILE = new Name("Profile"); - - /** * <code>Name</code> object for <code>Sealed</code> manifest attribute * used for sealing. * @see <a href="../../../../technotes/guides/extensions/spec.html#sealing">
--- a/src/share/classes/java/util/jar/JarFile.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/jar/JarFile.java Tue Aug 27 21:46:00 2013 -0700 @@ -69,8 +69,6 @@ // indicates if Class-Path attribute present (only valid if hasCheckedSpecialAttributes true) private boolean hasClassPathAttribute; - // indicates if Profile attribute present (only valid if hasCheckedSpecialAttributes true) - private boolean hasProfileAttribute; // true if manifest checked for special attributes private volatile boolean hasCheckedSpecialAttributes; @@ -459,15 +457,10 @@ // Statics for hand-coded Boyer-Moore search private static final char[] CLASSPATH_CHARS = {'c','l','a','s','s','-','p','a','t','h'}; - private static final char[] PROFILE_CHARS = { 'p', 'r', 'o', 'f', 'i', 'l', 'e' }; // The bad character shift for "class-path" private static final int[] CLASSPATH_LASTOCC; // The good suffix shift for "class-path" private static final int[] CLASSPATH_OPTOSFT; - // The bad character shift for "profile" - private static final int[] PROFILE_LASTOCC; - // The good suffix shift for "profile" - private static final int[] PROFILE_OPTOSFT; static { CLASSPATH_LASTOCC = new int[128]; @@ -483,19 +476,6 @@ for (int i=0; i<9; i++) CLASSPATH_OPTOSFT[i] = 10; CLASSPATH_OPTOSFT[9]=1; - - PROFILE_LASTOCC = new int[128]; - PROFILE_OPTOSFT = new int[7]; - PROFILE_LASTOCC[(int)'p'] = 1; - PROFILE_LASTOCC[(int)'r'] = 2; - PROFILE_LASTOCC[(int)'o'] = 3; - PROFILE_LASTOCC[(int)'f'] = 4; - PROFILE_LASTOCC[(int)'i'] = 5; - PROFILE_LASTOCC[(int)'l'] = 6; - PROFILE_LASTOCC[(int)'e'] = 7; - for (int i=0; i<6; i++) - PROFILE_OPTOSFT[i] = 7; - PROFILE_OPTOSFT[6] = 1; } private JarEntry getManEntry() { @@ -530,15 +510,6 @@ } /** - * Returns {@code true} iff this JAR file has a manifest with the - * Profile attribute - */ - boolean hasProfileAttribute() throws IOException { - checkForSpecialAttributes(); - return hasProfileAttribute; - } - - /** * Returns true if the pattern {@code src} is found in {@code b}. * The {@code lastOcc} and {@code optoSft} arrays are the precomputed * bad character and good suffix shifts. @@ -564,7 +535,7 @@ /** * On first invocation, check if the JAR file has the Class-Path - * and/or Profile attributes. A no-op on subsequent calls. + * attribute. A no-op on subsequent calls. */ private void checkForSpecialAttributes() throws IOException { if (hasCheckedSpecialAttributes) return; @@ -574,8 +545,6 @@ byte[] b = getBytes(manEntry); if (match(CLASSPATH_CHARS, b, CLASSPATH_LASTOCC, CLASSPATH_OPTOSFT)) hasClassPathAttribute = true; - if (match(PROFILE_CHARS, b, PROFILE_LASTOCC, PROFILE_OPTOSFT)) - hasProfileAttribute = true; } } hasCheckedSpecialAttributes = true;
--- a/src/share/classes/java/util/jar/JarVerifier.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/jar/JarVerifier.java Tue Aug 27 21:46:00 2013 -0700 @@ -139,13 +139,21 @@ return; } + if (uname.equals(JarFile.MANIFEST_NAME)) { + return; + } + if (SignatureFileVerifier.isBlockOrSF(uname)) { /* We parse only DSA, RSA or EC PKCS7 blocks. */ parsingBlockOrSF = true; baos.reset(); mev.setEntry(null, je); + return; } - return; + + // If a META-INF entry is not MF or block or SF, they should + // be normal entries. According to 2 above, no more block or + // SF will appear. Let's doneWithMeta. } }
--- a/src/share/classes/java/util/jar/JavaUtilJarAccessImpl.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/jar/JavaUtilJarAccessImpl.java Tue Aug 27 21:46:00 2013 -0700 @@ -37,10 +37,6 @@ return jar.hasClassPathAttribute(); } - public boolean jarFileHasProfileAttribute(JarFile jar) throws IOException { - return jar.hasProfileAttribute(); - } - public CodeSource[] getCodeSources(JarFile jar, URL url) { return jar.getCodeSources(url); }
--- a/src/share/classes/java/util/jar/UnsupportedProfileException.java Tue Aug 27 13:37:38 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package java.util.jar; - -/** - * Thrown to indicate an attempt to access a JAR file with a {@link - * Attributes.Name#PROFILE Profile} attribute that names a profile that - * is not supported by this runtime. - * - * @since 1.8 - */ -public class UnsupportedProfileException extends RuntimeException { - private static final long serialVersionUID = -1834773870678792406L; - - /** - * Constructs an {@code UnsupportedProfileException} with no detail - * message. - */ - public UnsupportedProfileException() { - } - - /** - * Constructs an {@code UnsupportedProfileException} with the - * specified detail message. - * - * @param message the detail message - */ - public UnsupportedProfileException(String message) { - super(message); - } -}
--- a/src/share/classes/java/util/stream/Collectors.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/stream/Collectors.java Tue Aug 27 21:46:00 2013 -0700 @@ -354,6 +354,43 @@ } /** + * Adapts a {@code Collector} to perform an additional finishing + * transformation. For example, one could adapt the {@link #toList()} + * collector to always produce an immutable list with: + * <pre>{@code + * List<String> people + * = people.stream().collect(collectingAndThen(toList(), Collections::unmodifiableList)); + * }</pre> + * + * @param <T> the type of the input elements + * @param <A> intermediate accumulation type of the downstream collector + * @param <R> result type of the downstream collector + * @param <RR> result type of the resulting collector + * @param downstream a collector + * @param finisher a function to be applied to the final result of the downstream collector + * @return a collector which performs the action of the downstream collector, + * followed by an additional finishing step + */ + public static<T,A,R,RR> Collector<T,A,RR> collectingAndThen(Collector<T,A,R> downstream, + Function<R,RR> finisher) { + Set<Collector.Characteristics> characteristics = downstream.characteristics(); + if (characteristics.contains(Collector.Characteristics.IDENTITY_FINISH)) { + if (characteristics.size() == 1) + characteristics = Collectors.CH_NOID; + else { + characteristics = EnumSet.copyOf(characteristics); + characteristics.remove(Collector.Characteristics.IDENTITY_FINISH); + characteristics = Collections.unmodifiableSet(characteristics); + } + } + return new CollectorImpl<>(downstream.supplier(), + downstream.accumulator(), + downstream.combiner(), + downstream.finisher().andThen(finisher), + characteristics); + } + + /** * Returns a {@code Collector} accepting elements of type {@code T} that * counts the number of input elements. If no elements are present, the * result is 0.
--- a/src/share/classes/java/util/zip/Adler32.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/zip/Adler32.java Tue Aug 27 21:46:00 2013 -0700 @@ -62,6 +62,11 @@ /** * Updates the checksum with the specified array of bytes. + * + * @throws ArrayIndexOutOfBoundsException + * if {@code off} is negative, or {@code len} is negative, + * or {@code off+len} is greater than the length of the + * array {@code b} */ public void update(byte[] b, int off, int len) { if (b == null) {
--- a/src/share/classes/java/util/zip/CRC32.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/zip/CRC32.java Tue Aug 27 21:46:00 2013 -0700 @@ -60,6 +60,11 @@ /** * Updates the CRC-32 checksum with the specified array of bytes. + * + * @throws ArrayIndexOutOfBoundsException + * if {@code off} is negative, or {@code len} is negative, + * or {@code off+len} is greater than the length of the + * array {@code b} */ public void update(byte[] b, int off, int len) { if (b == null) {
--- a/src/share/classes/java/util/zip/ZipConstants.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/zip/ZipConstants.java Tue Aug 27 21:46:00 2013 -0700 @@ -71,10 +71,17 @@ /* * Extra field header ID */ - static final int EXTID_ZIP64 = 0x0001; // Zip64 - static final int EXTID_NTFS = 0x000a; // NTFS - static final int EXTID_UNIX = 0x000d; // UNIX - static final int EXTID_EXTT = 0x5455; // Info-ZIP Extended Timestamp + static final int EXTID_ZIP64 = 0x0001; // Zip64 + static final int EXTID_NTFS = 0x000a; // NTFS + static final int EXTID_UNIX = 0x000d; // UNIX + static final int EXTID_EXTT = 0x5455; // Info-ZIP Extended Timestamp + + /* + * EXTT timestamp flags + */ + static final int EXTT_FLAG_LMT = 0x1; // LastModifiedTime + static final int EXTT_FLAG_LAT = 0x2; // LastAccessTime + static final int EXTT_FLAT_CT = 0x4; // CreationTime /* * Central directory (CEN) header field offsets
--- a/src/share/classes/java/util/zip/ZipEntry.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/zip/ZipEntry.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. 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 @@ -25,6 +25,11 @@ package java.util.zip; +import static java.util.zip.ZipUtils.*; +import java.nio.file.attribute.FileTime; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + /** * This class is used to represent a ZIP file entry. * @@ -32,8 +37,12 @@ */ public class ZipEntry implements ZipConstants, Cloneable { + String name; // entry name - long mtime = -1; // last modification time + long time = -1; // last modification time + FileTime mtime; // last modification time, from extra field data + FileTime atime; // last access time, from extra field data + FileTime ctime; // creation time, from extra field data long crc = -1; // crc-32 of entry data long size = -1; // uncompressed size of entry data long csize = -1; // compressed size of entry data @@ -55,15 +64,15 @@ /** * Creates a new zip entry with the specified name. * - * @param name the entry name - * @exception NullPointerException if the entry name is null - * @exception IllegalArgumentException if the entry name is longer than - * 0xFFFF bytes + * @param name + * The entry name + * + * @throws NullPointerException if the entry name is null + * @throws IllegalArgumentException if the entry name is longer than + * 0xFFFF bytes */ public ZipEntry(String name) { - if (name == null) { - throw new NullPointerException(); - } + Objects.requireNonNull(name, "name"); if (name.length() > 0xFFFF) { throw new IllegalArgumentException("entry name too long"); } @@ -73,11 +82,19 @@ /** * Creates a new zip entry with fields taken from the specified * zip entry. - * @param e a zip Entry object + * + * @param e + * A zip Entry object + * + * @throws NullPointerException if the entry object is null */ public ZipEntry(ZipEntry e) { + Objects.requireNonNull(e, "entry"); name = e.name; + time = e.time; mtime = e.mtime; + atime = e.atime; + ctime = e.ctime; crc = e.crc; size = e.size; csize = e.csize; @@ -103,33 +120,178 @@ /** * Sets the last modification time of the entry. * - * @param time the last modification time of the entry in milliseconds since the epoch + * <p> If the entry is output to a ZIP file or ZIP file formatted + * output stream the last modification time set by this method will + * be stored into the {@code date and time fields} of the zip file + * entry and encoded in standard {@code MS-DOS date and time format}. + * The {@link java.util.TimeZone#getDefault() default TimeZone} is + * used to convert the epoch time to the MS-DOS data and time. + * + * @param time + * The last modification time of the entry in milliseconds + * since the epoch + * * @see #getTime() + * @see #getLastModifiedTime() */ public void setTime(long time) { + this.time = time; + this.mtime = null; + } + + /** + * Returns the last modification time of the entry. + * + * <p> If the entry is read from a ZIP file or ZIP file formatted + * input stream, this is the last modification time from the {@code + * date and time fields} of the zip file entry. The + * {@link java.util.TimeZone#getDefault() default TimeZone} is used + * to convert the standard MS-DOS formatted date and time to the + * epoch time. + * + * @return The last modification time of the entry in milliseconds + * since the epoch, or -1 if not specified + * + * @see #setTime(long) + * @see #setLastModifiedTime(FileTime) + */ + public long getTime() { + return time; + } + + /** + * Sets the last modification time of the entry. + * + * <p> When output to a ZIP file or ZIP file formatted output stream + * the last modification time set by this method will be stored into + * zip file entry's {@code date and time fields} in {@code standard + * MS-DOS date and time format}), and the extended timestamp fields + * in {@code optional extra data} in UTC time. + * + * @param time + * The last modification time of the entry + * @return This zip entry + * + * @throws NullPointerException if the {@code time} is null + * + * @see #getLastModifiedTime() + * @since 1.8 + */ + public ZipEntry setLastModifiedTime(FileTime time) { + Objects.requireNonNull(name, "time"); this.mtime = time; + this.time = time.to(TimeUnit.MILLISECONDS); + return this; } /** * Returns the last modification time of the entry. - * <p> The last modificatin time may come from zip entry's extensible - * data field {@code NTFS} or {@code Info-ZIP Extended Timestamp}, if - * the entry is read from {@link ZipInputStream} or {@link ZipFile}. + * + * <p> If the entry is read from a ZIP file or ZIP file formatted + * input stream, this is the last modification time from the zip + * file entry's {@code optional extra data} if the extended timestamp + * fields are present. Otherwise the last modification time is read + * from the entry's {@code date and time fields}, the {@link + * java.util.TimeZone#getDefault() default TimeZone} is used to convert + * the standard MS-DOS formatted date and time to the epoch time. + * + * @return The last modification time of the entry, null if not specified + * + * @see #setLastModifiedTime(FileTime) + * @since 1.8 + */ + public FileTime getLastModifiedTime() { + if (mtime != null) + return mtime; + if (time == -1) + return null; + return FileTime.from(time, TimeUnit.MILLISECONDS); + } + + /** + * Sets the last access time of the entry. + * + * <p> If set, the last access time will be stored into the extended + * timestamp fields of entry's {@code optional extra data}, when output + * to a ZIP file or ZIP file formatted stream. + * + * @param time + * The last access time of the entry + * @return This zip entry + * + * @throws NullPointerException if the {@code time} is null + * + * @see #getLastAccessTime() + * @since 1.8 + */ + public ZipEntry setLastAccessTime(FileTime time) { + Objects.requireNonNull(name, "time"); + this.atime = time; + return this; + } + + /** + * Returns the last access time of the entry. * - * @return the last modification time of the entry, or -1 if not specified - * @see #setTime(long) + * <p> The last access time is from the extended timestamp fields + * of entry's {@code optional extra data} when read from a ZIP file + * or ZIP file formatted stream. + * + * @return The last access time of the entry, null if not specified + + * @see #setLastAccessTime(FileTime) + * @since 1.8 */ - public long getTime() { - return mtime; + public FileTime getLastAccessTime() { + return atime; + } + + /** + * Sets the creation time of the entry. + * + * <p> If set, the creation time will be stored into the extended + * timestamp fields of entry's {@code optional extra data}, when + * output to a ZIP file or ZIP file formatted stream. + * + * @param time + * The creation time of the entry + * @return This zip entry + * + * @throws NullPointerException if the {@code time} is null + * + * @see #getCreationTime() + * @since 1.8 + */ + public ZipEntry setCreationTime(FileTime time) { + Objects.requireNonNull(name, "time"); + this.ctime = time; + return this; + } + + /** + * Returns the creation time of the entry. + * + * <p> The creation time is from the extended timestamp fields of + * entry's {@code optional extra data} when read from a ZIP file + * or ZIP file formatted stream. + * + * @return the creation time of the entry, null if not specified + * @see #setCreationTime(FileTime) + * @since 1.8 + */ + public FileTime getCreationTime() { + return ctime; } /** * Sets the uncompressed size of the entry data. + * * @param size the uncompressed size in bytes - * @exception IllegalArgumentException if the specified size is less - * than 0, is greater than 0xFFFFFFFF when - * <a href="package-summary.html#zip64">ZIP64 format</a> is not supported, - * or is less than 0 when ZIP64 is supported + * + * @throws IllegalArgumentException if the specified size is less + * than 0, is greater than 0xFFFFFFFF when + * <a href="package-summary.html#zip64">ZIP64 format</a> is not supported, + * or is less than 0 when ZIP64 is supported * @see #getSize() */ public void setSize(long size) { @@ -140,7 +302,8 @@ } /** - * Returns the uncompressed size of the entry data, or -1 if not known. + * Returns the uncompressed size of the entry data. + * * @return the uncompressed size of the entry data, or -1 if not known * @see #setSize(long) */ @@ -149,9 +312,11 @@ } /** - * Returns the size of the compressed entry data, or -1 if not known. - * In the case of a stored entry, the compressed size will be the same + * Returns the size of the compressed entry data. + * + * <p> In the case of a stored entry, the compressed size will be the same * as the uncompressed size of the entry. + * * @return the size of the compressed entry data, or -1 if not known * @see #setCompressedSize(long) */ @@ -161,7 +326,9 @@ /** * Sets the size of the compressed entry data. + * * @param csize the compressed size to set to + * * @see #getCompressedSize() */ public void setCompressedSize(long csize) { @@ -170,9 +337,11 @@ /** * Sets the CRC-32 checksum of the uncompressed entry data. + * * @param crc the CRC-32 value - * @exception IllegalArgumentException if the specified CRC-32 value is - * less than 0 or greater than 0xFFFFFFFF + * + * @throws IllegalArgumentException if the specified CRC-32 value is + * less than 0 or greater than 0xFFFFFFFF * @see #getCrc() */ public void setCrc(long crc) { @@ -183,10 +352,11 @@ } /** - * Returns the CRC-32 checksum of the uncompressed entry data, or -1 if - * not known. + * Returns the CRC-32 checksum of the uncompressed entry data. + * * @return the CRC-32 checksum of the uncompressed entry data, or -1 if * not known + * * @see #setCrc(long) */ public long getCrc() { @@ -195,9 +365,11 @@ /** * Sets the compression method for the entry. + * * @param method the compression method, either STORED or DEFLATED - * @exception IllegalArgumentException if the specified compression - * method is invalid + * + * @throws IllegalArgumentException if the specified compression + * method is invalid * @see #getMethod() */ public void setMethod(int method) { @@ -208,7 +380,8 @@ } /** - * Returns the compression method of the entry, or -1 if not specified. + * Returns the compression method of the entry. + * * @return the compression method of the entry, or -1 if not specified * @see #setMethod(int) */ @@ -218,21 +391,104 @@ /** * Sets the optional extra field data for the entry. - * @param extra the extra field data bytes - * @exception IllegalArgumentException if the length of the specified - * extra field data is greater than 0xFFFF bytes + * + * <p> Invoking this method may change this entry's last modification + * time, last access time and creation time, if the {@code extra} field + * data includes the extensible timestamp fields, such as {@code NTFS tag + * 0x0001} or {@code Info-ZIP Extended Timestamp}, as specified in + * <a href="http://www.info-zip.org/doc/appnote-19970311-iz.zip">Info-ZIP + * Application Note 970311</a>. + * + * @param extra + * The extra field data bytes + * + * @throws IllegalArgumentException if the length of the specified + * extra field data is greater than 0xFFFF bytes + * * @see #getExtra() */ public void setExtra(byte[] extra) { - if (extra != null && extra.length > 0xFFFF) { - throw new IllegalArgumentException("invalid extra field length"); + setExtra0(extra, false); + } + + /** + * Sets the optional extra field data for the entry. + * + * @param extra + * the extra field data bytes + * @param doZIP64 + * if true, set size and csize from ZIP64 fields if present + */ + void setExtra0(byte[] extra, boolean doZIP64) { + if (extra != null) { + if (extra.length > 0xFFFF) { + throw new IllegalArgumentException("invalid extra field length"); + } + // extra fields are in "HeaderID(2)DataSize(2)Data... format + int off = 0; + int len = extra.length; + while (off + 4 < len) { + int tag = get16(extra, off); + int sz = get16(extra, off + 2); + off += 4; + if (off + sz > len) // invalid data + break; + switch (tag) { + case EXTID_ZIP64: + if (doZIP64) { + // LOC extra zip64 entry MUST include BOTH original + // and compressed file size fields. + // If invalid zip64 extra fields, simply skip. Even + // it's rare, it's possible the entry size happens to + // be the magic value and it "accidently" has some + // bytes in extra match the id. + if (sz >= 16) { + size = get64(extra, off); + csize = get64(extra, off + 8); + } + } + break; + case EXTID_NTFS: + int pos = off + 4; // reserved 4 bytes + if (get16(extra, pos) != 0x0001 || get16(extra, pos + 2) != 24) + break; + mtime = winTimeToFileTime(get64(extra, pos + 4)); + atime = winTimeToFileTime(get64(extra, pos + 12)); + ctime = winTimeToFileTime(get64(extra, pos + 20)); + break; + case EXTID_EXTT: + int flag = Byte.toUnsignedInt(extra[off]); + int sz0 = 1; + // The CEN-header extra field contains the modification + // time only, or no timestamp at all. 'sz' is used to + // flag its presence or absence. But if mtime is present + // in LOC it must be present in CEN as well. + if ((flag & 0x1) != 0 && (sz0 + 4) <= sz) { + mtime = unixTimeToFileTime(get32(extra, off + sz0)); + sz0 += 4; + } + if ((flag & 0x2) != 0 && (sz0 + 4) <= sz) { + atime = unixTimeToFileTime(get32(extra, off + sz0)); + sz0 += 4; + } + if ((flag & 0x4) != 0 && (sz0 + 4) <= sz) { + ctime = unixTimeToFileTime(get32(extra, off + sz0)); + sz0 += 4; + } + break; + default: + } + off += sz; + } } this.extra = extra; } /** - * Returns the extra field data for the entry, or null if none. + * Returns the extra field data for the entry. + * * @return the extra field data for the entry, or null if none + * * @see #setExtra(byte[]) */ public byte[] getExtra() { @@ -255,8 +511,10 @@ } /** - * Returns the comment string for the entry, or null if none. + * Returns the comment string for the entry. + * * @return the comment string for the entry, or null if none + * * @see #setComment(String) */ public String getComment() {
--- a/src/share/classes/java/util/zip/ZipFile.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/zip/ZipFile.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. 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 @@ -567,44 +567,12 @@ e.name = zc.toString(bname, bname.length); } } + e.time = dosToJavaTime(getEntryTime(jzentry)); e.crc = getEntryCrc(jzentry); e.size = getEntrySize(jzentry); - e. csize = getEntryCSize(jzentry); + e.csize = getEntryCSize(jzentry); e.method = getEntryMethod(jzentry); - e.extra = getEntryBytes(jzentry, JZENTRY_EXTRA); - if (e.extra != null) { - byte[] extra = e.extra; - int len = e.extra.length; - int off = 0; - while (off + 4 < len) { - int pos = off; - int tag = get16(extra, pos); - int sz = get16(extra, pos + 2); - pos += 4; - if (pos + sz > len) // invalid data - break; - switch (tag) { - case EXTID_NTFS: - pos += 4; // reserved 4 bytes - if (get16(extra, pos) != 0x0001 || get16(extra, pos + 2) != 24) - break; - e.mtime = winToJavaTime(get64(extra, pos + 4)); - break; - case EXTID_EXTT: - int flag = Byte.toUnsignedInt(extra[pos++]); - if ((flag & 0x1) != 0) { - e.mtime = unixToJavaTime(get32(extra, pos)); - pos += 4; - } - break; - default: // unknown tag - } - off += (sz + 4); - } - } - if (e.mtime == -1) { - e.mtime = dosToJavaTime(getEntryTime(jzentry)); - } + e.setExtra0(getEntryBytes(jzentry, JZENTRY_EXTRA), false); byte[] bcomm = getEntryBytes(jzentry, JZENTRY_COMMENT); if (bcomm == null) { e.comment = null;
--- a/src/share/classes/java/util/zip/ZipInputStream.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/zip/ZipInputStream.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. 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 @@ -288,9 +288,9 @@ int len = get16(tmpbuf, LOCNAM); int blen = b.length; if (len > blen) { - do + do { blen = blen * 2; - while (len > blen); + } while (len > blen); b = new byte[blen]; } readFully(b, 0, len); @@ -303,7 +303,7 @@ throw new ZipException("encrypted ZIP entry not supported"); } e.method = get16(tmpbuf, LOCHOW); - e.mtime = dosToJavaTime(get32(tmpbuf, LOCTIM)); + e.time = dosToJavaTime(get32(tmpbuf, LOCTIM)); if ((flag & 8) == 8) { /* "Data Descriptor" present */ if (e.method != DEFLATED) { @@ -319,49 +319,7 @@ if (len > 0) { byte[] extra = new byte[len]; readFully(extra, 0, len); - e.setExtra(extra); - // extra fields are in "HeaderID(2)DataSize(2)Data... format - int off = 0; - while (off + 4 < len) { - int pos = off; - int tag = get16(extra, pos); - int sz = get16(extra, pos + 2); - pos += 4; - if (pos + sz > len) // invalid data - break; - switch (tag) { - case EXTID_ZIP64 : - // LOC extra zip64 entry MUST include BOTH original and - // compressed file size fields. - // - // If invalid zip64 extra fields, simply skip. Even it's - // rare, it's possible the entry size happens to be - // the magic value and it "accidently" has some bytes - // in extra match the id. - if (sz >= 16 && (pos + sz) <= len ) { - e.size = get64(extra, pos); - e.csize = get64(extra, pos + 8); - } - break; - case EXTID_NTFS: - pos += 4; // reserved 4 bytes - if (get16(extra, pos) != 0x0001 || get16(extra, pos + 2) != 24) - break; - // override the loc field, NTFS time has 'microsecond' granularity - e.mtime = winToJavaTime(get64(extra, pos + 4)); - break; - case EXTID_EXTT: - int flag = Byte.toUnsignedInt(extra[pos++]); - if ((flag & 0x1) != 0) { - e.mtime = unixToJavaTime(get32(extra, pos)); - pos += 4; - } - break; - default: // unknown tag - } - off += (sz + 4); - } - + e.setExtra0(extra, true); } return e; }
--- a/src/share/classes/java/util/zip/ZipOutputStream.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/zip/ZipOutputStream.java Tue Aug 27 21:46:00 2013 -0700 @@ -59,8 +59,9 @@ "jdk.util.zip.inhibitZip64", "false"))); private static class XEntry { - public final ZipEntry entry; - public final long offset; + final ZipEntry entry; + final long offset; + long dostime; // last modification time in msdos format public XEntry(ZipEntry entry, long offset) { this.entry = entry; this.offset = offset; @@ -191,7 +192,9 @@ if (current != null) { closeEntry(); // close previous entry } - if (e.mtime == -1) { + if (e.time == -1) { + // by default, do NOT use extended timestamps in extra + // data, for now. e.setTime(System.currentTimeMillis()); } if (e.method == -1) { @@ -384,25 +387,20 @@ ZipEntry e = xentry.entry; int flag = e.flag; boolean hasZip64 = false; - int elen = (e.extra != null) ? e.extra.length : 0; - int eoff = 0; - boolean foundEXTT = false; // if EXTT already present - // do nothing. - while (eoff + 4 < elen) { - int tag = get16(e.extra, eoff); - int sz = get16(e.extra, eoff + 2); - if (tag == EXTID_EXTT) { - foundEXTT = true; - } - eoff += (4 + sz); - } + int elen = getExtraLen(e.extra); + + // keep a copy of dostime for writeCEN(), otherwise the tz + // sensitive local time entries in loc and cen might be + // different if the default tz get changed during writeLOC() + // and writeCEN() + xentry.dostime = javaToDosTime(e.time); + writeInt(LOCSIG); // LOC header signature if ((flag & 8) == 8) { writeShort(version(e)); // version needed to extract writeShort(flag); // general purpose bit flag writeShort(e.method); // compression method - writeInt(javaToDosTime(e.mtime)); // last modification time - + writeInt(xentry.dostime); // last modification time // store size, uncompressed size, and crc-32 in data descriptor // immediately following compressed entry data writeInt(0); @@ -417,7 +415,7 @@ } writeShort(flag); // general purpose bit flag writeShort(e.method); // compression method - writeInt(javaToDosTime(e.mtime)); // last modification time + writeInt(xentry.dostime); // last modification time writeInt(e.crc); // crc-32 if (hasZip64) { writeInt(ZIP64_MAGICVAL); @@ -430,8 +428,23 @@ } byte[] nameBytes = zc.getBytes(e.name); writeShort(nameBytes.length); - if (!foundEXTT) - elen += 9; // use Info-ZIP's ext time in extra + + int elenEXTT = 0; // info-zip extended timestamp + int flagEXTT = 0; + if (e.mtime != null) { + elenEXTT += 4; + flagEXTT |= EXTT_FLAG_LMT; + } + if (e.atime != null) { + elenEXTT += 4; + flagEXTT |= EXTT_FLAG_LAT; + } + if (e.ctime != null) { + elenEXTT += 4; + flagEXTT |= EXTT_FLAT_CT; + } + if (flagEXTT != 0) + elen += (elenEXTT + 5); // headid(2) + size(2) + flag(1) + data writeShort(elen); writeBytes(nameBytes, 0, nameBytes.length); if (hasZip64) { @@ -440,15 +453,18 @@ writeLong(e.size); writeLong(e.csize); } - if (!foundEXTT) { + if (flagEXTT != 0) { writeShort(EXTID_EXTT); - writeShort(5); // size for the folowing data block - writeByte(0x1); // flags byte, mtime only - writeInt(javaToUnixTime(e.mtime)); + writeShort(elenEXTT + 1); // flag + data + writeByte(flagEXTT); + if (e.mtime != null) + writeInt(fileTimeToUnixTime(e.mtime)); + if (e.atime != null) + writeInt(fileTimeToUnixTime(e.atime)); + if (e.ctime != null) + writeInt(fileTimeToUnixTime(e.ctime)); } - if (e.extra != null) { - writeBytes(e.extra, 0, e.extra.length); - } + writeExtra(e.extra); locoff = written; } @@ -506,31 +522,35 @@ } writeShort(flag); // general purpose bit flag writeShort(e.method); // compression method - writeInt(javaToDosTime(e.mtime)); // last modification time + // use the copy in xentry, which has been converted + // from e.time in writeLOC() + writeInt(xentry.dostime); // last modification time writeInt(e.crc); // crc-32 writeInt(csize); // compressed size writeInt(size); // uncompressed size byte[] nameBytes = zc.getBytes(e.name); writeShort(nameBytes.length); - int elen = (e.extra != null) ? e.extra.length : 0; - int eoff = 0; - boolean foundEXTT = false; // if EXTT already present - // do nothing. - while (eoff + 4 < elen) { - int tag = get16(e.extra, eoff); - int sz = get16(e.extra, eoff + 2); - if (tag == EXTID_EXTT) { - foundEXTT = true; - } - eoff += (4 + sz); + int elen = getExtraLen(e.extra); + if (hasZip64) { + elen += (elenZIP64 + 4);// + headid(2) + datasize(2) } - if (hasZip64) { - // + headid(2) + datasize(2) - elen += (elenZIP64 + 4); + // cen info-zip extended timestamp only outputs mtime + // but set the flag for a/ctime, if present in loc + int flagEXTT = 0; + if (e.mtime != null) { + elen += 4; // + mtime(4) + flagEXTT |= EXTT_FLAG_LMT; } - if (!foundEXTT) - elen += 9; // Info-ZIP's Extended Timestamp + if (e.atime != null) { + flagEXTT |= EXTT_FLAG_LAT; + } + if (e.ctime != null) { + flagEXTT |= EXTT_FLAT_CT; + } + if (flagEXTT != 0) { + elen += 5; // headid + sz + flag + } writeShort(elen); byte[] commentBytes; if (e.comment != null) { @@ -545,6 +565,8 @@ writeInt(0); // external file attributes (unused) writeInt(offset); // relative offset of local header writeBytes(nameBytes, 0, nameBytes.length); + + // take care of EXTID_ZIP64 and EXTID_EXTT if (hasZip64) { writeShort(ZIP64_EXTID);// Zip64 extra writeShort(elenZIP64); @@ -555,15 +577,18 @@ if (offset == ZIP64_MAGICVAL) writeLong(xentry.offset); } - if (!foundEXTT) { + if (flagEXTT != 0) { writeShort(EXTID_EXTT); - writeShort(5); - writeByte(0x1); // flags byte - writeInt(javaToUnixTime(e.mtime)); + if (e.mtime != null) { + writeShort(5); // flag + mtime + writeByte(flagEXTT); + writeInt(fileTimeToUnixTime(e.mtime)); + } else { + writeShort(1); // flag only + writeByte(flagEXTT); + } } - if (e.extra != null) { - writeBytes(e.extra, 0, e.extra.length); - } + writeExtra(e.extra); if (commentBytes != null) { writeBytes(commentBytes, 0, Math.min(commentBytes.length, 0xffff)); } @@ -627,6 +652,47 @@ } /* + * Returns the length of extra data without EXTT and ZIP64. + */ + private int getExtraLen(byte[] extra) { + if (extra == null) + return 0; + int skipped = 0; + int len = extra.length; + int off = 0; + while (off + 4 <= len) { + int tag = get16(extra, off); + int sz = get16(extra, off + 2); + if (tag == EXTID_EXTT || tag == EXTID_ZIP64) { + skipped += (sz + 4); + } + off += (sz + 4); + } + return len - skipped; + } + + /* + * Writes extra data without EXTT and ZIP64. + * + * Extra timestamp and ZIP64 data is handled/output separately + * in writeLOC and writeCEN. + */ + private void writeExtra(byte[] extra) throws IOException { + if (extra != null) { + int len = extra.length; + int off = 0; + while (off + 4 <= len) { + int tag = get16(extra, off); + int sz = get16(extra, off + 2); + if (tag != EXTID_EXTT && tag != EXTID_ZIP64) { + writeBytes(extra, off, sz + 4); + } + off += (sz + 4); + } + } + } + + /* * Writes a 8-bit byte to the output stream. */ private void writeByte(int v) throws IOException {
--- a/src/share/classes/java/util/zip/ZipUtils.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/java/util/zip/ZipUtils.java Tue Aug 27 21:46:00 2013 -0700 @@ -25,42 +25,45 @@ package java.util.zip; +import java.nio.file.attribute.FileTime; import java.util.Date; import java.util.concurrent.TimeUnit; +import static java.util.zip.ZipConstants.*; +import static java.util.zip.ZipConstants64.*; + class ZipUtils { // used to adjust values between Windows and java epoch private static final long WINDOWS_EPOCH_IN_MICROSECONDS = -11644473600000000L; /** - * Converts Windows time (in microseconds, UTC/GMT) time to Java time. + * Converts Windows time (in microseconds, UTC/GMT) time to FileTime. */ - public static final long winToJavaTime(long wtime) { - return TimeUnit.MILLISECONDS.convert( - wtime / 10 + WINDOWS_EPOCH_IN_MICROSECONDS, TimeUnit.MICROSECONDS); + public static final FileTime winTimeToFileTime(long wtime) { + return FileTime.from(wtime / 10 + WINDOWS_EPOCH_IN_MICROSECONDS, + TimeUnit.MICROSECONDS); } /** - * Converts Java time to Windows time. + * Converts FileTime to Windows time. */ - public static final long javaToWinTime(long time) { - return (TimeUnit.MICROSECONDS.convert(time, TimeUnit.MILLISECONDS) - - WINDOWS_EPOCH_IN_MICROSECONDS) * 10; + public static final long fileTimeToWinTime(FileTime ftime) { + return (ftime.to(TimeUnit.MICROSECONDS) - WINDOWS_EPOCH_IN_MICROSECONDS) * 10; } /** - * Converts "standard Unix time"(in seconds, UTC/GMT) to Java time + * Converts "standard Unix time"(in seconds, UTC/GMT) to FileTime */ - public static final long unixToJavaTime(long utime) { - return TimeUnit.MILLISECONDS.convert(utime, TimeUnit.SECONDS); + public static final FileTime unixTimeToFileTime(long utime) { + return FileTime.from(utime, TimeUnit.SECONDS); } /** - * Converts Java time to "standard Unix time". + * Converts FileTime to "standard Unix time". */ - public static final long javaToUnixTime(long time) { - return TimeUnit.SECONDS.convert(time, TimeUnit.MILLISECONDS); + public static final long fileTimeToUnixTime(FileTime ftime) { + return ftime.to(TimeUnit.SECONDS); } /** @@ -92,7 +95,6 @@ d.getSeconds() >> 1; } - /** * Fetches unsigned 16-bit value from byte array at specified offset. * The bytes are assumed to be in Intel (little-endian) byte order. @@ -116,5 +118,4 @@ public static final long get64(byte b[], int off) { return get32(b, off) | (get32(b, off+4) << 32); } - }
--- a/src/share/classes/javax/crypto/spec/PBEParameterSpec.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/javax/crypto/spec/PBEParameterSpec.java Tue Aug 27 21:46:00 2013 -0700 @@ -64,7 +64,8 @@ * @param salt the salt. The contents of <code>salt</code> are copied * to protect against subsequent modification. * @param iterationCount the iteration count. - * @param paramSpec the cipher algorithm parameter specification. + * @param paramSpec the cipher algorithm parameter specification, which + * may be null. * @exception NullPointerException if <code>salt</code> is null. * * @since 1.8
--- a/src/share/classes/javax/security/auth/Policy.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/javax/security/auth/Policy.java Tue Aug 27 21:46:00 2013 -0700 @@ -156,9 +156,10 @@ private static Policy policy; private static ClassLoader contextClassLoader; + private final static String AUTH_POLICY = + "sun.security.provider.AuthPolicyFile"; - // true if a custom (not com.sun.security.auth.PolicyFile) system-wide - // policy object is set + // true if a custom (not AUTH_POLICY) system-wide policy object is set private static boolean isCustomPolicy; static { @@ -220,7 +221,7 @@ } }); if (policy_class == null) { - policy_class = "com.sun.security.auth.PolicyFile"; + policy_class = AUTH_POLICY; } try { @@ -236,8 +237,7 @@ contextClassLoader).newInstance(); } }); - isCustomPolicy = - !finalClass.equals("com.sun.security.auth.PolicyFile"); + isCustomPolicy = !finalClass.equals(AUTH_POLICY); } catch (Exception e) { throw new SecurityException (sun.security.util.ResourcesMgr.getString @@ -274,14 +274,14 @@ } /** - * Returns true if a custom (not com.sun.security.auth.PolicyFile) - * system-wide policy object has been set or installed. This method is - * called by SubjectDomainCombiner to provide backwards compatibility for + * Returns true if a custom (not AUTH_POLICY) system-wide policy object + * has been set or installed. This method is called by + * SubjectDomainCombiner to provide backwards compatibility for * developers that provide their own javax.security.auth.Policy * implementations. * - * @return true if a custom (not com.sun.security.auth.PolicyFile) - * system-wide policy object has been set; false otherwise + * @return true if a custom (not AUTH_POLICY) system-wide policy object + * has been set; false otherwise */ static boolean isCustomPolicySet(Debug debug) { if (policy != null) { @@ -299,8 +299,7 @@ return Security.getProperty("auth.policy.provider"); } }); - if (policyClass != null - && !policyClass.equals("com.sun.security.auth.PolicyFile")) { + if (policyClass != null && !policyClass.equals(AUTH_POLICY)) { if (debug != null) { debug.println("Providing backwards compatibility for " + "javax.security.auth.policy implementation: " +
--- a/src/share/classes/javax/security/auth/login/Configuration.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/javax/security/auth/login/Configuration.java Tue Aug 27 21:46:00 2013 -0700 @@ -75,7 +75,7 @@ * LoginModules configured for that application. Each {@code LoginModule} * is specified via its fully qualified class name. * Authentication proceeds down the module list in the exact order specified. - * If an application does not have specific entry, + * If an application does not have a specific entry, * it defaults to the specific entry for "<i>other</i>". * * <p> The <i>Flag</i> value controls the overall behavior as authentication @@ -248,7 +248,7 @@ } }); if (config_class == null) { - config_class = "com.sun.security.auth.login.ConfigFile"; + config_class = "sun.security.provider.ConfigFile"; } try {
--- a/src/share/classes/sun/launcher/LauncherHelper.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/launcher/LauncherHelper.java Tue Aug 27 21:46:00 2013 -0700 @@ -65,13 +65,10 @@ import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; -import sun.misc.Version; -import sun.misc.URLClassPath; public enum LauncherHelper { INSTANCE; private static final String MAIN_CLASS = "Main-Class"; - private static final String PROFILE = "Profile"; private static StringBuilder outBuf = new StringBuilder(); @@ -415,27 +412,6 @@ } /* - * If this is not a full JRE then the Profile attribute must be - * present with the Main-Class attribute so as to indicate the minimum - * profile required. Note that we need to suppress checking of the Profile - * attribute after we detect an error. This is because the abort may - * need to lookup resources and this may involve opening additional JAR - * files that would result in errors that suppress the main error. - */ - String profile = mainAttrs.getValue(PROFILE); - if (profile == null) { - if (!Version.isFullJre()) { - URLClassPath.suppressProfileCheckForLauncher(); - abort(null, "java.launcher.jar.error4", jarname); - } - } else { - if (!Version.supportsProfile(profile)) { - URLClassPath.suppressProfileCheckForLauncher(); - abort(null, "java.launcher.jar.error5", profile, jarname); - } - } - - /* * Hand off to FXHelper if it detects a JavaFX application * This must be done after ensuring a Main-Class entry * exists to enforce compliance with the jar specification
--- a/src/share/classes/sun/launcher/resources/launcher.properties Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/launcher/resources/launcher.properties Tue Aug 27 21:46:00 2013 -0700 @@ -139,8 +139,6 @@ Error: An unexpected error occurred while trying to open file {0} java.launcher.jar.error2=manifest not found in {0} java.launcher.jar.error3=no main manifest attribute, in {0} -java.launcher.jar.error4=no Profile manifest attribute in {0} -java.launcher.jar.error5=Profile {0} required by {1} not supported by this runtime java.launcher.init.error=initialization error java.launcher.javafx.error1=\ Error: The JavaFX launchApplication method has the wrong signature, it\n\
--- a/src/share/classes/sun/misc/JavaUtilJarAccess.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/misc/JavaUtilJarAccess.java Tue Aug 27 21:46:00 2013 -0700 @@ -35,7 +35,6 @@ public interface JavaUtilJarAccess { public boolean jarFileHasClassPathAttribute(JarFile jar) throws IOException; - public boolean jarFileHasProfileAttribute(JarFile jar) throws IOException; public CodeSource[] getCodeSources(JarFile jar, URL url); public CodeSource getCodeSource(JarFile jar, URL url, String name); public Enumeration<String> entryNames(JarFile jar, CodeSource[] cs);
--- a/src/share/classes/sun/misc/URLClassPath.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/misc/URLClassPath.java Tue Aug 27 21:46:00 2013 -0700 @@ -35,7 +35,6 @@ import java.util.jar.Manifest; import java.util.jar.Attributes; import java.util.jar.Attributes.Name; -import java.util.jar.UnsupportedProfileException; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URL; @@ -66,12 +65,6 @@ private static final boolean DEBUG; private static final boolean DISABLE_JAR_CHECKING; - /** - * Used by launcher to indicate that checking of the JAR file "Profile" - * attribute has been suppressed. - */ - private static boolean profileCheckSuppressedByLauncher; - static { JAVA_VERSION = java.security.AccessController.doPrivileged( new sun.security.action.GetPropertyAction("java.version")); @@ -593,15 +586,6 @@ } } - /** - * Used by the launcher to suppress further checking of the JAR file Profile - * attribute (necessary when the launcher is aborting as the abort involves - * a resource lookup that may involve opening additional JAR files) - */ - public static void suppressProfileCheckForLauncher() { - profileCheckSuppressedByLauncher = true; - } - /* * Inner class used to represent a Loader of resources from a JAR URL. */ @@ -828,25 +812,6 @@ return false; } - /** - * If the Profile attribute is present then this method checks that the runtime - * supports that profile. - */ - void checkProfileAttribute() throws IOException { - Manifest man = jar.getManifest(); - if (man != null) { - Attributes attr = man.getMainAttributes(); - if (attr != null) { - String value = attr.getValue(Name.PROFILE); - if (value != null && !Version.supportsProfile(value)) { - String prefix = Version.profileName().length() > 0 ? - "This runtime implements " + Version.profileName() + ", " : ""; - throw new UnsupportedProfileException(prefix + csu + " requires " + value); - } - } - } - } - /* * Returns the URL for a resource with the specified name */ @@ -1017,12 +982,6 @@ ensureOpen(); parseExtensionsDependencies(); - // check Profile attribute if present - if (!profileCheckSuppressedByLauncher && - SharedSecrets.javaUtilJarAccess().jarFileHasProfileAttribute(jar)) { - checkProfileAttribute(); - } - if (SharedSecrets.javaUtilJarAccess().jarFileHasClassPathAttribute(jar)) { // Only get manifest when necessary Manifest man = jar.getManifest(); if (man != null) {
--- a/src/share/classes/sun/misc/Version.java.template Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/misc/Version.java.template Tue Aug 27 21:46:00 2013 -0700 @@ -339,68 +339,6 @@ // Return false if not available which implies an old VM (Tiger or before). private static native boolean getJvmVersionInfo(); private static native void getJdkVersionInfo(); - - // Possible runtime profiles, ordered from small to large - private final static String[] PROFILES = { "compact1", "compact2", "compact3" }; - - /** - * Returns the name of the profile that this runtime implements. The empty - * string is returned for the full Java Runtime. - */ - public static String profileName() { - return java_profile_name; - } - - /** - * Indicates if this runtime implements the full Java Runtime. - */ - public static boolean isFullJre() { - return java_profile_name.length() == 0; - } - - // cached index of this profile's name in PROFILES (1-based) - private static int thisRuntimeIndex; - - /** - * Indicates if this runtime supports the given profile. Profile names are - * case sensitive. - * - * @return {@code true} if the given profile is supported - */ - public static boolean supportsProfile(String requiredProfile) { - int x = thisRuntimeIndex - 1; - if (x < 0) { - String profile = profileName(); - if (profile.length() > 0) { - x = 0; - while (x < PROFILES.length) { - if (PROFILES[x].equals(profile)) - break; - x++; - } - if (x >= PROFILES.length) - throw new InternalError(profile + " not known to sun.misc.Version"); - - // okay if another thread has already set it - thisRuntimeIndex = x + 1; - } - // else we are a full JRE - } - - int y = 0; - while (y < PROFILES.length) { - if (PROFILES[y].equals(requiredProfile)) - break; - y++; - } - if (y >= PROFILES.length) { - // profile not found so caller has requested something that is not defined - return false; - } - - return x < 0 || x >= y; - } - } // Help Emacs a little because this file doesn't end in .java.
--- a/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Tue Aug 27 21:46:00 2013 -0700 @@ -1031,6 +1031,24 @@ "ebcdic-s-871+euro" }); + charset("IBM290", "IBM290", + new String[] { + "cp290", + "ibm290", + "ibm-290", + "csIBM290", + "EBCDIC-JP-kana", + "290" + }); + + charset("x-IBM300", "IBM300", + new String[] { + "cp300", + "ibm300", + "ibm-300", + "300" + }); + // Macintosh MacOS/Apple char encodingd
--- a/src/share/classes/sun/print/PSPrinterJob.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/print/PSPrinterJob.java Tue Aug 27 21:46:00 2013 -0700 @@ -339,6 +339,8 @@ */ private static Properties mFontProps = null; + private static boolean isMac; + /* Class static initialiser block */ static { //enable priviledges so initProps can access system properties, @@ -347,6 +349,8 @@ new java.security.PrivilegedAction() { public Object run() { mFontProps = initProps(); + String osName = System.getProperty("os.name"); + isMac = osName.startsWith("Mac"); return null; } }); @@ -473,6 +477,12 @@ PrintService pServ = getPrintService(); if (pServ != null) { mDestination = pServ.getName(); + if (isMac) { + PrintServiceAttributeSet psaSet = pServ.getAttributes() ; + if (psaSet != null) { + mDestination = psaSet.get(PrinterName.class).toString(); + } + } } } } @@ -771,6 +781,12 @@ PrintService pServ = getPrintService(); if (pServ != null) { mDestination = pServ.getName(); + if (isMac) { + PrintServiceAttributeSet psaSet = pServ.getAttributes(); + if (psaSet != null) { + mDestination = psaSet.get(PrinterName.class).toString() ; + } + } } PrinterSpooler spooler = new PrinterSpooler(); java.security.AccessController.doPrivileged(spooler);
--- a/src/share/classes/sun/security/krb5/Credentials.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/security/krb5/Credentials.java Tue Aug 27 21:46:00 2013 -0700 @@ -62,7 +62,9 @@ private static CredentialsCache cache; static boolean alreadyLoaded = false; private static boolean alreadyTried = false; - private static native Credentials acquireDefaultNativeCreds(); + + // Read native ticket with session key type in the given list + private static native Credentials acquireDefaultNativeCreds(int[] eTypes); public Credentials(Ticket new_ticket, PrincipalName new_client, @@ -373,6 +375,8 @@ // It assumes that the GSS call has // the privilege to access the default cache file. + // This method is only called on Windows and Mac OS X, the native + // acquireDefaultNativeCreds is also available on these platforms. public static synchronized Credentials acquireDefaultCreds() { Credentials result = null; @@ -416,10 +420,15 @@ } if (alreadyLoaded) { // There is some native code - if (DEBUG) - System.out.println(">> Acquire default native Credentials"); - result = acquireDefaultNativeCreds(); - // only TGT with DES key will be returned by native method + if (DEBUG) { + System.out.println(">> Acquire default native Credentials"); + } + try { + result = acquireDefaultNativeCreds( + EType.getDefaults("default_tkt_enctypes")); + } catch (KrbException ke) { + // when there is no default_tkt_enctypes. + } } } return result;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/classes/sun/security/provider/AuthPolicyFile.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,1195 @@ +/* + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.provider; + +import java.io.*; +import java.lang.reflect.*; +import java.net.URL; +import java.util.*; + +import java.security.AccessController; +import java.security.CodeSource; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.Permission; +import java.security.Permissions; +import java.security.PermissionCollection; +import java.security.Principal; +import java.security.PrivilegedAction; +import java.security.UnresolvedPermission; +import java.security.Security; +import java.security.cert.Certificate; +import java.security.cert.X509Certificate; + +import javax.security.auth.Subject; +import javax.security.auth.PrivateCredentialPermission; + +import sun.security.provider.PolicyParser.GrantEntry; +import sun.security.provider.PolicyParser.PermissionEntry; +import sun.security.provider.PolicyParser.PrincipalEntry; +import sun.security.util.Debug; +import sun.security.util.PolicyUtil; +import sun.security.util.PropertyExpander; + +/** + * See {@code com.sun.security.auth.PolicyFile} for the class description. + * This class is necessary in order to support a default + * {@code javax.security.auth.Policy} implementation on the compact1 and + * compact2 profiles. + * + * @deprecated As of JDK 1.4, replaced by + * {@code sun.security.provider.PolicyFile}. + * This class is entirely deprecated. + */ +@Deprecated +public class AuthPolicyFile extends javax.security.auth.Policy { + + static final ResourceBundle rb = + AccessController.doPrivileged(new PrivilegedAction<ResourceBundle>() { + @Override public ResourceBundle run() { + return (ResourceBundle.getBundle + ("sun.security.util.AuthResources")); + } + }); + + private static final Debug debug = Debug.getInstance("policy", + "\t[Auth Policy]"); + + private static final String AUTH_POLICY = "java.security.auth.policy"; + private static final String SECURITY_MANAGER = "java.security.manager"; + private static final String AUTH_POLICY_URL = "auth.policy.url."; + + private Vector<PolicyEntry> policyEntries; + private Hashtable<Object, Object> aliasMapping; + + private boolean initialized = false; + + private boolean expandProperties = true; + private boolean ignoreIdentityScope = true; + + // for use with the reflection API + private static final Class[] PARAMS = { String.class, String.class}; + + /** + * Initializes the Policy object and reads the default policy + * configuration file(s) into the Policy object. + */ + public AuthPolicyFile() { + // initialize Policy if either the AUTH_POLICY or + // SECURITY_MANAGER properties are set + String prop = System.getProperty(AUTH_POLICY); + + if (prop == null) { + prop = System.getProperty(SECURITY_MANAGER); + } + if (prop != null) { + init(); + } + } + + private synchronized void init() { + if (initialized) { + return; + } + + policyEntries = new Vector<PolicyEntry>(); + aliasMapping = new Hashtable<Object, Object>(11); + + initPolicyFile(); + initialized = true; + } + + @Override + public synchronized void refresh() { + + java.lang.SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + sm.checkPermission(new javax.security.auth.AuthPermission + ("refreshPolicy")); + } + + // XXX + // + // 1) if code instantiates PolicyFile directly, then it will need + // all the permissions required for the PolicyFile initialization + // 2) if code calls Policy.getPolicy, then it simply needs + // AuthPermission(getPolicy), and the javax.security.auth.Policy + // implementation instantiates PolicyFile in a doPrivileged block + // 3) if after instantiating a Policy (either via #1 or #2), + // code calls refresh, it simply needs + // AuthPermission(refreshPolicy). then PolicyFile wraps + // the refresh in a doPrivileged block. + initialized = false; + AccessController.doPrivileged(new PrivilegedAction<Void>() { + @Override public Void run() { + init(); + return null; + } + }); + } + + private KeyStore initKeyStore(URL policyUrl, String keyStoreName, + String keyStoreType) { + if (keyStoreName != null) { + try { + /* + * location of keystore is specified as absolute URL in policy + * file, or is relative to URL of policy file + */ + URL keyStoreUrl = null; + try { + keyStoreUrl = new URL(keyStoreName); + // absolute URL + } catch (java.net.MalformedURLException e) { + // relative URL + keyStoreUrl = new URL(policyUrl, keyStoreName); + } + + if (debug != null) { + debug.println("reading keystore"+keyStoreUrl); + } + + InputStream inStream = new BufferedInputStream( + PolicyUtil.getInputStream(keyStoreUrl)); + + KeyStore ks; + if (keyStoreType != null) + ks = KeyStore.getInstance(keyStoreType); + else + ks = KeyStore.getInstance(KeyStore.getDefaultType()); + ks.load(inStream, null); + inStream.close(); + return ks; + } catch (Exception e) { + // ignore, treat it like we have no keystore + if (debug != null) { + e.printStackTrace(); + } + return null; + } + } + return null; + } + + private void initPolicyFile() { + + String prop = Security.getProperty("policy.expandProperties"); + if (prop != null) { + expandProperties = prop.equalsIgnoreCase("true"); + } + + String iscp = Security.getProperty("policy.ignoreIdentityScope"); + if (iscp != null) { + ignoreIdentityScope = iscp.equalsIgnoreCase("true"); + } + + String allowSys = Security.getProperty("policy.allowSystemProperty"); + if (allowSys != null && allowSys.equalsIgnoreCase("true")) { + String extra_policy = System.getProperty(AUTH_POLICY); + if (extra_policy != null) { + boolean overrideAll = false; + if (extra_policy.startsWith("=")) { + overrideAll = true; + extra_policy = extra_policy.substring(1); + } + try { + extra_policy = PropertyExpander.expand(extra_policy); + URL policyURL; + File policyFile = new File(extra_policy); + if (policyFile.exists()) { + policyURL = + new URL("file:" + policyFile.getCanonicalPath()); + } else { + policyURL = new URL(extra_policy); + } + if (debug != null) { + debug.println("reading " + policyURL); + } + init(policyURL); + } catch (Exception e) { + // ignore. + if (debug != null) { + debug.println("caught exception: " + e); + } + + } + if (overrideAll) { + if (debug != null) { + debug.println("overriding other policies!"); + } + return; + } + } + } + + int n = 1; + boolean loaded_one = false; + String policy_url; + + while ((policy_url = Security.getProperty(AUTH_POLICY_URL+n)) != null) { + try { + policy_url = PropertyExpander.expand(policy_url).replace + (File.separatorChar, '/'); + if (debug != null) { + debug.println("reading " + policy_url); + } + init(new URL(policy_url)); + loaded_one = true; + } catch (Exception e) { + if (debug != null) { + debug.println("error reading policy " + e); + e.printStackTrace(); + } + // ignore that policy + } + n++; + } + + if (loaded_one == false) { + // do not load a static policy + } + } + + /** + * Checks public key. If it is marked as trusted in + * the identity database, add it to the policy + * with the AllPermission. + */ + private boolean checkForTrustedIdentity(final Certificate cert) { + return false; + } + + /** + * Reads a policy configuration into the Policy object using a + * Reader object. + * + * @param policyFile the policy Reader object. + */ + private void init(URL policy) { + PolicyParser pp = new PolicyParser(expandProperties); + try (InputStreamReader isr + = new InputStreamReader(PolicyUtil.getInputStream(policy))) { + pp.read(isr); + KeyStore keyStore = initKeyStore(policy, pp.getKeyStoreUrl(), + pp.getKeyStoreType()); + Enumeration<GrantEntry> enum_ = pp.grantElements(); + while (enum_.hasMoreElements()) { + GrantEntry ge = enum_.nextElement(); + addGrantEntry(ge, keyStore); + } + } catch (PolicyParser.ParsingException pe) { + System.err.println(AUTH_POLICY + + rb.getString(".error.parsing.") + policy); + System.err.println(AUTH_POLICY + rb.getString("COLON") + + pe.getMessage()); + if (debug != null) { + pe.printStackTrace(); + } + } catch (Exception e) { + if (debug != null) { + debug.println("error parsing " + policy); + debug.println(e.toString()); + e.printStackTrace(); + } + } + } + + /** + * Given a PermissionEntry, create a codeSource. + * + * @return null if signedBy alias is not recognized + */ + CodeSource getCodeSource(GrantEntry ge, KeyStore keyStore) + throws java.net.MalformedURLException + { + Certificate[] certs = null; + if (ge.signedBy != null) { + certs = getCertificates(keyStore, ge.signedBy); + if (certs == null) { + // we don't have a key for this alias, + // just return + if (debug != null) { + debug.println(" no certs for alias " + + ge.signedBy + ", ignoring."); + } + return null; + } + } + + URL location; + if (ge.codeBase != null) { + location = new URL(ge.codeBase); + } else { + location = null; + } + + if (ge.principals == null || ge.principals.size() == 0) { + return (canonicalizeCodebase + (new CodeSource(location, certs), + false)); + } else { + return (canonicalizeCodebase + (new SubjectCodeSource(null, ge.principals, location, certs), + false)); + } + } + + /** + * Add one policy entry to the vector. + */ + private void addGrantEntry(GrantEntry ge, KeyStore keyStore) { + + if (debug != null) { + debug.println("Adding policy entry: "); + debug.println(" signedBy " + ge.signedBy); + debug.println(" codeBase " + ge.codeBase); + if (ge.principals != null) { + for (PrincipalEntry pppe : ge.principals) { + debug.println(" " + pppe.getPrincipalClass() + + " " + pppe.getPrincipalName()); + } + } + debug.println(); + } + + try { + CodeSource codesource = getCodeSource(ge, keyStore); + // skip if signedBy alias was unknown... + if (codesource == null) return; + + PolicyEntry entry = new PolicyEntry(codesource); + Enumeration<PermissionEntry> enum_ = ge.permissionElements(); + while (enum_.hasMoreElements()) { + PermissionEntry pe = enum_.nextElement(); + try { + // XXX special case PrivateCredentialPermission-SELF + Permission perm; + if (pe.permission.equals + ("javax.security.auth.PrivateCredentialPermission") && + pe.name.endsWith(" self")) { + perm = getInstance(pe.permission, + pe.name + " \"self\"", + pe.action); + } else { + perm = getInstance(pe.permission, + pe.name, + pe.action); + } + entry.add(perm); + if (debug != null) { + debug.println(" "+perm); + } + } catch (ClassNotFoundException cnfe) { + Certificate certs[]; + if (pe.signedBy != null) { + certs = getCertificates(keyStore, pe.signedBy); + } else { + certs = null; + } + + // only add if we had no signer or we had a + // a signer and found the keys for it. + if (certs != null || pe.signedBy == null) { + Permission perm = new UnresolvedPermission( + pe.permission, + pe.name, + pe.action, + certs); + entry.add(perm); + if (debug != null) { + debug.println(" "+perm); + } + } + } catch (java.lang.reflect.InvocationTargetException ite) { + System.err.println + (AUTH_POLICY + + rb.getString(".error.adding.Permission.") + + pe.permission + + rb.getString("SPACE") + + ite.getTargetException()); + } catch (Exception e) { + System.err.println + (AUTH_POLICY + + rb.getString(".error.adding.Permission.") + + pe.permission + + rb.getString("SPACE") + + e); + } + } + policyEntries.addElement(entry); + } catch (Exception e) { + System.err.println + (AUTH_POLICY + + rb.getString(".error.adding.Entry.") + + ge + + rb.getString("SPACE") + + e); + } + + if (debug != null) { + debug.println(); + } + } + + /** + * Returns a new Permission object of the given Type. The Permission is + * created by getting the + * Class object using the <code>Class.forName</code> method, and using + * the reflection API to invoke the (String name, String actions) + * constructor on the + * object. + * + * @param type the type of Permission being created. + * @param name the name of the Permission being created. + * @param actions the actions of the Permission being created. + * + * @exception ClassNotFoundException if the particular Permission + * class could not be found. + * + * @exception IllegalAccessException if the class or initializer is + * not accessible. + * + * @exception InstantiationException if getInstance tries to + * instantiate an abstract class or an interface, or if the + * instantiation fails for some other reason. + * + * @exception NoSuchMethodException if the (String, String) constructor + * is not found. + * + * @exception InvocationTargetException if the underlying Permission + * constructor throws an exception. + * + */ + private static final Permission getInstance(String type, + String name, + String actions) + throws ClassNotFoundException, + InstantiationException, + IllegalAccessException, + NoSuchMethodException, + InvocationTargetException + { + //XXX we might want to keep a hash of created factories... + Class<?> pc = Class.forName(type); + Constructor<?> c = pc.getConstructor(PARAMS); + return (Permission) c.newInstance(new Object[] { name, actions }); + } + + /** + * Fetch all certs associated with this alias. + */ + Certificate[] getCertificates(KeyStore keyStore, String aliases) { + + Vector<Certificate> vcerts = null; + + StringTokenizer st = new StringTokenizer(aliases, ","); + int n = 0; + + while (st.hasMoreTokens()) { + String alias = st.nextToken().trim(); + n++; + Certificate cert = null; + // See if this alias's cert has already been cached + cert = (Certificate) aliasMapping.get(alias); + if (cert == null && keyStore != null) { + + try { + cert = keyStore.getCertificate(alias); + } catch (KeyStoreException kse) { + // never happens, because keystore has already been loaded + // when we call this + } + if (cert != null) { + aliasMapping.put(alias, cert); + aliasMapping.put(cert, alias); + } + } + + if (cert != null) { + if (vcerts == null) { + vcerts = new Vector<Certificate>(); + } + vcerts.addElement(cert); + } + } + + // make sure n == vcerts.size, since we are doing a logical *and* + if (vcerts != null && n == vcerts.size()) { + Certificate[] certs = new Certificate[vcerts.size()]; + vcerts.copyInto(certs); + return certs; + } else { + return null; + } + } + + /** + * Enumerate all the entries in the global policy object. + * This method is used by policy admin tools. The tools + * should use the Enumeration methods on the returned object + * to fetch the elements sequentially. + */ + private final synchronized Enumeration<PolicyEntry> elements() { + return policyEntries.elements(); + } + + @Override + public PermissionCollection getPermissions(final Subject subject, + final CodeSource codesource) { + + // 1) if code instantiates PolicyFile directly, then it will need + // all the permissions required for the PolicyFile initialization + // 2) if code calls Policy.getPolicy, then it simply needs + // AuthPermission(getPolicy), and the javax.security.auth.Policy + // implementation instantiates PolicyFile in a doPrivileged block + // 3) if after instantiating a Policy (either via #1 or #2), + // code calls getPermissions, PolicyFile wraps the call + // in a doPrivileged block. + return AccessController.doPrivileged + (new PrivilegedAction<PermissionCollection>() { + @Override public PermissionCollection run() { + SubjectCodeSource scs = new SubjectCodeSource( + subject, null, + codesource == null ? null : codesource.getLocation(), + codesource == null ? null : codesource.getCertificates()); + if (initialized) { + return getPermissions(new Permissions(), scs); + } else { + return new PolicyPermissions(AuthPolicyFile.this, scs); + } + } + }); + } + + /** + * Examines the global policy for the specified CodeSource, and + * creates a PermissionCollection object with + * the set of permissions for that principal's protection domain. + * + * @param CodeSource the codesource associated with the caller. + * This encapsulates the original location of the code (where the code + * came from) and the public key(s) of its signer. + * + * @return the set of permissions according to the policy. + */ + PermissionCollection getPermissions(CodeSource codesource) { + + if (initialized) { + return getPermissions(new Permissions(), codesource); + } else { + return new PolicyPermissions(this, codesource); + } + } + + /** + * Examines the global policy for the specified CodeSource, and + * creates a PermissionCollection object with + * the set of permissions for that principal's protection domain. + * + * @param permissions the permissions to populate + * @param codesource the codesource associated with the caller. + * This encapsulates the original location of the code (where the code + * came from) and the public key(s) of its signer. + * + * @return the set of permissions according to the policy. + */ + Permissions getPermissions(final Permissions perms, + final CodeSource cs) + { + if (!initialized) { + init(); + } + + final CodeSource codesource[] = {null}; + + codesource[0] = canonicalizeCodebase(cs, true); + + if (debug != null) { + debug.println("evaluate(" + codesource[0] + ")\n"); + } + + // needs to be in a begin/endPrivileged block because + // codesource.implies calls URL.equals which does an + // InetAddress lookup + + for (int i = 0; i < policyEntries.size(); i++) { + + PolicyEntry entry = policyEntries.elementAt(i); + + if (debug != null) { + debug.println("PolicyFile CodeSource implies: " + + entry.codesource.toString() + "\n\n" + + "\t" + codesource[0].toString() + "\n\n"); + } + + if (entry.codesource.implies(codesource[0])) { + for (int j = 0; j < entry.permissions.size(); j++) { + Permission p = entry.permissions.elementAt(j); + if (debug != null) { + debug.println(" granting " + p); + } + if (!addSelfPermissions(p, entry.codesource, + codesource[0], perms)) { + // we could check for duplicates + // before adding new permissions, + // but the SubjectDomainCombiner + // already checks for duplicates later + perms.add(p); + } + } + } + } + + // now see if any of the keys are trusted ids. + + if (!ignoreIdentityScope) { + Certificate certs[] = codesource[0].getCertificates(); + if (certs != null) { + for (int k=0; k < certs.length; k++) { + if (aliasMapping.get(certs[k]) == null && + checkForTrustedIdentity(certs[k])) { + // checkForTrustedIdentity added it + // to the policy for us. next time + // around we'll find it. This time + // around we need to add it. + perms.add(new java.security.AllPermission()); + } + } + } + } + return perms; + } + + /** + * Returns true if 'Self' permissions were added to the provided + * 'perms', and false otherwise. + * + * <p> + * + * @param p check to see if this Permission is a "SELF" + * PrivateCredentialPermission. <p> + * + * @param entryCs the codesource for the Policy entry. + * + * @param accCs the codesource for from the current AccessControlContext. + * + * @param perms the PermissionCollection where the individual + * PrivateCredentialPermissions will be added. + */ + private boolean addSelfPermissions(final Permission p, + CodeSource entryCs, + CodeSource accCs, + Permissions perms) { + + if (!(p instanceof PrivateCredentialPermission)) { + return false; + } + + if (!(entryCs instanceof SubjectCodeSource)) { + return false; + } + + PrivateCredentialPermission pcp = (PrivateCredentialPermission)p; + SubjectCodeSource scs = (SubjectCodeSource)entryCs; + + // see if it is a SELF permission + String[][] pPrincipals = pcp.getPrincipals(); + if (pPrincipals.length <= 0 || + !pPrincipals[0][0].equalsIgnoreCase("self") || + !pPrincipals[0][1].equalsIgnoreCase("self")) { + + // regular PrivateCredentialPermission + return false; + } else { + + // granted a SELF permission - create a + // PrivateCredentialPermission for each + // of the Policy entry's CodeSource Principals + + if (scs.getPrincipals() == null) { + // XXX SubjectCodeSource has no Subject??? + return true; + } + + for (PrincipalEntry principal : scs.getPrincipals()) { + + // if the Policy entry's Principal does not contain a + // WILDCARD for the Principal name, then a + // new PrivateCredentialPermission is created + // for the Principal listed in the Policy entry. + // if the Policy entry's Principal contains a WILDCARD + // for the Principal name, then a new + // PrivateCredentialPermission is created + // for each Principal associated with the Subject + // in the current ACC. + + String[][] principalInfo = getPrincipalInfo(principal, accCs); + + for (int i = 0; i < principalInfo.length; i++) { + + // here's the new PrivateCredentialPermission + + PrivateCredentialPermission newPcp = + new PrivateCredentialPermission + (pcp.getCredentialClass() + + " " + + principalInfo[i][0] + + " " + + "\"" + principalInfo[i][1] + "\"", + "read"); + + if (debug != null) { + debug.println("adding SELF permission: " + + newPcp.toString()); + } + + perms.add(newPcp); + } + } + } + return true; + } + + /** + * return the principal class/name pair in the 2D array. + * array[x][y]: x corresponds to the array length. + * if (y == 0), it's the principal class. + * if (y == 1), it's the principal name. + */ + private String[][] getPrincipalInfo(PrincipalEntry principal, + final CodeSource accCs) { + + // there are 3 possibilities: + // 1) the entry's Principal class and name are not wildcarded + // 2) the entry's Principal name is wildcarded only + // 3) the entry's Principal class and name are wildcarded + + if (!principal.getPrincipalClass().equals + (PrincipalEntry.WILDCARD_CLASS) && + !principal.getPrincipalName().equals + (PrincipalEntry.WILDCARD_NAME)) { + + // build a PrivateCredentialPermission for the principal + // from the Policy entry + String[][] info = new String[1][2]; + info[0][0] = principal.getPrincipalClass(); + info[0][1] = principal.getPrincipalName(); + return info; + + } else if (!principal.getPrincipalClass().equals + (PrincipalEntry.WILDCARD_CLASS) && + principal.getPrincipalName().equals + (PrincipalEntry.WILDCARD_NAME)) { + + // build a PrivateCredentialPermission for all + // the Subject's principals that are instances of principalClass + + // the accCs is guaranteed to be a SubjectCodeSource + // because the earlier CodeSource.implies succeeded + SubjectCodeSource scs = (SubjectCodeSource)accCs; + + Set<? extends Principal> principalSet = null; + try { + // principal.principalClass should extend Principal + // If it doesn't, we should stop here with a ClassCastException. + @SuppressWarnings("unchecked") + Class<? extends Principal> pClass = (Class<? extends Principal>) + Class.forName(principal.getPrincipalClass(), false, + ClassLoader.getSystemClassLoader()); + principalSet = scs.getSubject().getPrincipals(pClass); + } catch (Exception e) { + if (debug != null) { + debug.println("problem finding Principal Class " + + "when expanding SELF permission: " + + e.toString()); + } + } + + if (principalSet == null) { + // error + return new String[0][0]; + } + + String[][] info = new String[principalSet.size()][2]; + + int i = 0; + for (Principal p : principalSet) { + info[i][0] = p.getClass().getName(); + info[i][1] = p.getName(); + i++; + } + return info; + + } else { + + // build a PrivateCredentialPermission for every + // one of the current Subject's principals + + // the accCs is guaranteed to be a SubjectCodeSource + // because the earlier CodeSource.implies succeeded + SubjectCodeSource scs = (SubjectCodeSource)accCs; + Set<Principal> principalSet = scs.getSubject().getPrincipals(); + + String[][] info = new String[principalSet.size()][2]; + + int i = 0; + for (Principal p : principalSet) { + info[i][0] = p.getClass().getName(); + info[i][1] = p.getName(); + i++; + } + return info; + } + } + + /* + * Returns the signer certificates from the list of certificates associated + * with the given code source. + * + * The signer certificates are those certificates that were used to verify + * signed code originating from the codesource location. + * + * This method assumes that in the given code source, each signer + * certificate is followed by its supporting certificate chain + * (which may be empty), and that the signer certificate and its + * supporting certificate chain are ordered bottom-to-top (i.e., with the + * signer certificate first and the (root) certificate authority last). + */ + Certificate[] getSignerCertificates(CodeSource cs) { + Certificate[] certs = null; + if ((certs = cs.getCertificates()) == null) { + return null; + } + for (int i = 0; i < certs.length; i++) { + if (!(certs[i] instanceof X509Certificate)) + return cs.getCertificates(); + } + + // Do we have to do anything? + int i = 0; + int count = 0; + while (i < certs.length) { + count++; + while (((i+1) < certs.length) + && ((X509Certificate)certs[i]).getIssuerDN().equals( + ((X509Certificate)certs[i+1]).getSubjectDN())) { + i++; + } + i++; + } + if (count == certs.length) { + // Done + return certs; + } + + ArrayList<Certificate> userCertList = new ArrayList<>(); + i = 0; + while (i < certs.length) { + userCertList.add(certs[i]); + while (((i+1) < certs.length) + && ((X509Certificate)certs[i]).getIssuerDN().equals( + ((X509Certificate)certs[i+1]).getSubjectDN())) { + i++; + } + i++; + } + Certificate[] userCerts = new Certificate[userCertList.size()]; + userCertList.toArray(userCerts); + return userCerts; + } + + private CodeSource canonicalizeCodebase(CodeSource cs, + boolean extractSignerCerts) { + CodeSource canonCs = cs; + if (cs.getLocation() != null && + cs.getLocation().getProtocol().equalsIgnoreCase("file")) { + try { + String path = cs.getLocation().getFile().replace + ('/', + File.separatorChar); + URL csUrl = null; + if (path.endsWith("*")) { + // remove trailing '*' because it causes canonicalization + // to fail on win32 + path = path.substring(0, path.length()-1); + boolean appendFileSep = false; + if (path.endsWith(File.separator)) { + appendFileSep = true; + } + if (path.equals("")) { + path = System.getProperty("user.dir"); + } + File f = new File(path); + path = f.getCanonicalPath(); + StringBuffer sb = new StringBuffer(path); + // reappend '*' to canonicalized filename (note that + // canonicalization may have removed trailing file + // separator, so we have to check for that, too) + if (!path.endsWith(File.separator) && + (appendFileSep || f.isDirectory())) { + sb.append(File.separatorChar); + } + sb.append('*'); + path = sb.toString(); + } else { + path = new File(path).getCanonicalPath(); + } + csUrl = new File(path).toURL(); + + if (cs instanceof SubjectCodeSource) { + SubjectCodeSource scs = (SubjectCodeSource)cs; + if (extractSignerCerts) { + canonCs = new SubjectCodeSource(scs.getSubject(), + scs.getPrincipals(), + csUrl, + getSignerCertificates(scs)); + } else { + canonCs = new SubjectCodeSource(scs.getSubject(), + scs.getPrincipals(), + csUrl, + scs.getCertificates()); + } + } else { + if (extractSignerCerts) { + canonCs = new CodeSource(csUrl, + getSignerCertificates(cs)); + } else { + canonCs = new CodeSource(csUrl, + cs.getCertificates()); + } + } + } catch (IOException ioe) { + // leave codesource as it is, unless we have to extract its + // signer certificates + if (extractSignerCerts) { + if (!(cs instanceof SubjectCodeSource)) { + canonCs = new CodeSource(cs.getLocation(), + getSignerCertificates(cs)); + } else { + SubjectCodeSource scs = (SubjectCodeSource)cs; + canonCs = new SubjectCodeSource(scs.getSubject(), + scs.getPrincipals(), + scs.getLocation(), + getSignerCertificates(scs)); + } + } + } + } else { + if (extractSignerCerts) { + if (!(cs instanceof SubjectCodeSource)) { + canonCs = new CodeSource(cs.getLocation(), + getSignerCertificates(cs)); + } else { + SubjectCodeSource scs = (SubjectCodeSource)cs; + canonCs = new SubjectCodeSource(scs.getSubject(), + scs.getPrincipals(), + scs.getLocation(), + getSignerCertificates(scs)); + } + } + } + return canonCs; + } + + /** + * Each entry in the policy configuration file is represented by a + * PolicyEntry object. <p> + * + * A PolicyEntry is a (CodeSource,Permission) pair. The + * CodeSource contains the (URL, PublicKey) that together identify + * where the Java bytecodes come from and who (if anyone) signed + * them. The URL could refer to localhost. The URL could also be + * null, meaning that this policy entry is given to all comers, as + * long as they match the signer field. The signer could be null, + * meaning the code is not signed. <p> + * + * The Permission contains the (Type, Name, Action) triplet. <p> + * + * For now, the Policy object retrieves the public key from the + * X.509 certificate on disk that corresponds to the signedBy + * alias specified in the Policy config file. For reasons of + * efficiency, the Policy object keeps a hashtable of certs already + * read in. This could be replaced by a secure internal key + * store. + * + * <p> + * For example, the entry + * <pre> + * permission java.io.File "/tmp", "read,write", + * signedBy "Duke"; + * </pre> + * is represented internally + * <pre> + * + * FilePermission f = new FilePermission("/tmp", "read,write"); + * PublicKey p = publickeys.get("Duke"); + * URL u = InetAddress.getLocalHost(); + * CodeBase c = new CodeBase( p, u ); + * pe = new PolicyEntry(f, c); + * </pre> + * + * @author Marianne Mueller + * @author Roland Schemers + * @see java.security.CodeSource + * @see java.security.Policy + * @see java.security.Permissions + * @see java.security.ProtectionDomain + */ + private static class PolicyEntry { + + CodeSource codesource; + Vector<Permission> permissions; + + /** + * Given a Permission and a CodeSource, create a policy entry. + * + * XXX Decide if/how to add validity fields and "purpose" fields to + * XXX policy entries + * + * @param cs the CodeSource, which encapsulates the URL and the public + * key attributes from the policy config file. Validity checks + * are performed on the public key before PolicyEntry is called. + * + */ + PolicyEntry(CodeSource cs) { + this.codesource = cs; + this.permissions = new Vector<Permission>(); + } + + /** + * add a Permission object to this entry. + */ + void add(Permission p) { + permissions.addElement(p); + } + + /** + * Return the CodeSource for this policy entry + */ + CodeSource getCodeSource() { + return this.codesource; + } + + @Override + public String toString(){ + StringBuffer sb = new StringBuffer(); + sb.append(rb.getString("LPARAM")); + sb.append(getCodeSource()); + sb.append("\n"); + for (int j = 0; j < permissions.size(); j++) { + Permission p = permissions.elementAt(j); + sb.append(rb.getString("SPACE")); + sb.append(rb.getString("SPACE")); + sb.append(p); + sb.append(rb.getString("NEWLINE")); + } + sb.append(rb.getString("RPARAM")); + sb.append(rb.getString("NEWLINE")); + return sb.toString(); + } + + } +} + +@SuppressWarnings("deprecation") +class PolicyPermissions extends PermissionCollection { + + private static final long serialVersionUID = -1954188373270545523L; + + private CodeSource codesource; + private Permissions perms; + private AuthPolicyFile policy; + private boolean notInit; // have we pulled in the policy permissions yet? + private Vector<Permission> additionalPerms; + + PolicyPermissions(AuthPolicyFile policy, + CodeSource codesource) + { + this.codesource = codesource; + this.policy = policy; + this.perms = null; + this.notInit = true; + this.additionalPerms = null; + } + + @Override + public void add(Permission permission) { + if (isReadOnly()) + throw new SecurityException + (AuthPolicyFile.rb.getString + ("attempt.to.add.a.Permission.to.a.readonly.PermissionCollection")); + + if (perms == null) { + if (additionalPerms == null) { + additionalPerms = new Vector<Permission>(); + } + additionalPerms.add(permission); + } else { + perms.add(permission); + } + } + + private synchronized void init() { + if (notInit) { + if (perms == null) { + perms = new Permissions(); + } + if (additionalPerms != null) { + Enumeration<Permission> e = additionalPerms.elements(); + while (e.hasMoreElements()) { + perms.add(e.nextElement()); + } + additionalPerms = null; + } + policy.getPermissions(perms, codesource); + notInit = false; + } + } + + @Override + public boolean implies(Permission permission) { + if (notInit) { + init(); + } + return perms.implies(permission); + } + + @Override + public Enumeration<Permission> elements() { + if (notInit) { + init(); + } + return perms.elements(); + } + + @Override + public String toString() { + if (notInit) { + init(); + } + return perms.toString(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/classes/sun/security/provider/ConfigFile.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,669 @@ +/* + * Copyright (c) 2000, 2013, Oracle and/or its affiliates. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.provider; + +import java.io.*; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; +import java.security.Security; +import java.security.URIParameter; +import java.text.MessageFormat; +import java.util.*; +import javax.security.auth.AuthPermission; +import javax.security.auth.login.AppConfigurationEntry; +import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag; +import javax.security.auth.login.Configuration; +import javax.security.auth.login.ConfigurationSpi; +import sun.security.util.Debug; +import sun.security.util.PropertyExpander; +import sun.security.util.ResourcesMgr; + +/** + * This class represents a default implementation for + * {@code javax.security.auth.login.Configuration}. + * + * <p> This object stores the runtime login configuration representation, + * and is the amalgamation of multiple static login configurations that + * resides in files. The algorithm for locating the login configuration + * file(s) and reading their information into this {@code Configuration} + * object is: + * + * <ol> + * <li> + * Loop through the security properties, + * <i>login.config.url.1</i>, <i>login.config.url.2</i>, ..., + * <i>login.config.url.X</i>. + * Each property value specifies a {@code URL} pointing to a + * login configuration file to be loaded. Read in and load + * each configuration. + * + * <li> + * The {@code java.lang.System} property + * <i>java.security.auth.login.config</i> + * may also be set to a {@code URL} pointing to another + * login configuration file + * (which is the case when a user uses the -D switch at runtime). + * If this property is defined, and its use is allowed by the + * security property file (the Security property, + * <i>policy.allowSystemProperty</i> is set to <i>true</i>), + * also load that login configuration. + * + * <li> + * If the <i>java.security.auth.login.config</i> property is defined using + * "==" (rather than "="), then ignore all other specified + * login configurations and only load this configuration. + * + * <li> + * If no system or security properties were set, try to read from the file, + * ${user.home}/.java.login.config, where ${user.home} is the value + * represented by the "user.home" System property. + * </ol> + * + * <p> The configuration syntax supported by this implementation + * is exactly that syntax specified in the + * {@code javax.security.auth.login.Configuration} class. + * + * @see javax.security.auth.login.LoginContext + * @see java.security.Security security properties + */ +public final class ConfigFile extends Configuration { + + private final Spi spi; + + public ConfigFile() { + spi = new Spi(); + } + + @Override + public AppConfigurationEntry[] getAppConfigurationEntry(String appName) { + return spi.engineGetAppConfigurationEntry(appName); + } + + @Override + public synchronized void refresh() { + spi.engineRefresh(); + } + + public final static class Spi extends ConfigurationSpi { + + private URL url; + private boolean expandProp = true; + private Map<String, List<AppConfigurationEntry>> configuration; + private int linenum; + private StreamTokenizer st; + private int lookahead; + + private static Debug debugConfig = Debug.getInstance("configfile"); + private static Debug debugParser = Debug.getInstance("configparser"); + + /** + * Creates a new {@code ConfigurationSpi} object. + * + * @throws SecurityException if the {@code ConfigurationSpi} can not be + * initialized + */ + public Spi() { + try { + init(); + } catch (IOException ioe) { + throw new SecurityException(ioe); + } + } + + /** + * Creates a new {@code ConfigurationSpi} object from the specified + * {@code URI}. + * + * @param uri the {@code URI} + * @throws SecurityException if the {@code ConfigurationSpi} can not be + * initialized + * @throws NullPointerException if {@code uri} is null + */ + public Spi(URI uri) { + // only load config from the specified URI + try { + url = uri.toURL(); + init(); + } catch (IOException ioe) { + throw new SecurityException(ioe); + } + } + + public Spi(final Configuration.Parameters params) throws IOException { + + // call in a doPrivileged + // + // we have already passed the Configuration.getInstance + // security check. also this class is not freely accessible + // (it is in the "sun" package). + + try { + AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() { + public Void run() throws IOException { + if (params == null) { + init(); + } else { + if (!(params instanceof URIParameter)) { + throw new IllegalArgumentException + ("Unrecognized parameter: " + params); + } + URIParameter uriParam = (URIParameter)params; + url = uriParam.getURI().toURL(); + init(); + } + return null; + } + }); + } catch (PrivilegedActionException pae) { + throw (IOException)pae.getException(); + } + + // if init() throws some other RuntimeException, + // let it percolate up naturally. + } + + /** + * Read and initialize the entire login Configuration from the + * configured URL. + * + * @throws IOException if the Configuration can not be initialized + * @throws SecurityException if the caller does not have permission + * to initialize the Configuration + */ + private void init() throws IOException { + + boolean initialized = false; + + // For policy.expandProperties, check if either a security or system + // property is set to false (old code erroneously checked the system + // prop so we must check both to preserve compatibility). + String expand = Security.getProperty("policy.expandProperties"); + if (expand == null) { + expand = System.getProperty("policy.expandProperties"); + } + if ("false".equals(expand)) { + expandProp = false; + } + + // new configuration + Map<String, List<AppConfigurationEntry>> newConfig = new HashMap<>(); + + if (url != null) { + /** + * If the caller specified a URI via Configuration.getInstance, + * we only read from that URI + */ + if (debugConfig != null) { + debugConfig.println("reading " + url); + } + init(url, newConfig); + configuration = newConfig; + return; + } + + /** + * Caller did not specify URI via Configuration.getInstance. + * Read from URLs listed in the java.security properties file. + */ + String allowSys = Security.getProperty("policy.allowSystemProperty"); + + if ("true".equalsIgnoreCase(allowSys)) { + String extra_config = System.getProperty + ("java.security.auth.login.config"); + if (extra_config != null) { + boolean overrideAll = false; + if (extra_config.startsWith("=")) { + overrideAll = true; + extra_config = extra_config.substring(1); + } + try { + extra_config = PropertyExpander.expand(extra_config); + } catch (PropertyExpander.ExpandException peee) { + throw ioException("Unable.to.properly.expand.config", + extra_config); + } + + URL configURL = null; + try { + configURL = new URL(extra_config); + } catch (MalformedURLException mue) { + File configFile = new File(extra_config); + if (configFile.exists()) { + configURL = configFile.toURI().toURL(); + } else { + throw ioException( + "extra.config.No.such.file.or.directory.", + extra_config); + } + } + + if (debugConfig != null) { + debugConfig.println("reading "+configURL); + } + init(configURL, newConfig); + initialized = true; + if (overrideAll) { + if (debugConfig != null) { + debugConfig.println("overriding other policies!"); + } + configuration = newConfig; + return; + } + } + } + + int n = 1; + String config_url; + while ((config_url = Security.getProperty + ("login.config.url."+n)) != null) { + try { + config_url = PropertyExpander.expand + (config_url).replace(File.separatorChar, '/'); + if (debugConfig != null) { + debugConfig.println("\tReading config: " + config_url); + } + init(new URL(config_url), newConfig); + initialized = true; + } catch (PropertyExpander.ExpandException peee) { + throw ioException("Unable.to.properly.expand.config", + config_url); + } + n++; + } + + if (initialized == false && n == 1 && config_url == null) { + + // get the config from the user's home directory + if (debugConfig != null) { + debugConfig.println("\tReading Policy " + + "from ~/.java.login.config"); + } + config_url = System.getProperty("user.home"); + String userConfigFile = config_url + File.separatorChar + + ".java.login.config"; + + // No longer throws an exception when there's no config file + // at all. Returns an empty Configuration instead. + if (new File(userConfigFile).exists()) { + init(new File(userConfigFile).toURI().toURL(), newConfig); + } + } + + configuration = newConfig; + } + + private void init(URL config, + Map<String, List<AppConfigurationEntry>> newConfig) + throws IOException { + + try (InputStreamReader isr + = new InputStreamReader(getInputStream(config), "UTF-8")) { + readConfig(isr, newConfig); + } catch (FileNotFoundException fnfe) { + if (debugConfig != null) { + debugConfig.println(fnfe.toString()); + } + throw new IOException(ResourcesMgr.getString + ("Configuration.Error.No.such.file.or.directory", + "sun.security.util.AuthResources")); + } + } + + /** + * Retrieve an entry from the Configuration using an application name + * as an index. + * + * @param applicationName the name used to index the Configuration. + * @return an array of AppConfigurationEntries which correspond to + * the stacked configuration of LoginModules for this + * application, or null if this application has no configured + * LoginModules. + */ + @Override + public AppConfigurationEntry[] engineGetAppConfigurationEntry + (String applicationName) { + + List<AppConfigurationEntry> list = null; + synchronized (configuration) { + list = configuration.get(applicationName); + } + + if (list == null || list.size() == 0) { + return null; + } + + AppConfigurationEntry[] entries = + new AppConfigurationEntry[list.size()]; + Iterator<AppConfigurationEntry> iterator = list.iterator(); + for (int i = 0; iterator.hasNext(); i++) { + AppConfigurationEntry e = iterator.next(); + entries[i] = new AppConfigurationEntry(e.getLoginModuleName(), + e.getControlFlag(), + e.getOptions()); + } + return entries; + } + + /** + * Refresh and reload the Configuration by re-reading all of the + * login configurations. + * + * @throws SecurityException if the caller does not have permission + * to refresh the Configuration. + */ + @Override + public synchronized void engineRefresh() { + + SecurityManager sm = System.getSecurityManager(); + if (sm != null) { + sm.checkPermission( + new AuthPermission("refreshLoginConfiguration")); + } + + AccessController.doPrivileged(new PrivilegedAction<Void>() { + public Void run() { + try { + init(); + } catch (IOException ioe) { + throw new SecurityException(ioe.getLocalizedMessage(), + ioe); + } + return null; + } + }); + } + + private void readConfig(Reader reader, + Map<String, List<AppConfigurationEntry>> newConfig) + throws IOException { + + linenum = 1; + + if (!(reader instanceof BufferedReader)) { + reader = new BufferedReader(reader); + } + + st = new StreamTokenizer(reader); + st.quoteChar('"'); + st.wordChars('$', '$'); + st.wordChars('_', '_'); + st.wordChars('-', '-'); + st.wordChars('*', '*'); + st.lowerCaseMode(false); + st.slashSlashComments(true); + st.slashStarComments(true); + st.eolIsSignificant(true); + + lookahead = nextToken(); + while (lookahead != StreamTokenizer.TT_EOF) { + parseLoginEntry(newConfig); + } + } + + private void parseLoginEntry( + Map<String, List<AppConfigurationEntry>> newConfig) + throws IOException { + + List<AppConfigurationEntry> configEntries = new LinkedList<>(); + + // application name + String appName = st.sval; + lookahead = nextToken(); + + if (debugParser != null) { + debugParser.println("\tReading next config entry: " + appName); + } + + match("{"); + + // get the modules + while (peek("}") == false) { + // get the module class name + String moduleClass = match("module class name"); + + // controlFlag (required, optional, etc) + LoginModuleControlFlag controlFlag; + String sflag = match("controlFlag").toUpperCase(); + switch (sflag) { + case "REQUIRED": + controlFlag = LoginModuleControlFlag.REQUIRED; + break; + case "REQUISITE": + controlFlag = LoginModuleControlFlag.REQUISITE; + break; + case "SUFFICIENT": + controlFlag = LoginModuleControlFlag.SUFFICIENT; + break; + case "OPTIONAL": + controlFlag = LoginModuleControlFlag.OPTIONAL; + break; + default: + throw ioException( + "Configuration.Error.Invalid.control.flag.flag", + sflag); + } + + // get the args + Map<String, String> options = new HashMap<>(); + while (peek(";") == false) { + String key = match("option key"); + match("="); + try { + options.put(key, expand(match("option value"))); + } catch (PropertyExpander.ExpandException peee) { + throw new IOException(peee.getLocalizedMessage()); + } + } + + lookahead = nextToken(); + + // create the new element + if (debugParser != null) { + debugParser.println("\t\t" + moduleClass + ", " + sflag); + for (String key : options.keySet()) { + debugParser.println("\t\t\t" + key + + "=" + options.get(key)); + } + } + configEntries.add(new AppConfigurationEntry(moduleClass, + controlFlag, + options)); + } + + match("}"); + match(";"); + + // add this configuration entry + if (newConfig.containsKey(appName)) { + throw ioException( + "Configuration.Error.Can.not.specify.multiple.entries.for.appName", + appName); + } + newConfig.put(appName, configEntries); + } + + private String match(String expect) throws IOException { + + String value = null; + + switch(lookahead) { + case StreamTokenizer.TT_EOF: + throw ioException( + "Configuration.Error.expected.expect.read.end.of.file.", + expect); + + case '"': + case StreamTokenizer.TT_WORD: + if (expect.equalsIgnoreCase("module class name") || + expect.equalsIgnoreCase("controlFlag") || + expect.equalsIgnoreCase("option key") || + expect.equalsIgnoreCase("option value")) { + value = st.sval; + lookahead = nextToken(); + } else { + throw ioException( + "Configuration.Error.Line.line.expected.expect.found.value.", + new Integer(linenum), expect, st.sval); + } + break; + + case '{': + if (expect.equalsIgnoreCase("{")) { + lookahead = nextToken(); + } else { + throw ioException( + "Configuration.Error.Line.line.expected.expect.", + new Integer(linenum), expect, st.sval); + } + break; + + case ';': + if (expect.equalsIgnoreCase(";")) { + lookahead = nextToken(); + } else { + throw ioException( + "Configuration.Error.Line.line.expected.expect.", + new Integer(linenum), expect, st.sval); + } + break; + + case '}': + if (expect.equalsIgnoreCase("}")) { + lookahead = nextToken(); + } else { + throw ioException( + "Configuration.Error.Line.line.expected.expect.", + new Integer(linenum), expect, st.sval); + } + break; + + case '=': + if (expect.equalsIgnoreCase("=")) { + lookahead = nextToken(); + } else { + throw ioException( + "Configuration.Error.Line.line.expected.expect.", + new Integer(linenum), expect, st.sval); + } + break; + + default: + throw ioException( + "Configuration.Error.Line.line.expected.expect.found.value.", + new Integer(linenum), expect, st.sval); + } + return value; + } + + private boolean peek(String expect) { + switch (lookahead) { + case ',': + return expect.equalsIgnoreCase(","); + case ';': + return expect.equalsIgnoreCase(";"); + case '{': + return expect.equalsIgnoreCase("{"); + case '}': + return expect.equalsIgnoreCase("}"); + default: + return false; + } + } + + private int nextToken() throws IOException { + int tok; + while ((tok = st.nextToken()) == StreamTokenizer.TT_EOL) { + linenum++; + } + return tok; + } + + private InputStream getInputStream(URL url) throws IOException { + if ("file".equalsIgnoreCase(url.getProtocol())) { + // Compatibility notes: + // + // Code changed from + // String path = url.getFile().replace('/', File.separatorChar); + // return new FileInputStream(path); + // + // The original implementation would search for "/tmp/a%20b" + // when url is "file:///tmp/a%20b". This is incorrect. The + // current codes fix this bug and searches for "/tmp/a b". + // For compatibility reasons, when the file "/tmp/a b" does + // not exist, the file named "/tmp/a%20b" will be tried. + // + // This also means that if both file exists, the behavior of + // this method is changed, and the current codes choose the + // correct one. + try { + return url.openStream(); + } catch (Exception e) { + String file = url.getPath(); + if (url.getHost().length() > 0) { // For Windows UNC + file = "//" + url.getHost() + file; + } + if (debugConfig != null) { + debugConfig.println("cannot read " + url + + ", try " + file); + } + return new FileInputStream(file); + } + } else { + return url.openStream(); + } + } + + private String expand(String value) + throws PropertyExpander.ExpandException, IOException { + + if (value.isEmpty()) { + return value; + } + + if (!expandProp) { + return value; + } + String s = PropertyExpander.expand(value); + if (s == null || s.length() == 0) { + throw ioException( + "Configuration.Error.Line.line.system.property.value.expanded.to.empty.value", + new Integer(linenum), value); + } + return s; + } + + private IOException ioException(String resourceKey, Object... args) { + MessageFormat form = new MessageFormat(ResourcesMgr.getString + (resourceKey, "sun.security.util.AuthResources")); + return new IOException(form.format(args)); + } + } +}
--- a/src/share/classes/sun/security/provider/ConfigSpiFile.java Tue Aug 27 13:37:38 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,693 +0,0 @@ -/* - * Copyright (c) 2000, 2012, Oracle and/or its affiliates. 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. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.security.provider; - -import java.io.*; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URL; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import java.security.Security; -import java.security.URIParameter; -import java.text.MessageFormat; -import java.util.*; -import javax.security.auth.AuthPermission; -import javax.security.auth.login.AppConfigurationEntry; -import javax.security.auth.login.Configuration; -import javax.security.auth.login.ConfigurationSpi; -import sun.security.util.Debug; -import sun.security.util.PropertyExpander; -import sun.security.util.ResourcesMgr; - -/** - * This class represents a default implementation for - * {@code javax.security.auth.login.Configuration}. - * - * <p> This object stores the runtime login configuration representation, - * and is the amalgamation of multiple static login - * configurations that resides in files. - * The algorithm for locating the login configuration file(s) and reading their - * information into this {@code Configuration} object is: - * - * <ol> - * <li> - * Loop through the security properties, - * <i>login.config.url.1</i>, <i>login.config.url.2</i>, ..., - * <i>login.config.url.X</i>. - * Each property value specifies a <code>URL</code> pointing to a - * login configuration file to be loaded. Read in and load - * each configuration. - * - * <li> - * The {@code java.lang.System} property - * <i>java.security.auth.login.config</i> - * may also be set to a {@code URL} pointing to another - * login configuration file - * (which is the case when a user uses the -D switch at runtime). - * If this property is defined, and its use is allowed by the - * security property file (the Security property, - * <i>policy.allowSystemProperty</i> is set to <i>true</i>), - * also load that login configuration. - * - * <li> - * If the <i>java.security.auth.login.config</i> property is defined using - * "==" (rather than "="), then ignore all other specified - * login configurations and only load this configuration. - * - * <li> - * If no system or security properties were set, try to read from the file, - * ${user.home}/.java.login.config, where ${user.home} is the value - * represented by the "user.home" System property. - * </ol> - * - * <p> The configuration syntax supported by this implementation - * is exactly that syntax specified in the - * {@code javax.security.auth.login.Configuration} class. - * - * @see javax.security.auth.login.LoginContext - * @see java.security.Security security properties - */ -public final class ConfigSpiFile extends ConfigurationSpi { - - private URL url; - private boolean expandProp = true; - private Map<String, List<AppConfigurationEntry>> configuration; - private int linenum; - private StreamTokenizer st; - private int lookahead; - - private static Debug debugConfig = Debug.getInstance("configfile"); - private static Debug debugParser = Debug.getInstance("configparser"); - - /** - * Create a new {@code Configuration} object. - * - * @throws SecurityException if the {@code Configuration} can not be - * initialized - */ - public ConfigSpiFile() { - try { - init(); - } catch (IOException ioe) { - throw new SecurityException(ioe); - } - } - - /** - * Create a new {@code Configuration} object from the specified {@code URI}. - * - * @param uri the {@code URI} - * @throws SecurityException if the {@code Configuration} can not be - * initialized - * @throws NullPointerException if {@code uri} is null - */ - public ConfigSpiFile(URI uri) { - // only load config from the specified URI - try { - url = uri.toURL(); - init(); - } catch (IOException ioe) { - throw new SecurityException(ioe); - } - } - - public ConfigSpiFile(final Configuration.Parameters params) - throws IOException { - - // call in a doPrivileged - // - // we have already passed the Configuration.getInstance - // security check. also this class is not freely accessible - // (it is in the "sun" package). - - try { - AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() { - public Void run() throws IOException { - if (params == null) { - init(); - } else { - if (!(params instanceof URIParameter)) { - throw new IllegalArgumentException - ("Unrecognized parameter: " + params); - } - URIParameter uriParam = (URIParameter)params; - url = uriParam.getURI().toURL(); - init(); - } - return null; - } - }); - } catch (PrivilegedActionException pae) { - throw (IOException)pae.getException(); - } - - // if init() throws some other RuntimeException, - // let it percolate up naturally. - } - - /** - * Read and initialize the entire login Configuration from the configured - * URL. - * - * @throws IOException if the Configuration can not be initialized - * @throws SecurityException if the caller does not have permission - * to initialize the Configuration - */ - private void init() throws IOException { - - boolean initialized = false; - - // For policy.expandProperties, check if either a security or system - // property is set to false (old code erroneously checked the system - // prop so we must check both to preserve compatibility). - String expand = Security.getProperty("policy.expandProperties"); - if (expand == null) { - expand = System.getProperty("policy.expandProperties"); - } - if ("false".equals(expand)) { - expandProp = false; - } - - // new configuration - Map<String, List<AppConfigurationEntry>> newConfig = new HashMap<>(); - - if (url != null) { - /** - * If the caller specified a URI via Configuration.getInstance, - * we only read from that URI - */ - if (debugConfig != null) { - debugConfig.println("reading " + url); - } - init(url, newConfig); - configuration = newConfig; - return; - } - - /** - * Caller did not specify URI via Configuration.getInstance. - * Read from URLs listed in the java.security properties file. - */ - String allowSys = Security.getProperty("policy.allowSystemProperty"); - - if ("true".equalsIgnoreCase(allowSys)) { - String extra_config = System.getProperty - ("java.security.auth.login.config"); - if (extra_config != null) { - boolean overrideAll = false; - if (extra_config.startsWith("=")) { - overrideAll = true; - extra_config = extra_config.substring(1); - } - try { - extra_config = PropertyExpander.expand(extra_config); - } catch (PropertyExpander.ExpandException peee) { - MessageFormat form = new MessageFormat - (ResourcesMgr.getString - ("Unable.to.properly.expand.config", - "sun.security.util.AuthResources")); - Object[] source = {extra_config}; - throw new IOException(form.format(source)); - } - - URL configURL = null; - try { - configURL = new URL(extra_config); - } catch (MalformedURLException mue) { - File configFile = new File(extra_config); - if (configFile.exists()) { - configURL = configFile.toURI().toURL(); - } else { - MessageFormat form = new MessageFormat - (ResourcesMgr.getString - ("extra.config.No.such.file.or.directory.", - "sun.security.util.AuthResources")); - Object[] source = {extra_config}; - throw new IOException(form.format(source)); - } - } - - if (debugConfig != null) { - debugConfig.println("reading "+configURL); - } - init(configURL, newConfig); - initialized = true; - if (overrideAll) { - if (debugConfig != null) { - debugConfig.println("overriding other policies!"); - } - configuration = newConfig; - return; - } - } - } - - int n = 1; - String config_url; - while ((config_url = Security.getProperty - ("login.config.url."+n)) != null) { - try { - config_url = PropertyExpander.expand - (config_url).replace(File.separatorChar, '/'); - if (debugConfig != null) { - debugConfig.println("\tReading config: " + config_url); - } - init(new URL(config_url), newConfig); - initialized = true; - } catch (PropertyExpander.ExpandException peee) { - MessageFormat form = new MessageFormat - (ResourcesMgr.getString - ("Unable.to.properly.expand.config", - "sun.security.util.AuthResources")); - Object[] source = {config_url}; - throw new IOException(form.format(source)); - } - n++; - } - - if (initialized == false && n == 1 && config_url == null) { - - // get the config from the user's home directory - if (debugConfig != null) { - debugConfig.println("\tReading Policy " + - "from ~/.java.login.config"); - } - config_url = System.getProperty("user.home"); - String userConfigFile = config_url + - File.separatorChar + ".java.login.config"; - - // No longer throws an exception when there's no config file - // at all. Returns an empty Configuration instead. - if (new File(userConfigFile).exists()) { - init(new File(userConfigFile).toURI().toURL(), - newConfig); - } - } - - configuration = newConfig; - } - - private void init(URL config, - Map<String, List<AppConfigurationEntry>> newConfig) - throws IOException { - - try (InputStreamReader isr - = new InputStreamReader(getInputStream(config), "UTF-8")) { - readConfig(isr, newConfig); - } catch (FileNotFoundException fnfe) { - if (debugConfig != null) { - debugConfig.println(fnfe.toString()); - } - throw new IOException(ResourcesMgr.getString - ("Configuration.Error.No.such.file.or.directory", - "sun.security.util.AuthResources")); - } - } - - /** - * Retrieve an entry from the Configuration using an application name - * as an index. - * - * @param applicationName the name used to index the Configuration. - * @return an array of AppConfigurationEntries which correspond to - * the stacked configuration of LoginModules for this - * application, or null if this application has no configured - * LoginModules. - */ - @Override - public AppConfigurationEntry[] engineGetAppConfigurationEntry - (String applicationName) { - - List<AppConfigurationEntry> list = null; - synchronized (configuration) { - list = configuration.get(applicationName); - } - - if (list == null || list.size() == 0) - return null; - - AppConfigurationEntry[] entries = - new AppConfigurationEntry[list.size()]; - Iterator<AppConfigurationEntry> iterator = list.iterator(); - for (int i = 0; iterator.hasNext(); i++) { - AppConfigurationEntry e = iterator.next(); - entries[i] = new AppConfigurationEntry(e.getLoginModuleName(), - e.getControlFlag(), - e.getOptions()); - } - return entries; - } - - /** - * Refresh and reload the Configuration by re-reading all of the - * login configurations. - * - * @throws SecurityException if the caller does not have permission - * to refresh the Configuration. - */ - @Override - public synchronized void engineRefresh() { - - SecurityManager sm = System.getSecurityManager(); - if (sm != null) - sm.checkPermission(new AuthPermission("refreshLoginConfiguration")); - - AccessController.doPrivileged(new PrivilegedAction<Void>() { - public Void run() { - try { - init(); - } catch (IOException ioe) { - throw new SecurityException(ioe.getLocalizedMessage(), ioe); - } - return null; - } - }); - } - - private void readConfig(Reader reader, - Map<String, List<AppConfigurationEntry>> newConfig) - throws IOException { - - linenum = 1; - - if (!(reader instanceof BufferedReader)) - reader = new BufferedReader(reader); - - st = new StreamTokenizer(reader); - st.quoteChar('"'); - st.wordChars('$', '$'); - st.wordChars('_', '_'); - st.wordChars('-', '-'); - st.wordChars('*', '*'); - st.lowerCaseMode(false); - st.slashSlashComments(true); - st.slashStarComments(true); - st.eolIsSignificant(true); - - lookahead = nextToken(); - while (lookahead != StreamTokenizer.TT_EOF) { - parseLoginEntry(newConfig); - } - } - - private void parseLoginEntry( - Map<String, List<AppConfigurationEntry>> newConfig) - throws IOException { - - List<AppConfigurationEntry> configEntries = new LinkedList<>(); - - // application name - String appName = st.sval; - lookahead = nextToken(); - - if (debugParser != null) { - debugParser.println("\tReading next config entry: " + appName); - } - - match("{"); - - // get the modules - while (peek("}") == false) { - // get the module class name - String moduleClass = match("module class name"); - - // controlFlag (required, optional, etc) - AppConfigurationEntry.LoginModuleControlFlag controlFlag; - String sflag = match("controlFlag").toUpperCase(); - switch (sflag) { - case "REQUIRED": - controlFlag = - AppConfigurationEntry.LoginModuleControlFlag.REQUIRED; - break; - case "REQUISITE": - controlFlag = - AppConfigurationEntry.LoginModuleControlFlag.REQUISITE; - break; - case "SUFFICIENT": - controlFlag = - AppConfigurationEntry.LoginModuleControlFlag.SUFFICIENT; - break; - case "OPTIONAL": - controlFlag = - AppConfigurationEntry.LoginModuleControlFlag.OPTIONAL; - break; - default: - MessageFormat form = new MessageFormat( - ResourcesMgr.getString - ("Configuration.Error.Invalid.control.flag.flag", - "sun.security.util.AuthResources")); - Object[] source = {sflag}; - throw new IOException(form.format(source)); - } - - // get the args - Map<String, String> options = new HashMap<>(); - while (peek(";") == false) { - String key = match("option key"); - match("="); - try { - options.put(key, expand(match("option value"))); - } catch (PropertyExpander.ExpandException peee) { - throw new IOException(peee.getLocalizedMessage()); - } - } - - lookahead = nextToken(); - - // create the new element - if (debugParser != null) { - debugParser.println("\t\t" + moduleClass + ", " + sflag); - for (String key : options.keySet()) { - debugParser.println("\t\t\t" + key + - "=" + options.get(key)); - } - } - configEntries.add(new AppConfigurationEntry(moduleClass, - controlFlag, options)); - } - - match("}"); - match(";"); - - // add this configuration entry - if (newConfig.containsKey(appName)) { - MessageFormat form = new MessageFormat(ResourcesMgr.getString - ("Configuration.Error.Can.not.specify.multiple.entries.for.appName", - "sun.security.util.AuthResources")); - Object[] source = {appName}; - throw new IOException(form.format(source)); - } - newConfig.put(appName, configEntries); - } - - private String match(String expect) throws IOException { - - String value = null; - - switch(lookahead) { - case StreamTokenizer.TT_EOF: - - MessageFormat form1 = new MessageFormat(ResourcesMgr.getString - ("Configuration.Error.expected.expect.read.end.of.file.", - "sun.security.util.AuthResources")); - Object[] source1 = {expect}; - throw new IOException(form1.format(source1)); - - case '"': - case StreamTokenizer.TT_WORD: - - if (expect.equalsIgnoreCase("module class name") || - expect.equalsIgnoreCase("controlFlag") || - expect.equalsIgnoreCase("option key") || - expect.equalsIgnoreCase("option value")) { - value = st.sval; - lookahead = nextToken(); - } else { - MessageFormat form = new MessageFormat(ResourcesMgr.getString - ("Configuration.Error.Line.line.expected.expect.found.value.", - "sun.security.util.AuthResources")); - Object[] source = {new Integer(linenum), expect, st.sval}; - throw new IOException(form.format(source)); - } - break; - - case '{': - - if (expect.equalsIgnoreCase("{")) { - lookahead = nextToken(); - } else { - MessageFormat form = new MessageFormat(ResourcesMgr.getString - ("Configuration.Error.Line.line.expected.expect.", - "sun.security.util.AuthResources")); - Object[] source = {new Integer(linenum), expect, st.sval}; - throw new IOException(form.format(source)); - } - break; - - case ';': - - if (expect.equalsIgnoreCase(";")) { - lookahead = nextToken(); - } else { - MessageFormat form = new MessageFormat(ResourcesMgr.getString - ("Configuration.Error.Line.line.expected.expect.", - "sun.security.util.AuthResources")); - Object[] source = {new Integer(linenum), expect, st.sval}; - throw new IOException(form.format(source)); - } - break; - - case '}': - - if (expect.equalsIgnoreCase("}")) { - lookahead = nextToken(); - } else { - MessageFormat form = new MessageFormat(ResourcesMgr.getString - ("Configuration.Error.Line.line.expected.expect.", - "sun.security.util.AuthResources")); - Object[] source = {new Integer(linenum), expect, st.sval}; - throw new IOException(form.format(source)); - } - break; - - case '=': - - if (expect.equalsIgnoreCase("=")) { - lookahead = nextToken(); - } else { - MessageFormat form = new MessageFormat(ResourcesMgr.getString - ("Configuration.Error.Line.line.expected.expect.", - "sun.security.util.AuthResources")); - Object[] source = {new Integer(linenum), expect, st.sval}; - throw new IOException(form.format(source)); - } - break; - - default: - MessageFormat form = new MessageFormat(ResourcesMgr.getString - ("Configuration.Error.Line.line.expected.expect.found.value.", - "sun.security.util.AuthResources")); - Object[] source = {new Integer(linenum), expect, st.sval}; - throw new IOException(form.format(source)); - } - return value; - } - - private boolean peek(String expect) { - boolean found = false; - - switch (lookahead) { - case ',': - if (expect.equalsIgnoreCase(",")) - found = true; - break; - case ';': - if (expect.equalsIgnoreCase(";")) - found = true; - break; - case '{': - if (expect.equalsIgnoreCase("{")) - found = true; - break; - case '}': - if (expect.equalsIgnoreCase("}")) - found = true; - break; - default: - } - return found; - } - - private int nextToken() throws IOException { - int tok; - while ((tok = st.nextToken()) == StreamTokenizer.TT_EOL) { - linenum++; - } - return tok; - } - - private InputStream getInputStream(URL url) throws IOException { - if ("file".equalsIgnoreCase(url.getProtocol())) { - // Compatibility notes: - // - // Code changed from - // String path = url.getFile().replace('/', File.separatorChar); - // return new FileInputStream(path); - // - // The original implementation would search for "/tmp/a%20b" - // when url is "file:///tmp/a%20b". This is incorrect. The - // current codes fix this bug and searches for "/tmp/a b". - // For compatibility reasons, when the file "/tmp/a b" does - // not exist, the file named "/tmp/a%20b" will be tried. - // - // This also means that if both file exists, the behavior of - // this method is changed, and the current codes choose the - // correct one. - try { - return url.openStream(); - } catch (Exception e) { - String file = url.getPath(); - if (url.getHost().length() > 0) { // For Windows UNC - file = "//" + url.getHost() + file; - } - if (debugConfig != null) { - debugConfig.println("cannot read " + url + - ", try " + file); - } - return new FileInputStream(file); - } - } else { - return url.openStream(); - } - } - - private String expand(String value) - throws PropertyExpander.ExpandException, IOException { - - if (value.isEmpty()) { - return value; - } - - if (expandProp) { - - String s = PropertyExpander.expand(value); - - if (s == null || s.length() == 0) { - MessageFormat form = new MessageFormat(ResourcesMgr.getString - ("Configuration.Error.Line.line.system.property.value.expanded.to.empty.value", - "sun.security.util.AuthResources")); - Object[] source = {new Integer(linenum), value}; - throw new IOException(form.format(source)); - } - return s; - } else { - return value; - } - } -}
--- a/src/share/classes/sun/security/provider/DSAPublicKey.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/security/provider/DSAPublicKey.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. 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 @@ -37,6 +37,7 @@ import sun.security.x509.X509Key; import sun.security.x509.AlgIdDSA; +import sun.security.util.BitArray; import sun.security.util.Debug; import sun.security.util.DerValue; import sun.security.util.DerInputStream; @@ -88,8 +89,9 @@ algid = new AlgIdDSA(p, q, g); try { - key = new DerValue(DerValue.tag_Integer, + byte[] keyArray = new DerValue(DerValue.tag_Integer, y.toByteArray()).toByteArray(); + setKey(new BitArray(keyArray.length*8, keyArray)); encode(); } catch (IOException e) { throw new InvalidKeyException("could not DER encode y: " + @@ -142,7 +144,7 @@ protected void parseKeyBits() throws InvalidKeyException { try { - DerInputStream in = new DerInputStream(key); + DerInputStream in = new DerInputStream(getKey().toByteArray()); y = in.getBigInteger(); } catch (IOException e) { throw new InvalidKeyException("Invalid key: y value\n" +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/classes/sun/security/provider/SubjectCodeSource.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,401 @@ +/* + * Copyright (c) 1999, 2013, Oracle and/or its affiliates. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.provider; + +import java.net.URL; +import java.util.*; +import java.security.CodeSource; +import java.security.Principal; +import java.security.cert.Certificate; +import java.lang.reflect.Constructor; + +import javax.security.auth.Subject; +import sun.security.provider.PolicyParser.PrincipalEntry; + +/** + * <p> This <code>SubjectCodeSource</code> class contains + * a <code>URL</code>, signer certificates, and either a <code>Subject</code> + * (that represents the <code>Subject</code> in the current + * <code>AccessControlContext</code>), or a linked list of Principals + * (that represent a "subject" in a <code>Policy</code>). + * + */ +class SubjectCodeSource extends CodeSource implements java.io.Serializable { + + private static final long serialVersionUID = 6039418085604715275L; + + private static final java.util.ResourceBundle rb = + java.security.AccessController.doPrivileged + (new java.security.PrivilegedAction<java.util.ResourceBundle>() { + public java.util.ResourceBundle run() { + return (java.util.ResourceBundle.getBundle + ("sun.security.util.AuthResources")); + } + }); + + private Subject subject; + private LinkedList<PrincipalEntry> principals; + private static final Class[] PARAMS = { String.class }; + private static final sun.security.util.Debug debug = + sun.security.util.Debug.getInstance("auth", "\t[Auth Access]"); + private ClassLoader sysClassLoader; + + /** + * Creates a new <code>SubjectCodeSource</code> + * with the given <code>Subject</code>, principals, <code>URL</code>, + * and signers (Certificates). The <code>Subject</code> + * represents the <code>Subject</code> associated with the current + * <code>AccessControlContext</code>. + * The Principals are given as a <code>LinkedList</code> + * of <code>PolicyParser.PrincipalEntry</code> objects. + * Typically either a <code>Subject</code> will be provided, + * or a list of <code>principals</code> will be provided + * (not both). + * + * <p> + * + * @param subject the <code>Subject</code> associated with this + * <code>SubjectCodeSource</code> <p> + * + * @param url the <code>URL</code> associated with this + * <code>SubjectCodeSource</code> <p> + * + * @param certs the signers associated with this + * <code>SubjectCodeSource</code> <p> + */ + SubjectCodeSource(Subject subject, + LinkedList<PrincipalEntry> principals, + URL url, Certificate[] certs) { + + super(url, certs); + this.subject = subject; + this.principals = (principals == null ? + new LinkedList<PrincipalEntry>() : + new LinkedList<PrincipalEntry>(principals)); + sysClassLoader = java.security.AccessController.doPrivileged + (new java.security.PrivilegedAction<ClassLoader>() { + public ClassLoader run() { + return ClassLoader.getSystemClassLoader(); + } + }); + } + + /** + * Get the Principals associated with this <code>SubjectCodeSource</code>. + * The Principals are retrieved as a <code>LinkedList</code> + * of <code>PolicyParser.PrincipalEntry</code> objects. + * + * <p> + * + * @return the Principals associated with this + * <code>SubjectCodeSource</code> as a <code>LinkedList</code> + * of <code>PolicyParser.PrincipalEntry</code> objects. + */ + LinkedList<PrincipalEntry> getPrincipals() { + return principals; + } + + /** + * Get the <code>Subject</code> associated with this + * <code>SubjectCodeSource</code>. The <code>Subject</code> + * represents the <code>Subject</code> associated with the + * current <code>AccessControlContext</code>. + * + * <p> + * + * @return the <code>Subject</code> associated with this + * <code>SubjectCodeSource</code>. + */ + Subject getSubject() { + return subject; + } + + /** + * Returns true if this <code>SubjectCodeSource</code> object "implies" + * the specified <code>CodeSource</code>. + * More specifically, this method makes the following checks. + * If any fail, it returns false. If they all succeed, it returns true. + * + * <p> + * <ol> + * <li> The provided codesource must not be <code>null</code>. + * <li> codesource must be an instance of <code>SubjectCodeSource</code>. + * <li> super.implies(codesource) must return true. + * <li> for each principal in this codesource's principal list: + * <ol> + * <li> if the principal is an instanceof + * <code>Principal</code>, then the principal must + * imply the provided codesource's <code>Subject</code>. + * <li> if the principal is not an instanceof + * <code>Principal</code>, then the provided + * codesource's <code>Subject</code> must have an + * associated <code>Principal</code>, <i>P</i>, where + * P.getClass().getName equals principal.principalClass, + * and P.getName() equals principal.principalName. + * </ol> + * </ol> + * + * <p> + * + * @param codesource the <code>CodeSource</code> to compare against. + * + * @return true if this <code>SubjectCodeSource</code> implies the + * the specified <code>CodeSource</code>. + */ + public boolean implies(CodeSource codesource) { + + LinkedList<PrincipalEntry> subjectList = null; + + if (codesource == null || + !(codesource instanceof SubjectCodeSource) || + !(super.implies(codesource))) { + + if (debug != null) + debug.println("\tSubjectCodeSource.implies: FAILURE 1"); + return false; + } + + SubjectCodeSource that = (SubjectCodeSource)codesource; + + // if the principal list in the policy "implies" + // the Subject associated with the current AccessControlContext, + // then return true + + if (this.principals == null) { + if (debug != null) + debug.println("\tSubjectCodeSource.implies: PASS 1"); + return true; + } + + if (that.getSubject() == null || + that.getSubject().getPrincipals().size() == 0) { + if (debug != null) + debug.println("\tSubjectCodeSource.implies: FAILURE 2"); + return false; + } + + ListIterator<PrincipalEntry> li = this.principals.listIterator(0); + while (li.hasNext()) { + PrincipalEntry pppe = li.next(); + try { + + // use new Principal.implies method + + Class<?> pClass = Class.forName(pppe.principalClass, + true, sysClassLoader); + if (!Principal.class.isAssignableFrom(pClass)) { + // not the right subtype + throw new ClassCastException(pppe.principalClass + + " is not a Principal"); + } + Constructor<?> c = pClass.getConstructor(PARAMS); + Principal p = (Principal)c.newInstance(new Object[] { + pppe.principalName }); + + if (!p.implies(that.getSubject())) { + if (debug != null) + debug.println("\tSubjectCodeSource.implies: FAILURE 3"); + return false; + } else { + if (debug != null) + debug.println("\tSubjectCodeSource.implies: PASS 2"); + return true; + } + } catch (Exception e) { + + // simply compare Principals + + if (subjectList == null) { + + if (that.getSubject() == null) { + if (debug != null) + debug.println("\tSubjectCodeSource.implies: " + + "FAILURE 4"); + return false; + } + Iterator<Principal> i = + that.getSubject().getPrincipals().iterator(); + + subjectList = new LinkedList<PrincipalEntry>(); + while (i.hasNext()) { + Principal p = i.next(); + PrincipalEntry spppe = new PrincipalEntry + (p.getClass().getName(), p.getName()); + subjectList.add(spppe); + } + } + + if (!subjectListImpliesPrincipalEntry(subjectList, pppe)) { + if (debug != null) + debug.println("\tSubjectCodeSource.implies: FAILURE 5"); + return false; + } + } + } + + if (debug != null) + debug.println("\tSubjectCodeSource.implies: PASS 3"); + return true; + } + + /** + * This method returns, true, if the provided <i>subjectList</i> + * "contains" the <code>Principal</code> specified + * in the provided <i>pppe</i> argument. + * + * Note that the provided <i>pppe</i> argument may have + * wildcards (*) for the <code>Principal</code> class and name, + * which need to be considered. + * + * <p> + * + * @param subjectList a list of PolicyParser.PrincipalEntry objects + * that correspond to all the Principals in the Subject currently + * on this thread's AccessControlContext. <p> + * + * @param pppe the Principals specified in a grant entry. + * + * @return true if the provided <i>subjectList</i> "contains" + * the <code>Principal</code> specified in the provided + * <i>pppe</i> argument. + */ + private boolean subjectListImpliesPrincipalEntry( + LinkedList<PrincipalEntry> subjectList, PrincipalEntry pppe) { + + ListIterator<PrincipalEntry> li = subjectList.listIterator(0); + while (li.hasNext()) { + PrincipalEntry listPppe = li.next(); + + if (pppe.getPrincipalClass().equals + (PrincipalEntry.WILDCARD_CLASS) || + pppe.getPrincipalClass().equals(listPppe.getPrincipalClass())) + { + if (pppe.getPrincipalName().equals + (PrincipalEntry.WILDCARD_NAME) || + pppe.getPrincipalName().equals(listPppe.getPrincipalName())) + return true; + } + } + return false; + } + + /** + * Tests for equality between the specified object and this + * object. Two <code>SubjectCodeSource</code> objects are considered equal + * if their locations are of identical value, if the two sets of + * Certificates are of identical values, and if the + * Subjects are equal, and if the PolicyParser.PrincipalEntry values + * are of identical values. It is not required that + * the Certificates or PolicyParser.PrincipalEntry values + * be in the same order. + * + * <p> + * + * @param obj the object to test for equality with this object. + * + * @return true if the objects are considered equal, false otherwise. + */ + public boolean equals(Object obj) { + + if (obj == this) + return true; + + if (super.equals(obj) == false) + return false; + + if (!(obj instanceof SubjectCodeSource)) + return false; + + SubjectCodeSource that = (SubjectCodeSource)obj; + + // the principal lists must match + try { + if (this.getSubject() != that.getSubject()) + return false; + } catch (SecurityException se) { + return false; + } + + if ((this.principals == null && that.principals != null) || + (this.principals != null && that.principals == null)) + return false; + + if (this.principals != null && that.principals != null) { + if (!this.principals.containsAll(that.principals) || + !that.principals.containsAll(this.principals)) + + return false; + } + + return true; + } + + /** + * Return a hashcode for this <code>SubjectCodeSource</code>. + * + * <p> + * + * @return a hashcode for this <code>SubjectCodeSource</code>. + */ + public int hashCode() { + return super.hashCode(); + } + + /** + * Return a String representation of this <code>SubjectCodeSource</code>. + * + * <p> + * + * @return a String representation of this <code>SubjectCodeSource</code>. + */ + public String toString() { + String returnMe = super.toString(); + if (getSubject() != null) { + if (debug != null) { + final Subject finalSubject = getSubject(); + returnMe = returnMe + "\n" + + java.security.AccessController.doPrivileged + (new java.security.PrivilegedAction<String>() { + public String run() { + return finalSubject.toString(); + } + }); + } else { + returnMe = returnMe + "\n" + getSubject().toString(); + } + } + if (principals != null) { + ListIterator<PrincipalEntry> li = principals.listIterator(); + while (li.hasNext()) { + PrincipalEntry pppe = li.next(); + returnMe = returnMe + rb.getString("NEWLINE") + + pppe.getPrincipalClass() + " " + + pppe.getPrincipalName(); + } + } + return returnMe; + } +}
--- a/src/share/classes/sun/security/provider/SunEntries.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/security/provider/SunEntries.java Tue Aug 27 21:46:00 2013 -0700 @@ -242,7 +242,7 @@ * Configuration */ map.put("Configuration.JavaLoginConfig", - "sun.security.provider.ConfigSpiFile"); + "sun.security.provider.ConfigFile$Spi"); /* * CertPathBuilder
--- a/src/share/classes/sun/security/rsa/RSAPadding.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/security/rsa/RSAPadding.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2013 Oracle and/or its affiliates. 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 @@ -458,7 +458,7 @@ private void mgf1(byte[] seed, int seedOfs, int seedLen, byte[] out, int outOfs, int maskLen) throws BadPaddingException { byte[] C = new byte[4]; // 32 bit counter - byte[] digest = new byte[20]; // 20 bytes is length of SHA-1 digest + byte[] digest = new byte[mgfMd.getDigestLength()]; while (maskLen > 0) { mgfMd.update(seed, seedOfs, seedLen); mgfMd.update(C);
--- a/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/security/rsa/RSAPublicKeyImpl.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. 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 @@ -67,9 +67,10 @@ DerOutputStream out = new DerOutputStream(); out.putInteger(n); out.putInteger(e); - DerValue val = - new DerValue(DerValue.tag_Sequence, out.toByteArray()); - key = val.toByteArray(); + byte[] keyArray = + new DerValue(DerValue.tag_Sequence, + out.toByteArray()).toByteArray(); + setKey(new BitArray(keyArray.length*8, keyArray)); } catch (IOException exc) { // should never occur throw new InvalidKeyException(exc); @@ -104,7 +105,7 @@ */ protected void parseKeyBits() throws InvalidKeyException { try { - DerInputStream in = new DerInputStream(key); + DerInputStream in = new DerInputStream(getKey().toByteArray()); DerValue derValue = in.getDerValue(); if (derValue.tag != DerValue.tag_Sequence) { throw new IOException("Not a SEQUENCE");
--- a/src/share/classes/sun/security/rsa/RSASignature.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/security/rsa/RSASignature.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. 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 @@ -244,12 +244,14 @@ } // set parameter, not supported. See JCA doc + @Deprecated protected void engineSetParameter(String param, Object value) throws InvalidParameterException { throw new UnsupportedOperationException("setParameter() not supported"); } // get parameter, not supported. See JCA doc + @Deprecated protected Object engineGetParameter(String param) throws InvalidParameterException { throw new UnsupportedOperationException("getParameter() not supported");
--- a/src/share/classes/sun/security/ssl/KerberosClientKeyExchange.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/security/ssl/KerberosClientKeyExchange.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. 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 @@ -57,7 +57,8 @@ private final KerberosClientKeyExchange impl = createImpl(); private KerberosClientKeyExchange createImpl() { - if (getClass() == KerberosClientKeyExchange.class) { + if (implClass != null && + getClass() == KerberosClientKeyExchange.class) { try { return (KerberosClientKeyExchange)implClass.newInstance(); } catch (InstantiationException e) { @@ -69,8 +70,11 @@ return null; } - public KerberosClientKeyExchange() { - // empty + // This constructor will be called when constructing an instance of its + // subclass -- KerberosClientKeyExchangeImpl. Please won't check the + // value of impl variable in this constructor. + protected KerberosClientKeyExchange() { + // please won't check the value of impl variable } public KerberosClientKeyExchange(String serverName, boolean isLoopback, @@ -85,8 +89,9 @@ } public KerberosClientKeyExchange(ProtocolVersion protocolVersion, - ProtocolVersion clientVersion, SecureRandom rand, - HandshakeInStream input, AccessControlContext acc, Object serverKeys) throws IOException { + ProtocolVersion clientVersion, SecureRandom rand, + HandshakeInStream input, AccessControlContext acc, + Object serverKeys) throws IOException { if (impl != null) { init(protocolVersion, clientVersion, rand, input, acc, serverKeys); @@ -101,7 +106,7 @@ } @Override - public int messageLength() { + public int messageLength() { return impl.messageLength(); } @@ -125,11 +130,13 @@ } public void init(ProtocolVersion protocolVersion, - ProtocolVersion clientVersion, SecureRandom rand, - HandshakeInStream input, AccessControlContext acc, Object ServiceCreds) throws IOException { + ProtocolVersion clientVersion, SecureRandom rand, + HandshakeInStream input, AccessControlContext acc, + Object ServiceCreds) throws IOException { if (impl != null) { - impl.init(protocolVersion, clientVersion, rand, input, acc, ServiceCreds); + impl.init(protocolVersion, clientVersion, + rand, input, acc, ServiceCreds); } }
--- a/src/share/classes/sun/security/x509/AlgIdDSA.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/security/x509/AlgIdDSA.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. 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 @@ -96,7 +96,7 @@ * Default constructor. The OID and parameters must be * deserialized before this algorithm ID is used. */ - // XXX deprecated for general use + @Deprecated public AlgIdDSA () {} AlgIdDSA (DerValue val) throws IOException
--- a/src/share/classes/sun/security/x509/X509Key.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/security/x509/X509Key.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2013, Oracle and/or its affiliates. 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 @@ -79,6 +79,7 @@ * Added to keep the byte[] key form consistent with the BitArray * form. Can de deleted when byte[] key is deleted. */ + @Deprecated private int unusedBits = 0; /* BitArray form of key */
--- a/src/share/classes/sun/text/resources/FormatData.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/text/resources/FormatData.java Tue Aug 27 21:46:00 2013 -0700 @@ -858,6 +858,9 @@ } }, { "DateTimePatternChars", "GyMdkHmsSEDFwWahKzZ" }, + + // Workaround for islamic-umalqura name support (JDK-8015986) + { "calendarname.islamic-umalqura", "Islamic Umm al-Qura Calendar" }, }; } }
--- a/src/share/classes/sun/text/resources/ar/FormatData_ar.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/text/resources/ar/FormatData_ar.java Tue Aug 27 21:46:00 2013 -0700 @@ -264,6 +264,10 @@ } }, { "DateTimePatternChars", "GanjkHmsSEDFwWxhKzZ" }, + + // Workaround for islamic-umalqura name support (JDK-8015986) + { "calendarname.islamic-umalqura", + "\u0644\u062a\u0642\u0648\u064a\u0645 \u0627\u0644\u0647\u062c\u0631\u064a\u060c \u0623\u0645 \u0627\u0644\u0642\u0631\u0649" }, }; } }
--- a/src/share/classes/sun/tools/jar/Main.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/tools/jar/Main.java Tue Aug 27 21:46:00 2013 -0700 @@ -47,7 +47,7 @@ class Main { String program; PrintStream out, err; - String fname, mname, ename, pname; + String fname, mname, ename; String zname = ""; String[] files; String rootjar = null; @@ -78,9 +78,6 @@ static final String MANIFEST_DIR = "META-INF/"; static final String VERSION = "1.0"; - // valid values for Profile attribute - private static final String[] PROFILES = { "compact1", "compact2", "compact3" }; - private static ResourceBundle rsrc; /** @@ -187,14 +184,6 @@ if (ename != null) { addMainClass(manifest, ename); } - if (pname != null) { - if (!addProfileName(manifest, pname)) { - if (in != null) { - in.close(); - } - return false; - } - } } OutputStream out; if (fname != null) { @@ -372,9 +361,6 @@ case 'e': ename = args[count++]; break; - case 'p': - pname = args[count++]; - break; default: error(formatMsg("error.illegal.option", String.valueOf(flags.charAt(i)))); @@ -424,7 +410,7 @@ usageError(); return false; } else if (uflag) { - if ((mname != null) || (ename != null) || (pname != null)) { + if ((mname != null) || (ename != null)) { /* just want to update the manifest */ return true; } else { @@ -558,7 +544,7 @@ || (Mflag && isManifestEntry)) { continue; } else if (isManifestEntry && ((newManifest != null) || - (ename != null) || (pname != null))) { + (ename != null))) { foundManifest = true; if (newManifest != null) { // Don't read from the newManifest InputStream, as we @@ -616,7 +602,7 @@ updateOk = false; } } - } else if (ename != null || pname != null) { + } else if (ename != null) { if (!updateManifest(new Manifest(), zos)) { updateOk = false; } @@ -651,11 +637,6 @@ if (ename != null) { addMainClass(m, ename); } - if (pname != null) { - if (!addProfileName(m, pname)) { - return false; - } - } ZipEntry e = new ZipEntry(MANIFEST_NAME); e.setTime(System.currentTimeMillis()); if (flag0) { @@ -713,28 +694,6 @@ global.put(Attributes.Name.MAIN_CLASS, mainApp); } - private boolean addProfileName(Manifest m, String profile) { - // check profile name - boolean found = false; - int i = 0; - while (i < PROFILES.length) { - if (profile.equals(PROFILES[i])) { - found = true; - break; - } - i++; - } - if (!found) { - error(formatMsg("error.bad.pvalue", profile)); - return false; - } - - // overrides any existing Profile attribute - Attributes global = m.getMainAttributes(); - global.put(Attributes.Name.PROFILE, profile); - return true; - } - private boolean isAmbiguousMainClass(Manifest m) { if (ename != null) { Attributes global = m.getMainAttributes();
--- a/src/share/classes/sun/tools/jar/resources/jar.properties Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/tools/jar/resources/jar.properties Tue Aug 27 21:46:00 2013 -0700 @@ -36,8 +36,6 @@ error.bad.eflag=\ 'e' flag and manifest with the 'Main-Class' attribute cannot be specified \n\ together! -error.bad.pvalue=\ - bad value for 'Profile' attribute: {0} error.nosuch.fileordir=\ {0} : no such file or directory error.write.file=\ @@ -79,7 +77,6 @@ \ \ -m include manifest information from specified manifest file\n\ \ \ -e specify application entry point for stand-alone application \n\ \ \ bundled into an executable jar file\n\ -\ \ -p specify profile name\n\ \ \ -0 store only; use no ZIP compression\n\ \ \ -M do not create a manifest file for the entries\n\ \ \ -i generate index information for the specified jar files\n\
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/classes/sun/tools/jconsole/ExceptionSafePlugin.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package sun.tools.jconsole; + +import java.util.HashMap; +import java.util.Map; + +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.SwingWorker; + +import com.sun.tools.jconsole.JConsolePlugin; + +/** + * Proxy that shields GUI from plug-in exceptions. + * + */ +final class ExceptionSafePlugin extends JConsolePlugin { + + private static boolean ignoreExceptions; + private final JConsolePlugin plugin; + + public ExceptionSafePlugin(JConsolePlugin plugin) { + this.plugin = plugin; + } + + @Override + public Map<String, JPanel> getTabs() { + try { + return plugin.getTabs(); + } catch (RuntimeException e) { + handleException(e); + } + return new HashMap<>(); + } + + @Override + public SwingWorker<?, ?> newSwingWorker() { + try { + return plugin.newSwingWorker(); + } catch (RuntimeException e) { + handleException(e); + } + return null; + } + + @Override + public void dispose() { + try { + plugin.dispose(); + } catch (RuntimeException e) { + handleException(e); + } + } + + public void executeSwingWorker(SwingWorker<?, ?> sw) { + try { + sw.execute(); + } catch (RuntimeException e) { + handleException(e); + } + } + + private void handleException(Exception e) { + if (JConsole.isDebug()) { + System.err.println("Plug-in exception:"); + e.printStackTrace(); + } else { + if (!ignoreExceptions) { + showExceptionDialog(e); + } + } + } + + private void showExceptionDialog(Exception e) { + Object[] buttonTexts = { + Messages.PLUGIN_EXCEPTION_DIALOG_BUTTON_OK, + Messages.PLUGIN_EXCEPTION_DIALOG_BUTTON_EXIT, + Messages.PLUGIN_EXCEPTION_DIALOG_BUTTON_IGNORE + }; + + String message = String.format( + Messages.PLUGIN_EXCEPTION_DIALOG_MESSAGE, + plugin.getClass().getSimpleName(), + String.valueOf(e.getMessage()) + ); + + int buttonIndex = JOptionPane.showOptionDialog( + null, + message, + Messages.PLUGIN_EXCEPTION_DIALOG_TITLE, + JOptionPane.YES_NO_CANCEL_OPTION, + JOptionPane.ERROR_MESSAGE, + null, + buttonTexts, + buttonTexts[0] + ); + + if (buttonIndex == 1) { + System.exit(0); + } + ignoreExceptions = buttonIndex == 2; + } +}
--- a/src/share/classes/sun/tools/jconsole/MemoryTab.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/tools/jconsole/MemoryTab.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2013, Oracle and/or its affiliates. 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 @@ -228,6 +228,7 @@ if (ev.getStateChange() == ItemEvent.SELECTED) { Plotter plotter = (Plotter)plotterChoice.getSelectedItem(); plotterPanel.setPlotter(plotter); + plotterPanel.repaint(); } }
--- a/src/share/classes/sun/tools/jconsole/Messages.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/tools/jconsole/Messages.java Tue Aug 27 21:46:00 2013 -0700 @@ -240,6 +240,11 @@ public static String PLOTTER_ACCESSIBLE_NAME_NO_DATA; public static String PLOTTER_SAVE_AS_MENU_ITEM; public static String PLOTTER_TIME_RANGE_MENU; + public static String PLUGIN_EXCEPTION_DIALOG_BUTTON_EXIT; + public static String PLUGIN_EXCEPTION_DIALOG_BUTTON_IGNORE; + public static String PLUGIN_EXCEPTION_DIALOG_BUTTON_OK; + public static String PLUGIN_EXCEPTION_DIALOG_MESSAGE; + public static String PLUGIN_EXCEPTION_DIALOG_TITLE; public static String PROBLEM_ADDING_LISTENER; public static String PROBLEM_DISPLAYING_MBEAN; public static String PROBLEM_INVOKING;
--- a/src/share/classes/sun/tools/jconsole/VMPanel.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/tools/jconsole/VMPanel.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2013, Oracle and/or its affiliates. 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 @@ -71,7 +71,7 @@ // Each VMPanel has its own instance of the JConsolePlugin // A map of JConsolePlugin to the previous SwingWorker - private Map<JConsolePlugin, SwingWorker<?, ?>> plugins = null; + private Map<ExceptionSafePlugin, SwingWorker<?, ?>> plugins = null; private boolean pluginTabsAdded = false; // Update these only on the EDT @@ -107,10 +107,10 @@ } } - plugins = new LinkedHashMap<JConsolePlugin, SwingWorker<?, ?>>(); + plugins = new LinkedHashMap<ExceptionSafePlugin, SwingWorker<?, ?>>(); for (JConsolePlugin p : JConsole.getPlugins()) { p.setContext(proxyClient); - plugins.put(p, null); + plugins.put(new ExceptionSafePlugin(p), null); } Utilities.updateTransparency(this); @@ -566,7 +566,7 @@ } // plugin GUI update - for (JConsolePlugin p : plugins.keySet()) { + for (ExceptionSafePlugin p : plugins.keySet()) { SwingWorker<?, ?> sw = p.newSwingWorker(); SwingWorker<?, ?> prevSW = plugins.get(p); // schedule SwingWorker to run only if the previous @@ -575,7 +575,7 @@ if (sw == null || sw.getState() == SwingWorker.StateValue.PENDING) { plugins.put(p, sw); if (sw != null) { - sw.execute(); + p.executeSwingWorker(sw); } } }
--- a/src/share/classes/sun/tools/jconsole/resources/messages.properties Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/tools/jconsole/resources/messages.properties Tue Aug 27 21:46:00 2013 -0700 @@ -137,14 +137,14 @@ MBEANS=MBeans MBEANS_TAB_CLEAR_NOTIFICATIONS_BUTTON=&Clear MBEANS_TAB_CLEAR_NOTIFICATIONS_BUTTON_TOOLTIP=Clear notifications -MBEANS_TAB_COMPOSITE_NAVIGATION_MULTIPLE=Composite Navigation {0}/{1} -MBEANS_TAB_COMPOSITE_NAVIGATION_SINGLE=Composite Navigation +MBEANS_TAB_COMPOSITE_NAVIGATION_MULTIPLE=Composite Data Navigation {0}/{1} +MBEANS_TAB_COMPOSITE_NAVIGATION_SINGLE=Composite Data Navigation MBEANS_TAB_REFRESH_ATTRIBUTES_BUTTON=&Refresh MBEANS_TAB_REFRESH_ATTRIBUTES_BUTTON_TOOLTIP=Refresh attributes MBEANS_TAB_SUBSCRIBE_NOTIFICATIONS_BUTTON=&Subscribe MBEANS_TAB_SUBSCRIBE_NOTIFICATIONS_BUTTON_TOOLTIP=Start listening for notifications -MBEANS_TAB_TABULAR_NAVIGATION_MULTIPLE=Tabular Navigation {0}/{1} -MBEANS_TAB_TABULAR_NAVIGATION_SINGLE=Tabular Navigation +MBEANS_TAB_TABULAR_NAVIGATION_MULTIPLE=Tabular Data Navigation {0}/{1} +MBEANS_TAB_TABULAR_NAVIGATION_SINGLE=Tabular Data Navigation MBEANS_TAB_UNSUBSCRIBE_NOTIFICATIONS_BUTTON=&Unsubscribe MBEANS_TAB_UNSUBSCRIBE_NOTIFICATIONS_BUTTON_TOOLTIP=Stop listening for notifications MANAGE_HOTSPOT_MBEANS_IN_COLON_=Manage Hotspot MBeans in: @@ -198,6 +198,11 @@ PLOTTER_ACCESSIBLE_NAME_NO_DATA=No data plotted. PLOTTER_SAVE_AS_MENU_ITEM=Save data &as... PLOTTER_TIME_RANGE_MENU=&Time Range +PLUGIN_EXCEPTION_DIALOG_BUTTON_EXIT=Exit +PLUGIN_EXCEPTION_DIALOG_BUTTON_IGNORE=Ignore +PLUGIN_EXCEPTION_DIALOG_BUTTON_OK=OK +PLUGIN_EXCEPTION_DIALOG_MESSAGE=An unexpected exception has occurred in %s:\n\n%s\n\nStart with -debug for details. Ignore will suppress further exceptions. +PLUGIN_EXCEPTION_DIALOG_TITLE=Plug-in exception PROBLEM_ADDING_LISTENER=Problem adding listener PROBLEM_DISPLAYING_MBEAN=Problem displaying MBean PROBLEM_INVOKING=Problem invoking
--- a/src/share/classes/sun/util/resources/lv/CurrencyNames_lv_LV.properties Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/classes/sun/util/resources/lv/CurrencyNames_lv_LV.properties Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2013, Oracle and/or its affiliates. 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 @@ -35,4 +35,5 @@ # This notice and attribution to Taligent may not be removed. # Taligent is a registered trademark of Taligent, Inc. +EUR=\u20AC LVL=Ls
--- a/src/share/lib/security/java.security-linux Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/lib/security/java.security-linux Tue Aug 27 21:46:00 2013 -0700 @@ -132,7 +132,7 @@ # Class to instantiate as the javax.security.auth.login.Configuration # provider. # -login.configuration.provider=com.sun.security.auth.login.ConfigFile +login.configuration.provider=sun.security.provider.ConfigFile # # Default login configuration file
--- a/src/share/lib/security/java.security-macosx Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/lib/security/java.security-macosx Tue Aug 27 21:46:00 2013 -0700 @@ -133,7 +133,7 @@ # Class to instantiate as the javax.security.auth.login.Configuration # provider. # -login.configuration.provider=com.sun.security.auth.login.ConfigFile +login.configuration.provider=sun.security.provider.ConfigFile # # Default login configuration file
--- a/src/share/lib/security/java.security-solaris Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/lib/security/java.security-solaris Tue Aug 27 21:46:00 2013 -0700 @@ -134,7 +134,7 @@ # Class to instantiate as the javax.security.auth.login.Configuration # provider. # -login.configuration.provider=com.sun.security.auth.login.ConfigFile +login.configuration.provider=sun.security.provider.ConfigFile # # Default login configuration file
--- a/src/share/lib/security/java.security-windows Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/lib/security/java.security-windows Tue Aug 27 21:46:00 2013 -0700 @@ -133,7 +133,7 @@ # Class to instantiate as the javax.security.auth.login.Configuration # provider. # -login.configuration.provider=com.sun.security.auth.login.ConfigFile +login.configuration.provider=sun.security.provider.ConfigFile # # Default login configuration file
--- a/src/share/native/java/io/RandomAccessFile.c Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/native/java/io/RandomAccessFile.c Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, Oracle and/or its affiliates. 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 @@ -123,7 +123,7 @@ } JNIEXPORT void JNICALL -Java_java_io_RandomAccessFile_seek(JNIEnv *env, +Java_java_io_RandomAccessFile_seek0(JNIEnv *env, jobject this, jlong pos) { FD fd;
--- a/src/share/native/sun/font/sunFont.c Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/native/sun/font/sunFont.c Tue Aug 27 21:46:00 2013 -0700 @@ -71,13 +71,17 @@ void initLCDGammaTables(); /* placeholder for extern variable */ +static int initialisedFontIDs = 0; FontManagerNativeIDs sunFontIDs; -JNIEXPORT void JNICALL -Java_sun_font_SunFontManager_initIDs - (JNIEnv *env, jclass cls) { +static void initFontIDs(JNIEnv *env) { + + jclass tmpClass; - jclass tmpClass = (*env)->FindClass(env, "sun/font/TrueTypeFont"); + if (initialisedFontIDs) { + return; + } + tmpClass = (*env)->FindClass(env, "sun/font/TrueTypeFont"); sunFontIDs.ttReadBlockMID = (*env)->GetMethodID(env, tmpClass, "readBlock", "(Ljava/nio/ByteBuffer;II)I"); @@ -173,9 +177,20 @@ (*env)->GetFieldID(env, tmpClass, "lcdSubPixPos", "Z"); initLCDGammaTables(); + + initialisedFontIDs = 1; } -JNIEXPORT FontManagerNativeIDs getSunFontIDs() { +JNIEXPORT void JNICALL +Java_sun_font_SunFontManager_initIDs + (JNIEnv *env, jclass cls) { + + initFontIDs(env); +} + +JNIEXPORT FontManagerNativeIDs getSunFontIDs(JNIEnv *env) { + + initFontIDs(env); return sunFontIDs; }
--- a/src/share/native/sun/font/sunfontids.h Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/native/sun/font/sunfontids.h Tue Aug 27 21:46:00 2013 -0700 @@ -84,7 +84,7 @@ /* Note: we share variable in the context of fontmanager lib but we need access method to use it from separate rasterizer lib */ extern FontManagerNativeIDs sunFontIDs; -JNIEXPORT FontManagerNativeIDs getSunFontIDs(); +JNIEXPORT FontManagerNativeIDs getSunFontIDs(JNIEnv* env); #ifdef __cplusplus }
--- a/src/share/native/sun/security/krb5/nativeccache.c Tue Aug 27 13:37:38 2013 +0400 +++ b/src/share/native/sun/security/krb5/nativeccache.c Tue Aug 27 21:46:00 2013 -0700 @@ -264,13 +264,21 @@ } +int isIn(krb5_enctype e, int n, jint* etypes) +{ + int i; + for (i=0; i<n; i++) { + if (e == etypes[i]) return 1; + } + return 0; +} /* * Class: sun_security_krb5_Credentials * Method: acquireDefaultNativeCreds - * Signature: ()Lsun/security/krb5/Credentials; + * Signature: ([I])Lsun/security/krb5/Credentials; */ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativeCreds -(JNIEnv *env, jclass krbcredsClass) +(JNIEnv *env, jclass krbcredsClass, jintArray jetypes) { jobject krbCreds = NULL; krb5_error_code err = 0; @@ -280,6 +288,9 @@ krb5_flags flags = 0; krb5_context kcontext = NULL; + int netypes; + jint *etypes = NULL; + /* Initialize the Kerberos 5 context */ err = krb5_init_context (&kcontext); @@ -295,6 +306,9 @@ err = krb5_cc_start_seq_get (kcontext, ccache, &cursor); } + netypes = (*env)->GetArrayLength(env, jetypes); + etypes = (jint *) (*env)->GetIntArrayElements(env, jetypes, NULL); + if (!err) { while ((err = krb5_cc_next_cred (kcontext, ccache, &cursor, &creds)) == 0) { char *serverName = NULL; @@ -305,7 +319,8 @@ } if (!err) { - if (strncmp (serverName, "krbtgt", strlen("krbtgt")) == 0) { + if (strncmp (serverName, "krbtgt", sizeof("krbtgt")-1) == 0 && + isIn(creds.keyblock.enctype, netypes, etypes)) { jobject ticket, clientPrincipal, targetPrincipal, encryptionKey; jobject ticketFlags, startTime, endTime; jobject authTime, renewTillTime, hostAddresses; @@ -321,7 +336,7 @@ targetPrincipal = BuildClientPrincipal(env, kcontext, creds.server); if (targetPrincipal == NULL) goto cleanup; - // Build a com.ibm.security.krb5.Ticket + // Build a sun/security/krb5/internal/Ticket ticket = BuildTicket(env, &creds.ticket); if (ticket == NULL) goto cleanup; @@ -353,7 +368,7 @@ krbcredsConstructor = (*env)->GetMethodID(env, krbcredsClass, "<init>", "(Lsun/security/krb5/internal/Ticket;Lsun/security/krb5/PrincipalName;Lsun/security/krb5/PrincipalName;Lsun/security/krb5/EncryptionKey;Lsun/security/krb5/internal/TicketFlags;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/KerberosTime;Lsun/security/krb5/internal/HostAddresses;)V"); if (krbcredsConstructor == 0) { - printf("Couldn't find com.ibm.security.krb5.Credentials constructor\n"); + printf("Couldn't find sun.security.krb5.internal.Ticket constructor\n"); break; } } @@ -409,6 +424,10 @@ printiferr (err, "while finishing ticket retrieval"); } + if (etypes != NULL) { + (*env)->ReleaseIntArrayElements(env, jetypes, etypes, 0); + } + krb5_free_context (kcontext); return krbCreds; }
--- a/src/solaris/classes/java/lang/UNIXProcess.java.bsd Tue Aug 27 13:37:38 2013 +0400 +++ b/src/solaris/classes/java/lang/UNIXProcess.java.bsd Tue Aug 27 21:46:00 2013 -0700 @@ -64,11 +64,59 @@ private /* final */ InputStream stdout; private /* final */ InputStream stderr; + private static enum LaunchMechanism { + FORK(1), + POSIX_SPAWN(2); + + private int value; + LaunchMechanism(int x) {value = x;} + }; + + /* On BSD, the default is to spawn */ + private static final LaunchMechanism launchMechanism; + private static byte[] helperpath; + + private static byte[] toCString(String s) { + if (s == null) + return null; + byte[] bytes = s.getBytes(); + byte[] result = new byte[bytes.length + 1]; + System.arraycopy(bytes, 0, + result, 0, + bytes.length); + result[result.length-1] = (byte)0; + return result; + } + + static { + launchMechanism = AccessController.doPrivileged( + new PrivilegedAction<LaunchMechanism>() + { + public LaunchMechanism run() { + String javahome = System.getProperty("java.home"); + + helperpath = toCString(javahome + "/lib/jspawnhelper"); + String s = System.getProperty( + "jdk.lang.Process.launchMechanism", "posix_spawn"); + + try { + return LaunchMechanism.valueOf(s.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new Error(s + " is not a supported " + + "process launch mechanism on this platform."); + } + } + }); + } + /* this is for the reaping thread */ private native int waitForProcessExit(int pid); /** - * Create a process using fork(2) and exec(2). + * Create a process. Depending on the mode flag, this is done by + * one of the following mechanisms. + * - fork(2) and exec(2) + * - posix_spawn(2) * * @param fds an array of three file descriptors. * Indexes 0, 1, and 2 correspond to standard input, @@ -81,7 +129,8 @@ * output. * @return the pid of the subprocess */ - private native int forkAndExec(byte[] prog, + private native int forkAndExec(int mode, byte[] helperpath, + byte[] prog, byte[] argBlock, int argc, byte[] envBlock, int envc, byte[] dir, @@ -133,7 +182,9 @@ final boolean redirectErrorStream) throws IOException { - pid = forkAndExec(prog, + pid = forkAndExec(launchMechanism.value, + helperpath, + prog, argBlock, argc, envBlock, envc, dir, @@ -212,13 +263,13 @@ } return exitcode; } - + @Override - public synchronized boolean waitFor(long timeout, TimeUnit unit) - throws InterruptedException + public synchronized boolean waitFor(long timeout, TimeUnit unit) + throws InterruptedException { if (hasExited) return true; - if (timeout <= 0) return false; + if (timeout <= 0) return false; long timeoutAsNanos = unit.toNanos(timeout); long startTime = System.nanoTime();
--- a/src/solaris/classes/java/lang/UNIXProcess.java.linux Tue Aug 27 13:37:38 2013 +0400 +++ b/src/solaris/classes/java/lang/UNIXProcess.java.linux Tue Aug 27 21:46:00 2013 -0700 @@ -64,11 +64,61 @@ private /* final */ InputStream stdout; private /* final */ InputStream stderr; + private static enum LaunchMechanism { + FORK(1), + VFORK(3); + + private int value; + LaunchMechanism(int x) {value = x;} + }; + + /* default is VFORK on Linux */ + private static final LaunchMechanism launchMechanism; + private static byte[] helperpath; + + private static byte[] toCString(String s) { + if (s == null) + return null; + byte[] bytes = s.getBytes(); + byte[] result = new byte[bytes.length + 1]; + System.arraycopy(bytes, 0, + result, 0, + bytes.length); + result[result.length-1] = (byte)0; + return result; + } + + static { + launchMechanism = AccessController.doPrivileged( + new PrivilegedAction<LaunchMechanism>() + { + public LaunchMechanism run() { + String javahome = System.getProperty("java.home"); + String osArch = System.getProperty("os.arch"); + + helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper"); + String s = System.getProperty( + "jdk.lang.Process.launchMechanism", "vfork"); + + try { + return LaunchMechanism.valueOf(s.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new Error(s + " is not a supported " + + "process launch mechanism on this platform."); + } + } + }); + } + /* this is for the reaping thread */ private native int waitForProcessExit(int pid); /** - * Create a process using fork(2) and exec(2). + * Create a process. Depending on the mode flag, this is done by + * one of the following mechanisms. + * - fork(2) and exec(2) + * - clone(2) and exec(2) + * - vfork(2) and exec(2) * * @param fds an array of three file descriptors. * Indexes 0, 1, and 2 correspond to standard input, @@ -81,7 +131,8 @@ * output. * @return the pid of the subprocess */ - private native int forkAndExec(byte[] prog, + private native int forkAndExec(int mode, byte[] helperpath, + byte[] prog, byte[] argBlock, int argc, byte[] envBlock, int envc, byte[] dir, @@ -133,7 +184,9 @@ final boolean redirectErrorStream) throws IOException { - pid = forkAndExec(prog, + pid = forkAndExec(launchMechanism.value, + helperpath, + prog, argBlock, argc, envBlock, envc, dir,
--- a/src/solaris/classes/java/lang/UNIXProcess.java.solaris Tue Aug 27 13:37:38 2013 +0400 +++ b/src/solaris/classes/java/lang/UNIXProcess.java.solaris Tue Aug 27 21:46:00 2013 -0700 @@ -27,6 +27,8 @@ import java.io.*; import java.util.concurrent.TimeUnit; +import java.security.AccessController; +import java.security.PrivilegedAction; /* java.lang.Process subclass in the UNIX environment. * @@ -46,11 +48,65 @@ private DeferredCloseInputStream stdout_inner_stream; private InputStream stderr_stream; + private static enum LaunchMechanism { + FORK(1), + POSIX_SPAWN(2); + + private int value; + LaunchMechanism(int x) {value = x;} + }; + + /* On Solaris, the default is to spawn */ + private static final LaunchMechanism launchMechanism; + private static byte[] helperpath; + + private static byte[] toCString(String s) { + if (s == null) + return null; + byte[] bytes = s.getBytes(); + byte[] result = new byte[bytes.length + 1]; + System.arraycopy(bytes, 0, + result, 0, + bytes.length); + result[result.length-1] = (byte)0; + return result; + } + + static { + launchMechanism = AccessController.doPrivileged( + new PrivilegedAction<LaunchMechanism>() + { + public LaunchMechanism run() { + String javahome = System.getProperty("java.home"); + String osArch = System.getProperty("os.arch"); + if (osArch.equals("x86")) { + osArch = "i386"; + } else if (osArch.equals("x86_64")) { + osArch = "amd64"; + } + + helperpath = toCString(javahome + "/lib/" + osArch + "/jspawnhelper"); + String s = System.getProperty( + "jdk.lang.Process.launchMechanism", "posix_spawn"); + + try { + return LaunchMechanism.valueOf(s.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new Error(s + " is not a supported " + + "process launch mechanism on this platform."); + } + } + }); + } + /* this is for the reaping thread */ private native int waitForProcessExit(int pid); /** - * Create a process using fork(2) and exec(2). + * Create a process. Depending on the mode flag, this is done by + * one of the following mechanisms. + * - fork(2) and exec(2) + * - posix_spawn(2) * * @param std_fds array of file descriptors. Indexes 0, 1, and * 2 correspond to standard input, standard output and @@ -62,7 +118,8 @@ * if and only if it is <em>not</em> -1 on output. * @return the pid of the subprocess */ - private native int forkAndExec(byte[] prog, + private native int forkAndExec(int mode, byte[] helperpath, + byte[] prog, byte[] argBlock, int argc, byte[] envBlock, int envc, byte[] dir, @@ -77,7 +134,9 @@ final int[] std_fds, final boolean redirectErrorStream) throws IOException { - pid = forkAndExec(prog, + pid = forkAndExec(launchMechanism.value, + helperpath, + prog, argBlock, argc, envBlock, envc, dir,
--- a/src/solaris/classes/sun/print/AttributeClass.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/solaris/classes/sun/print/AttributeClass.java Tue Aug 27 21:46:00 2013 -0700 @@ -24,6 +24,7 @@ */ package sun.print; +import java.util.Objects; import java.io.ByteArrayInputStream; public class AttributeClass { @@ -248,11 +249,24 @@ return myName; } + @Override public boolean equals(Object obj) { - return - obj != null && - obj instanceof AttributeClass && - obj.toString().equals (((AttributeClass) obj).toString()); + if (!(obj instanceof AttributeClass)) { + return false; + } + if (this == obj) { + return true; + } + + AttributeClass acObj = (AttributeClass) obj; + return myType == acObj.getType() && + Objects.equals(myName, acObj.getName()) && + Objects.equals(myValue, acObj.getObjectValue()); + } + + @Override + public int hashCode() { + return Objects.hash(myType, myName, myValue); } public String toString() {
--- a/src/solaris/classes/sun/print/UnixPrintServiceLookup.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/solaris/classes/sun/print/UnixPrintServiceLookup.java Tue Aug 27 21:46:00 2013 -0700 @@ -245,7 +245,7 @@ continue; } if ((defaultPrintService != null) - && printers[p].equals(defaultPrintService.getName())) { + && printers[p].equals(getPrinterDestName(defaultPrintService))) { printerList.add(defaultPrintService); defaultIndex = printerList.size() - 1; } else { @@ -270,11 +270,12 @@ } else { int j; for (j=0; j<printServices.length; j++) { - if ((printServices[j] != null) && - (printers[p].equals(printServices[j].getName()))) { - printerList.add(printServices[j]); - printServices[j] = null; - break; + if (printServices[j] != null) { + if (printers[p].equals(getPrinterDestName(printServices[j]))) { + printerList.add(printServices[j]); + printServices[j] = null; + break; + } } } @@ -360,6 +361,17 @@ return true; } + /* + * Gets the printer name compatible with the list of printers returned by + * the system when we query default or all the available printers. + */ + private String getPrinterDestName(PrintService ps) { + if (isMac()) { + return ((IPPPrintService)ps).getDest(); + } + return ps.getName(); + } + /* On a network with many (hundreds) of network printers, it * can save several seconds if you know all you want is a particular * printer, to ask for that printer rather than retrieving all printers. @@ -369,10 +381,12 @@ if (name == null || name.equals("") || !checkPrinterName(name)) { return null; } - /* check is all printers are already available */ + /* check if all printers are already available */ if (printServices != null) { for (PrintService printService : printServices) { - if (printService.getName().equals(name)) { + PrinterName printerName = + (PrinterName)printService.getAttribute(PrinterName.class); + if (printerName.getValue().equals(name)) { return printService; } } @@ -567,7 +581,7 @@ defaultPrintService = null; if (printServices != null) { for (int j=0; j<printServices.length; j++) { - if (defaultPrinter.equals(printServices[j].getName())) { + if (defaultPrinter.equals(getPrinterDestName(printServices[j]))) { defaultPrintService = printServices[j]; break; }
--- a/src/solaris/native/java/lang/UNIXProcess_md.c Tue Aug 27 13:37:38 2013 +0400 +++ b/src/solaris/native/java/lang/UNIXProcess_md.c Tue Aug 27 21:46:00 2013 -0700 @@ -43,32 +43,15 @@ #include <sys/wait.h> #include <signal.h> #include <string.h> -#include <errno.h> -#include <dirent.h> -#include <unistd.h> -#include <fcntl.h> -#include <limits.h> -#ifdef __APPLE__ -#include <crt_externs.h> -#define environ (*_NSGetEnviron()) -#else -/* This is one of the rare times it's more portable to declare an - * external symbol explicitly, rather than via a system header. - * The declaration is standardized as part of UNIX98, but there is - * no standard (not even de-facto) header file where the - * declaration is to be found. See: - * http://www.opengroup.org/onlinepubs/009695399/functions/environ.html - * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html - * - * "All identifiers in this volume of IEEE Std 1003.1-2001, except - * environ, are defined in at least one of the headers" (!) - */ -extern char **environ; +#if defined(__solaris__) || defined(_ALLBSD_SOURCE) +#include <spawn.h> #endif +#include "childproc.h" + /* - * There are 3 possible strategies we might use to "fork": + * There are 4 possible strategies we might use to "fork": * * - fork(2). Very portable and reliable but subject to * failure due to overcommit (see the documentation on @@ -103,68 +86,21 @@ * http://sources.redhat.com/bugzilla/show_bug.cgi?id=10311 * but the glibc maintainers closed it as WONTFIX. * + * - posix_spawn(). While posix_spawn() is a fairly elaborate and + * complicated system call, it can't quite do everything that the old + * fork()/exec() combination can do, so the only feasible way to do + * this, is to use posix_spawn to launch a new helper executable + * "jprochelper", which in turn execs the target (after cleaning + * up file-descriptors etc.) The end result is the same as before, + * a child process linked to the parent in the same way, but it + * avoids the problem of duplicating the parent (VM) process + * address space temporarily, before launching the target command. + * * Based on the above analysis, we are currently using vfork() on - * Linux and fork() on other Unix systems, but the code to use clone() - * remains. + * Linux and spawn() on other Unix systems, but the code to use clone() + * and fork() remains. */ -#define START_CHILD_USE_CLONE 0 /* clone() currently disabled; see above. */ - -#ifndef START_CHILD_USE_CLONE - #ifdef __linux__ - #define START_CHILD_USE_CLONE 1 - #else - #define START_CHILD_USE_CLONE 0 - #endif -#endif - -/* By default, use vfork() on Linux. */ -#ifndef START_CHILD_USE_VFORK - #ifdef __linux__ - #define START_CHILD_USE_VFORK 1 - #else - #define START_CHILD_USE_VFORK 0 - #endif -#endif - -#if START_CHILD_USE_CLONE -#include <sched.h> -#define START_CHILD_SYSTEM_CALL "clone" -#elif START_CHILD_USE_VFORK -#define START_CHILD_SYSTEM_CALL "vfork" -#else -#define START_CHILD_SYSTEM_CALL "fork" -#endif - -#ifndef STDIN_FILENO -#define STDIN_FILENO 0 -#endif - -#ifndef STDOUT_FILENO -#define STDOUT_FILENO 1 -#endif - -#ifndef STDERR_FILENO -#define STDERR_FILENO 2 -#endif - -#ifndef SA_NOCLDSTOP -#define SA_NOCLDSTOP 0 -#endif - -#ifndef SA_RESTART -#define SA_RESTART 0 -#endif - -#define FAIL_FILENO (STDERR_FILENO + 1) - -/* TODO: Refactor. */ -#define RESTARTABLE(_cmd, _result) do { \ - do { \ - _result = _cmd; \ - } while((_result == -1) && (errno == EINTR)); \ -} while(0) - static void setSIGCHLDHandler(JNIEnv *env) @@ -266,17 +202,10 @@ return pathv; } -/** - * The cached and split version of the JDK's effective PATH. - * (We don't support putenv("PATH=...") in native code) - */ -static const char * const *parentPathv; - JNIEXPORT void JNICALL Java_java_lang_UNIXProcess_init(JNIEnv *env, jclass clazz) { parentPathv = effectivePathv(env); - setSIGCHLDHandler(env); } @@ -343,96 +272,6 @@ } } -static ssize_t -restartableWrite(int fd, const void *buf, size_t count) -{ - ssize_t result; - RESTARTABLE(write(fd, buf, count), result); - return result; -} - -static int -restartableDup2(int fd_from, int fd_to) -{ - int err; - RESTARTABLE(dup2(fd_from, fd_to), err); - return err; -} - -static int -restartableClose(int fd) -{ - int err; - RESTARTABLE(close(fd), err); - return err; -} - -static int -closeSafely(int fd) -{ - return (fd == -1) ? 0 : restartableClose(fd); -} - -static int -isAsciiDigit(char c) -{ - return c >= '0' && c <= '9'; -} - -#ifdef _ALLBSD_SOURCE -#define FD_DIR "/dev/fd" -#define dirent64 dirent -#define readdir64 readdir -#else -#define FD_DIR "/proc/self/fd" -#endif - -static int -closeDescriptors(void) -{ - DIR *dp; - struct dirent64 *dirp; - int from_fd = FAIL_FILENO + 1; - - /* We're trying to close all file descriptors, but opendir() might - * itself be implemented using a file descriptor, and we certainly - * don't want to close that while it's in use. We assume that if - * opendir() is implemented using a file descriptor, then it uses - * the lowest numbered file descriptor, just like open(). So we - * close a couple explicitly. */ - - restartableClose(from_fd); /* for possible use by opendir() */ - restartableClose(from_fd + 1); /* another one for good luck */ - - if ((dp = opendir(FD_DIR)) == NULL) - return 0; - - /* We use readdir64 instead of readdir to work around Solaris bug - * 6395699: /proc/self/fd fails to report file descriptors >= 1024 on Solaris 9 - */ - while ((dirp = readdir64(dp)) != NULL) { - int fd; - if (isAsciiDigit(dirp->d_name[0]) && - (fd = strtol(dirp->d_name, NULL, 10)) >= from_fd + 2) - restartableClose(fd); - } - - closedir(dp); - - return 1; -} - -static int -moveDescriptor(int fd_from, int fd_to) -{ - if (fd_from != fd_to) { - if ((restartableDup2(fd_from, fd_to) == -1) || - (restartableClose(fd_from) == -1)) - return -1; - } - return 0; -} - static const char * getBytes(JNIEnv *env, jbyteArray arr) { @@ -448,19 +287,6 @@ } static void -initVectorFromBlock(const char**vector, const char* block, int count) -{ - int i; - const char *p; - for (i = 0, p = block; i < count; i++) { - /* Invariant: p always points to the start of a C string. */ - vector[i] = p; - while (*(p++)); - } - vector[count] = NULL; -} - -static void throwIOException(JNIEnv *env, int errnum, const char *defaultDetail) { static const char * const format = "error=%d, %s"; @@ -503,182 +329,6 @@ } #endif /* DEBUG_PROCESS */ -/** - * Exec FILE as a traditional Bourne shell script (i.e. one without #!). - * If we could do it over again, we would probably not support such an ancient - * misfeature, but compatibility wins over sanity. The original support for - * this was imported accidentally from execvp(). - */ -static void -execve_as_traditional_shell_script(const char *file, - const char *argv[], - const char *const envp[]) -{ - /* Use the extra word of space provided for us in argv by caller. */ - const char *argv0 = argv[0]; - const char *const *end = argv; - while (*end != NULL) - ++end; - memmove(argv+2, argv+1, (end-argv) * sizeof (*end)); - argv[0] = "/bin/sh"; - argv[1] = file; - execve(argv[0], (char **) argv, (char **) envp); - /* Can't even exec /bin/sh? Big trouble, but let's soldier on... */ - memmove(argv+1, argv+2, (end-argv) * sizeof (*end)); - argv[0] = argv0; -} - -/** - * Like execve(2), except that in case of ENOEXEC, FILE is assumed to - * be a shell script and the system default shell is invoked to run it. - */ -static void -execve_with_shell_fallback(const char *file, - const char *argv[], - const char *const envp[]) -{ -#if START_CHILD_USE_CLONE || START_CHILD_USE_VFORK - /* shared address space; be very careful. */ - execve(file, (char **) argv, (char **) envp); - if (errno == ENOEXEC) - execve_as_traditional_shell_script(file, argv, envp); -#else - /* unshared address space; we can mutate environ. */ - environ = (char **) envp; - execvp(file, (char **) argv); -#endif -} - -/** - * 'execvpe' should have been included in the Unix standards, - * and is a GNU extension in glibc 2.10. - * - * JDK_execvpe is identical to execvp, except that the child environment is - * specified via the 3rd argument instead of being inherited from environ. - */ -static void -JDK_execvpe(const char *file, - const char *argv[], - const char *const envp[]) -{ - if (envp == NULL || (char **) envp == environ) { - execvp(file, (char **) argv); - return; - } - - if (*file == '\0') { - errno = ENOENT; - return; - } - - if (strchr(file, '/') != NULL) { - execve_with_shell_fallback(file, argv, envp); - } else { - /* We must search PATH (parent's, not child's) */ - char expanded_file[PATH_MAX]; - int filelen = strlen(file); - int sticky_errno = 0; - const char * const * dirs; - for (dirs = parentPathv; *dirs; dirs++) { - const char * dir = *dirs; - int dirlen = strlen(dir); - if (filelen + dirlen + 2 >= PATH_MAX) { - errno = ENAMETOOLONG; - continue; - } - memcpy(expanded_file, dir, dirlen); - if (expanded_file[dirlen - 1] != '/') - expanded_file[dirlen++] = '/'; - memcpy(expanded_file + dirlen, file, filelen); - expanded_file[dirlen + filelen] = '\0'; - execve_with_shell_fallback(expanded_file, argv, envp); - /* There are 3 responses to various classes of errno: - * return immediately, continue (especially for ENOENT), - * or continue with "sticky" errno. - * - * From exec(3): - * - * If permission is denied for a file (the attempted - * execve returned EACCES), these functions will continue - * searching the rest of the search path. If no other - * file is found, however, they will return with the - * global variable errno set to EACCES. - */ - switch (errno) { - case EACCES: - sticky_errno = errno; - /* FALLTHRU */ - case ENOENT: - case ENOTDIR: -#ifdef ELOOP - case ELOOP: -#endif -#ifdef ESTALE - case ESTALE: -#endif -#ifdef ENODEV - case ENODEV: -#endif -#ifdef ETIMEDOUT - case ETIMEDOUT: -#endif - break; /* Try other directories in PATH */ - default: - return; - } - } - if (sticky_errno != 0) - errno = sticky_errno; - } -} - -/* - * Reads nbyte bytes from file descriptor fd into buf, - * The read operation is retried in case of EINTR or partial reads. - * - * Returns number of bytes read (normally nbyte, but may be less in - * case of EOF). In case of read errors, returns -1 and sets errno. - */ -static ssize_t -readFully(int fd, void *buf, size_t nbyte) -{ - ssize_t remaining = nbyte; - for (;;) { - ssize_t n = read(fd, buf, remaining); - if (n == 0) { - return nbyte - remaining; - } else if (n > 0) { - remaining -= n; - if (remaining <= 0) - return nbyte; - /* We were interrupted in the middle of reading the bytes. - * Unlikely, but possible. */ - buf = (void *) (((char *)buf) + n); - } else if (errno == EINTR) { - /* Strange signals like SIGJVM1 are possible at any time. - * See http://www.dreamsongs.com/WorseIsBetter.html */ - } else { - return -1; - } - } -} - -typedef struct _ChildStuff -{ - int in[2]; - int out[2]; - int err[2]; - int fail[2]; - int fds[3]; - const char **argv; - const char **envv; - const char *pdir; - jboolean redirectErrorStream; -#if START_CHILD_USE_CLONE - void *clone_stack; -#endif -} ChildStuff; - static void copyPipe(int from[2], int to[2]) { @@ -686,97 +336,67 @@ to[1] = from[1]; } -/** - * Child process after a successful fork() or clone(). - * This function must not return, and must be prepared for either all - * of its address space to be shared with its parent, or to be a copy. - * It must not modify global variables such as "environ". +/* arg is an array of pointers to 0 terminated strings. array is terminated + * by a null element. + * + * *nelems and *nbytes receive the number of elements of array (incl 0) + * and total number of bytes (incl. 0) + * Note. An empty array will have one null element + * But if arg is null, then *nelems set to 0, and *nbytes to 0 */ -static int -childProcess(void *arg) +static void arraysize(const char * const *arg, int *nelems, int *nbytes) { - const ChildStuff* p = (const ChildStuff*) arg; - - /* Close the parent sides of the pipes. - Closing pipe fds here is redundant, since closeDescriptors() - would do it anyways, but a little paranoia is a good thing. */ - if ((closeSafely(p->in[1]) == -1) || - (closeSafely(p->out[0]) == -1) || - (closeSafely(p->err[0]) == -1) || - (closeSafely(p->fail[0]) == -1)) - goto WhyCantJohnnyExec; - - /* Give the child sides of the pipes the right fileno's. */ - /* Note: it is possible for in[0] == 0 */ - if ((moveDescriptor(p->in[0] != -1 ? p->in[0] : p->fds[0], - STDIN_FILENO) == -1) || - (moveDescriptor(p->out[1]!= -1 ? p->out[1] : p->fds[1], - STDOUT_FILENO) == -1)) - goto WhyCantJohnnyExec; - - if (p->redirectErrorStream) { - if ((closeSafely(p->err[1]) == -1) || - (restartableDup2(STDOUT_FILENO, STDERR_FILENO) == -1)) - goto WhyCantJohnnyExec; - } else { - if (moveDescriptor(p->err[1] != -1 ? p->err[1] : p->fds[2], - STDERR_FILENO) == -1) - goto WhyCantJohnnyExec; + int i, bytes, count; + const char * const *a = arg; + char *p; + int *q; + if (arg == 0) { + *nelems = 0; + *nbytes = 0; + return; } + /* count the array elements and number of bytes */ + for (count=0, bytes=0; *a != 0; count++, a++) { + bytes += strlen(*a)+1; + } + *nbytes = bytes; + *nelems = count+1; +} - if (moveDescriptor(p->fail[1], FAIL_FILENO) == -1) - goto WhyCantJohnnyExec; - - /* close everything */ - if (closeDescriptors() == 0) { /* failed, close the old way */ - int max_fd = (int)sysconf(_SC_OPEN_MAX); - int fd; - for (fd = FAIL_FILENO + 1; fd < max_fd; fd++) - if (restartableClose(fd) == -1 && errno != EBADF) - goto WhyCantJohnnyExec; - } - - /* change to the new working directory */ - if (p->pdir != NULL && chdir(p->pdir) < 0) - goto WhyCantJohnnyExec; - - if (fcntl(FAIL_FILENO, F_SETFD, FD_CLOEXEC) == -1) - goto WhyCantJohnnyExec; +/* copy the strings from arg[] into buf, starting at given offset + * return new offset to next free byte + */ +static int copystrings(char *buf, int offset, const char * const *arg) { + char *p; + const char * const *a; + int count=0; - JDK_execvpe(p->argv[0], p->argv, p->envv); - - WhyCantJohnnyExec: - /* We used to go to an awful lot of trouble to predict whether the - * child would fail, but there is no reliable way to predict the - * success of an operation without *trying* it, and there's no way - * to try a chdir or exec in the parent. Instead, all we need is a - * way to communicate any failure back to the parent. Easy; we just - * send the errno back to the parent over a pipe in case of failure. - * The tricky thing is, how do we communicate the *success* of exec? - * We use FD_CLOEXEC together with the fact that a read() on a pipe - * yields EOF when the write ends (we have two of them!) are closed. - */ - { - int errnum = errno; - restartableWrite(FAIL_FILENO, &errnum, sizeof(errnum)); + if (arg == 0) { + return offset; } - restartableClose(FAIL_FILENO); - _exit(-1); - return 0; /* Suppress warning "no return value from function" */ + for (p=buf+offset, a=arg; *a != 0; a++) { + int len = strlen(*a) +1; + memcpy(p, *a, len); + p += len; + count += len; + } + return offset+count; } /** - * Start a child process running function childProcess. - * This function only returns in the parent. * We are unusually paranoid; use of clone/vfork is * especially likely to tickle gcc/glibc bugs. */ #ifdef __attribute_noinline__ /* See: sys/cdefs.h */ __attribute_noinline__ #endif + +#define START_CHILD_USE_CLONE 0 /* clone() currently disabled; see above. */ + +#ifdef START_CHILD_USE_CLONE static pid_t -startChild(ChildStuff *c) { -#if START_CHILD_USE_CLONE +cloneChild(ChildStuff *c) { +#ifdef __linux__ #define START_CHILD_CLONE_STACK_SIZE (64 * 1024) /* * See clone(2). @@ -790,33 +410,161 @@ c->clone_stack + START_CHILD_CLONE_STACK_SIZE, CLONE_VFORK | CLONE_VM | SIGCHLD, c); #else - #if START_CHILD_USE_VFORK +/* not available on Solaris / Mac */ + assert(0); + return -1; +#endif +} +#endif + +static pid_t +vforkChild(ChildStuff *c) { + volatile pid_t resultPid; + /* * We separate the call to vfork into a separate function to make * very sure to keep stack of child from corrupting stack of parent, * as suggested by the scary gcc warning: * warning: variable 'foo' might be clobbered by 'longjmp' or 'vfork' */ - volatile pid_t resultPid = vfork(); - #else + resultPid = vfork(); + + if (resultPid == 0) { + childProcess(c); + } + assert(resultPid != 0); /* childProcess never returns */ + return resultPid; +} + +static pid_t +forkChild(ChildStuff *c) { + pid_t resultPid; + /* * From Solaris fork(2): In Solaris 10, a call to fork() is * identical to a call to fork1(); only the calling thread is * replicated in the child process. This is the POSIX-specified * behavior for fork(). */ - pid_t resultPid = fork(); - #endif - if (resultPid == 0) + resultPid = fork(); + + if (resultPid == 0) { childProcess(c); + } assert(resultPid != 0); /* childProcess never returns */ return resultPid; -#endif /* ! START_CHILD_USE_CLONE */ +} + +#if defined(__solaris__) || defined(_ALLBSD_SOURCE) +static pid_t +spawnChild(JNIEnv *env, jobject process, ChildStuff *c, const char *helperpath) { + pid_t resultPid; + jboolean isCopy; + int i, offset, rval, bufsize, magic; + char *buf, buf1[16]; + char *hlpargs[2]; + SpawnInfo sp; + + /* need to tell helper which fd is for receiving the childstuff + * and which fd to send response back on + */ + snprintf(buf1, sizeof(buf1), "%d:%d", c->childenv[0], c->fail[1]); + /* put the fd string as argument to the helper cmd */ + hlpargs[0] = buf1; + hlpargs[1] = 0; + + /* Following items are sent down the pipe to the helper + * after it is spawned. + * All strings are null terminated. All arrays of strings + * have an empty string for termination. + * - the ChildStuff struct + * - the SpawnInfo struct + * - the argv strings array + * - the envv strings array + * - the home directory string + * - the parentPath string + * - the parentPathv array + */ + /* First calculate the sizes */ + arraysize(c->argv, &sp.nargv, &sp.argvBytes); + bufsize = sp.argvBytes; + arraysize(c->envv, &sp.nenvv, &sp.envvBytes); + bufsize += sp.envvBytes; + sp.dirlen = c->pdir == 0 ? 0 : strlen(c->pdir)+1; + bufsize += sp.dirlen; + arraysize(parentPathv, &sp.nparentPathv, &sp.parentPathvBytes); + bufsize += sp.parentPathvBytes; + /* We need to clear FD_CLOEXEC if set in the fds[]. + * Files are created FD_CLOEXEC in Java. + * Otherwise, they will be closed when the target gets exec'd */ + for (i=0; i<3; i++) { + if (c->fds[i] != -1) { + int flags = fcntl(c->fds[i], F_GETFD); + if (flags & FD_CLOEXEC) { + fcntl(c->fds[i], F_SETFD, flags & (~1)); + } + } + } + + rval = posix_spawn(&resultPid, helperpath, 0, 0, (char * const *) hlpargs, environ); + + if (rval != 0) { + return -1; + } + + /* now the lengths are known, copy the data */ + buf = NEW(char, bufsize); + if (buf == 0) { + return -1; + } + offset = copystrings(buf, 0, &c->argv[0]); + offset = copystrings(buf, offset, &c->envv[0]); + memcpy(buf+offset, c->pdir, sp.dirlen); + offset += sp.dirlen; + offset = copystrings(buf, offset, parentPathv); + assert(offset == bufsize); + + magic = magicNumber(); + + /* write the two structs and the data buffer */ + write(c->childenv[1], (char *)&magic, sizeof(magic)); // magic number first + write(c->childenv[1], (char *)c, sizeof(*c)); + write(c->childenv[1], (char *)&sp, sizeof(sp)); + write(c->childenv[1], buf, bufsize); + free(buf); + + /* In this mode an external main() in invoked which calls back into + * childProcess() in this file, rather than directly + * via the statement below */ + return resultPid; +} +#endif + +/* + * Start a child process running function childProcess. + * This function only returns in the parent. + */ +static pid_t +startChild(JNIEnv *env, jobject process, ChildStuff *c, const char *helperpath) { + switch (c->mode) { + case MODE_VFORK: + return vforkChild(c); + case MODE_FORK: + return forkChild(c); +#if defined(__solaris__) || defined(_ALLBSD_SOURCE) + case MODE_POSIX_SPAWN: + return spawnChild(env, process, c, helperpath); +#endif + default: + return -1; + } } JNIEXPORT jint JNICALL Java_java_lang_UNIXProcess_forkAndExec(JNIEnv *env, jobject process, + jint mode, + jbyteArray helperpath, jbyteArray prog, jbyteArray argBlock, jint argc, jbyteArray envBlock, jint envc, @@ -826,32 +574,35 @@ { int errnum; int resultPid = -1; - int in[2], out[2], err[2], fail[2]; + int in[2], out[2], err[2], fail[2], childenv[2]; jint *fds = NULL; + const char *phelperpath = NULL; const char *pprog = NULL; const char *pargBlock = NULL; const char *penvBlock = NULL; ChildStuff *c; in[0] = in[1] = out[0] = out[1] = err[0] = err[1] = fail[0] = fail[1] = -1; + childenv[0] = childenv[1] = -1; if ((c = NEW(ChildStuff, 1)) == NULL) return -1; c->argv = NULL; c->envv = NULL; c->pdir = NULL; -#if START_CHILD_USE_CLONE c->clone_stack = NULL; -#endif /* Convert prog + argBlock into a char ** argv. * Add one word room for expansion of argv for use by * execve_as_traditional_shell_script. + * This word is also used when using spawn mode */ assert(prog != NULL && argBlock != NULL); + if ((phelperpath = getBytes(env, helperpath)) == NULL) goto Catch; if ((pprog = getBytes(env, prog)) == NULL) goto Catch; if ((pargBlock = getBytes(env, argBlock)) == NULL) goto Catch; if ((c->argv = NEW(const char *, argc + 3)) == NULL) goto Catch; c->argv[0] = pprog; + c->argc = argc + 2; initVectorFromBlock(c->argv+1, pargBlock, argc); if (envBlock != NULL) { @@ -872,6 +623,7 @@ if ((fds[0] == -1 && pipe(in) < 0) || (fds[1] == -1 && pipe(out) < 0) || (fds[2] == -1 && pipe(err) < 0) || + (pipe(childenv) < 0) || (pipe(fail) < 0)) { throwIOException(env, errno, "Bad file descriptor"); goto Catch; @@ -884,18 +636,29 @@ copyPipe(out, c->out); copyPipe(err, c->err); copyPipe(fail, c->fail); + copyPipe(childenv, c->childenv); c->redirectErrorStream = redirectErrorStream; + c->mode = mode; - resultPid = startChild(c); + resultPid = startChild(env, process, c, phelperpath); assert(resultPid != 0); if (resultPid < 0) { - throwIOException(env, errno, START_CHILD_SYSTEM_CALL " failed"); + switch (c->mode) { + case MODE_VFORK: + throwIOException(env, errno, "vfork failed"); + break; + case MODE_FORK: + throwIOException(env, errno, "fork failed"); + break; + case MODE_POSIX_SPAWN: + throwIOException(env, errno, "spawn failed"); + break; + } goto Catch; } - - restartableClose(fail[1]); fail[1] = -1; /* See: WhyCantJohnnyExec */ + close(fail[1]); fail[1] = -1; /* See: WhyCantJohnnyExec (childproc.c) */ switch (readFully(fail[0], &errnum, sizeof(errnum))) { case 0: break; /* Exec succeeded */ @@ -913,18 +676,18 @@ fds[2] = (err[0] != -1) ? err[0] : -1; Finally: -#if START_CHILD_USE_CLONE free(c->clone_stack); -#endif /* Always clean up the child's side of the pipes */ closeSafely(in [0]); closeSafely(out[1]); closeSafely(err[1]); - /* Always clean up fail descriptors */ + /* Always clean up fail and childEnv descriptors */ closeSafely(fail[0]); closeSafely(fail[1]); + closeSafely(childenv[0]); + closeSafely(childenv[1]); releaseBytes(env, prog, pprog); releaseBytes(env, argBlock, pargBlock); @@ -942,9 +705,9 @@ Catch: /* Clean up the parent's side of the pipes in case of failure only */ - closeSafely(in [1]); - closeSafely(out[0]); - closeSafely(err[0]); + closeSafely(in [1]); in[1] = -1; + closeSafely(out[0]); out[0] = -1; + closeSafely(err[0]); err[0] = -1; goto Finally; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/native/java/lang/childproc.c Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,376 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include <dirent.h> +#include <errno.h> +#include <fcntl.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <limits.h> + +#include "childproc.h" + + +ssize_t +restartableWrite(int fd, const void *buf, size_t count) +{ + ssize_t result; + RESTARTABLE(write(fd, buf, count), result); + return result; +} + +int +restartableDup2(int fd_from, int fd_to) +{ + int err; + RESTARTABLE(dup2(fd_from, fd_to), err); + return err; +} + +int +closeSafely(int fd) +{ + return (fd == -1) ? 0 : close(fd); +} + +int +isAsciiDigit(char c) +{ + return c >= '0' && c <= '9'; +} + +#ifdef _ALLBSD_SOURCE +#define FD_DIR "/dev/fd" +#define dirent64 dirent +#define readdir64 readdir +#else +#define FD_DIR "/proc/self/fd" +#endif + +int +closeDescriptors(void) +{ + DIR *dp; + struct dirent64 *dirp; + int from_fd = FAIL_FILENO + 1; + + /* We're trying to close all file descriptors, but opendir() might + * itself be implemented using a file descriptor, and we certainly + * don't want to close that while it's in use. We assume that if + * opendir() is implemented using a file descriptor, then it uses + * the lowest numbered file descriptor, just like open(). So we + * close a couple explicitly. */ + + close(from_fd); /* for possible use by opendir() */ + close(from_fd + 1); /* another one for good luck */ + + if ((dp = opendir(FD_DIR)) == NULL) + return 0; + + /* We use readdir64 instead of readdir to work around Solaris bug + * 6395699: /proc/self/fd fails to report file descriptors >= 1024 on Solaris 9 + */ + while ((dirp = readdir64(dp)) != NULL) { + int fd; + if (isAsciiDigit(dirp->d_name[0]) && + (fd = strtol(dirp->d_name, NULL, 10)) >= from_fd + 2) + close(fd); + } + + closedir(dp); + + return 1; +} + +int +moveDescriptor(int fd_from, int fd_to) +{ + if (fd_from != fd_to) { + if ((restartableDup2(fd_from, fd_to) == -1) || + (close(fd_from) == -1)) + return -1; + } + return 0; +} + +int +magicNumber() { + return 43110; +} + +/* + * Reads nbyte bytes from file descriptor fd into buf, + * The read operation is retried in case of EINTR or partial reads. + * + * Returns number of bytes read (normally nbyte, but may be less in + * case of EOF). In case of read errors, returns -1 and sets errno. + */ +ssize_t +readFully(int fd, void *buf, size_t nbyte) +{ + ssize_t remaining = nbyte; + for (;;) { + ssize_t n = read(fd, buf, remaining); + if (n == 0) { + return nbyte - remaining; + } else if (n > 0) { + remaining -= n; + if (remaining <= 0) + return nbyte; + /* We were interrupted in the middle of reading the bytes. + * Unlikely, but possible. */ + buf = (void *) (((char *)buf) + n); + } else if (errno == EINTR) { + /* Strange signals like SIGJVM1 are possible at any time. + * See http://www.dreamsongs.com/WorseIsBetter.html */ + } else { + return -1; + } + } +} + +void +initVectorFromBlock(const char**vector, const char* block, int count) +{ + int i; + const char *p; + for (i = 0, p = block; i < count; i++) { + /* Invariant: p always points to the start of a C string. */ + vector[i] = p; + while (*(p++)); + } + vector[count] = NULL; +} + +/** + * Exec FILE as a traditional Bourne shell script (i.e. one without #!). + * If we could do it over again, we would probably not support such an ancient + * misfeature, but compatibility wins over sanity. The original support for + * this was imported accidentally from execvp(). + */ +void +execve_as_traditional_shell_script(const char *file, + const char *argv[], + const char *const envp[]) +{ + /* Use the extra word of space provided for us in argv by caller. */ + const char *argv0 = argv[0]; + const char *const *end = argv; + while (*end != NULL) + ++end; + memmove(argv+2, argv+1, (end-argv) * sizeof(*end)); + argv[0] = "/bin/sh"; + argv[1] = file; + execve(argv[0], (char **) argv, (char **) envp); + /* Can't even exec /bin/sh? Big trouble, but let's soldier on... */ + memmove(argv+1, argv+2, (end-argv) * sizeof(*end)); + argv[0] = argv0; +} + +/** + * Like execve(2), except that in case of ENOEXEC, FILE is assumed to + * be a shell script and the system default shell is invoked to run it. + */ +void +execve_with_shell_fallback(int mode, const char *file, + const char *argv[], + const char *const envp[]) +{ + if (mode == MODE_CLONE || mode == MODE_VFORK) { + /* shared address space; be very careful. */ + execve(file, (char **) argv, (char **) envp); + if (errno == ENOEXEC) + execve_as_traditional_shell_script(file, argv, envp); + } else { + /* unshared address space; we can mutate environ. */ + environ = (char **) envp; + execvp(file, (char **) argv); + } +} + +/** + * 'execvpe' should have been included in the Unix standards, + * and is a GNU extension in glibc 2.10. + * + * JDK_execvpe is identical to execvp, except that the child environment is + * specified via the 3rd argument instead of being inherited from environ. + */ +void +JDK_execvpe(int mode, const char *file, + const char *argv[], + const char *const envp[]) +{ + if (envp == NULL || (char **) envp == environ) { + execvp(file, (char **) argv); + return; + } + + if (*file == '\0') { + errno = ENOENT; + return; + } + + if (strchr(file, '/') != NULL) { + execve_with_shell_fallback(mode, file, argv, envp); + } else { + /* We must search PATH (parent's, not child's) */ + char expanded_file[PATH_MAX]; + int filelen = strlen(file); + int sticky_errno = 0; + const char * const * dirs; + for (dirs = parentPathv; *dirs; dirs++) { + const char * dir = *dirs; + int dirlen = strlen(dir); + if (filelen + dirlen + 2 >= PATH_MAX) { + errno = ENAMETOOLONG; + continue; + } + memcpy(expanded_file, dir, dirlen); + if (expanded_file[dirlen - 1] != '/') + expanded_file[dirlen++] = '/'; + memcpy(expanded_file + dirlen, file, filelen); + expanded_file[dirlen + filelen] = '\0'; + execve_with_shell_fallback(mode, expanded_file, argv, envp); + /* There are 3 responses to various classes of errno: + * return immediately, continue (especially for ENOENT), + * or continue with "sticky" errno. + * + * From exec(3): + * + * If permission is denied for a file (the attempted + * execve returned EACCES), these functions will continue + * searching the rest of the search path. If no other + * file is found, however, they will return with the + * global variable errno set to EACCES. + */ + switch (errno) { + case EACCES: + sticky_errno = errno; + /* FALLTHRU */ + case ENOENT: + case ENOTDIR: +#ifdef ELOOP + case ELOOP: +#endif +#ifdef ESTALE + case ESTALE: +#endif +#ifdef ENODEV + case ENODEV: +#endif +#ifdef ETIMEDOUT + case ETIMEDOUT: +#endif + break; /* Try other directories in PATH */ + default: + return; + } + } + if (sticky_errno != 0) + errno = sticky_errno; + } +} + +/** + * Child process after a successful fork() or clone(). + * This function must not return, and must be prepared for either all + * of its address space to be shared with its parent, or to be a copy. + * It must not modify global variables such as "environ". + */ +int +childProcess(void *arg) +{ + const ChildStuff* p = (const ChildStuff*) arg; + + /* Close the parent sides of the pipes. + Closing pipe fds here is redundant, since closeDescriptors() + would do it anyways, but a little paranoia is a good thing. */ + if ((closeSafely(p->in[1]) == -1) || + (closeSafely(p->out[0]) == -1) || + (closeSafely(p->err[0]) == -1) || + (closeSafely(p->childenv[0]) == -1) || + (closeSafely(p->childenv[1]) == -1) || + (closeSafely(p->fail[0]) == -1)) + goto WhyCantJohnnyExec; + + /* Give the child sides of the pipes the right fileno's. */ + /* Note: it is possible for in[0] == 0 */ + if ((moveDescriptor(p->in[0] != -1 ? p->in[0] : p->fds[0], + STDIN_FILENO) == -1) || + (moveDescriptor(p->out[1]!= -1 ? p->out[1] : p->fds[1], + STDOUT_FILENO) == -1)) + goto WhyCantJohnnyExec; + + if (p->redirectErrorStream) { + if ((closeSafely(p->err[1]) == -1) || + (restartableDup2(STDOUT_FILENO, STDERR_FILENO) == -1)) + goto WhyCantJohnnyExec; + } else { + if (moveDescriptor(p->err[1] != -1 ? p->err[1] : p->fds[2], + STDERR_FILENO) == -1) + goto WhyCantJohnnyExec; + } + + if (moveDescriptor(p->fail[1], FAIL_FILENO) == -1) + goto WhyCantJohnnyExec; + + /* close everything */ + if (closeDescriptors() == 0) { /* failed, close the old way */ + int max_fd = (int)sysconf(_SC_OPEN_MAX); + int fd; + for (fd = FAIL_FILENO + 1; fd < max_fd; fd++) + if (close(fd) == -1 && errno != EBADF) + goto WhyCantJohnnyExec; + } + + /* change to the new working directory */ + if (p->pdir != NULL && chdir(p->pdir) < 0) + goto WhyCantJohnnyExec; + + if (fcntl(FAIL_FILENO, F_SETFD, FD_CLOEXEC) == -1) + goto WhyCantJohnnyExec; + + JDK_execvpe(p->mode, p->argv[0], p->argv, p->envv); + + WhyCantJohnnyExec: + /* We used to go to an awful lot of trouble to predict whether the + * child would fail, but there is no reliable way to predict the + * success of an operation without *trying* it, and there's no way + * to try a chdir or exec in the parent. Instead, all we need is a + * way to communicate any failure back to the parent. Easy; we just + * send the errno back to the parent over a pipe in case of failure. + * The tricky thing is, how do we communicate the *success* of exec? + * We use FD_CLOEXEC together with the fact that a read() on a pipe + * yields EOF when the write ends (we have two of them!) are closed. + */ + { + int errnum = errno; + restartableWrite(FAIL_FILENO, &errnum, sizeof(errnum)); + } + close(FAIL_FILENO); + _exit(-1); + return 0; /* Suppress warning "no return value from function" */ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/native/java/lang/childproc.h Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#ifndef CHILDPROC_MD_H +#define CHILDPROC_MD_H + +#include <sys/types.h> + +#ifdef __APPLE__ +#include <crt_externs.h> +#define environ (*_NSGetEnviron()) +#else +/* This is one of the rare times it's more portable to declare an + * external symbol explicitly, rather than via a system header. + * The declaration is standardized as part of UNIX98, but there is + * no standard (not even de-facto) header file where the + * declaration is to be found. See: + * http://www.opengroup.org/onlinepubs/009695399/functions/environ.html + * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html + * + * "All identifiers in this volume of IEEE Std 1003.1-2001, except + * environ, are defined in at least one of the headers" (!) + */ +extern char **environ; +#endif + +#ifdef __linux__ +#include <sched.h> +#endif + +#ifndef STDIN_FILENO +#define STDIN_FILENO 0 +#endif + +#ifndef STDOUT_FILENO +#define STDOUT_FILENO 1 +#endif + +#ifndef STDERR_FILENO +#define STDERR_FILENO 2 +#endif + +#ifndef SA_NOCLDSTOP +#define SA_NOCLDSTOP 0 +#endif + +#ifndef SA_RESTART +#define SA_RESTART 0 +#endif + +#define FAIL_FILENO (STDERR_FILENO + 1) + +/* TODO: Refactor. */ +#define RESTARTABLE(_cmd, _result) do { \ + do { \ + _result = _cmd; \ + } while((_result == -1) && (errno == EINTR)); \ +} while(0) + +/* These numbers must be the same as the Enum in UNIXProcess.java + * Must be a better way of doing this. + */ +#define MODE_FORK 1 +#define MODE_POSIX_SPAWN 2 +#define MODE_VFORK 3 +#define MODE_CLONE 4 + +typedef struct _ChildStuff +{ + int in[2]; + int out[2]; + int err[2]; + int fail[2]; + int childenv[2]; + int fds[3]; + int mode; + const char **argv; + int argc; + const char **envv; + const char *pdir; + int redirectErrorStream; + void *clone_stack; +} ChildStuff; + +/* following used in addition when mode is SPAWN */ +typedef struct _SpawnInfo { + int nargv; /* number of argv array elements */ + int argvBytes; /* total number of bytes in argv array */ + int nenvv; /* number of envv array elements */ + int envvBytes; /* total number of bytes in envv array */ + int dirlen; /* length of home directory string */ + int nparentPathv; /* number of elements in parentPathv array */ + int parentPathvBytes; /* total number of bytes in parentPathv array */ +} SpawnInfo; + +/** + * The cached and split version of the JDK's effective PATH. + * (We don't support putenv("PATH=...") in native code) + */ +const char * const *parentPathv; + +ssize_t restartableWrite(int fd, const void *buf, size_t count); +int restartableDup2(int fd_from, int fd_to); +int closeSafely(int fd); +int isAsciiDigit(char c); +int closeDescriptors(void); +int moveDescriptor(int fd_from, int fd_to); + +int magicNumber(); +ssize_t readFully(int fd, void *buf, size_t nbyte); +void initVectorFromBlock(const char**vector, const char* block, int count); +void execve_as_traditional_shell_script(const char *file, + const char *argv[], + const char *const envp[]); +void execve_with_shell_fallback(int mode, const char *file, + const char *argv[], + const char *const envp[]); +void JDK_execvpe(int mode, const char *file, + const char *argv[], + const char *const envp[]); +int childProcess(void *arg); + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/solaris/native/java/lang/jspawnhelper.c Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> + +#include "childproc.h" + +extern int errno; + +#define ALLOC(X,Y) { \ + void *mptr; \ + mptr = malloc (Y); \ + if (mptr == 0) { \ + error (fdout, ERR_MALLOC); \ + } \ + X = mptr; \ +} + +#define ERR_MALLOC 1 +#define ERR_PIPE 2 +#define ERR_ARGS 3 + +void error (int fd, int err) { + write (fd, &err, sizeof(err)); + exit (1); +} + +void shutItDown() { + fprintf(stdout, "This command is not for general use and should "); + fprintf(stdout, "only be run as the result of a call to\n"); + fprintf(stdout, "ProcessBuilder.start() or Runtime.exec() in a java "); + fprintf(stdout, "application\n"); + _exit(1); +} + +/* + * read the following off the pipefd + * - the ChildStuff struct + * - the SpawnInfo struct + * - the data strings for fields in ChildStuff + */ +void initChildStuff (int fdin, int fdout, ChildStuff *c) { + int n; + int argvBytes, nargv, envvBytes, nenvv; + int dirlen; + char *buf; + SpawnInfo sp; + int bufsize, offset=0; + int magic; + int res; + + res = readFully (fdin, &magic, sizeof(magic)); + if (res != 4 || magic != magicNumber()) { + error (fdout, ERR_PIPE); + } + + if (readFully (fdin, c, sizeof(*c)) == -1) { + error (fdout, ERR_PIPE); + } + + if (readFully (fdin, &sp, sizeof(sp)) == -1) { + error (fdout, ERR_PIPE); + } + + bufsize = sp.argvBytes + sp.envvBytes + + sp.dirlen + sp.parentPathvBytes; + + ALLOC(buf, bufsize); + + if (readFully (fdin, buf, bufsize) == -1) { + error (fdout, ERR_PIPE); + } + + /* Initialize argv[] */ + ALLOC(c->argv, sizeof(char *) * sp.nargv); + initVectorFromBlock (c->argv, buf+offset, sp.nargv-1); + offset += sp.argvBytes; + + /* Initialize envv[] */ + if (sp.nenvv == 0) { + c->envv = 0; + } else { + ALLOC(c->envv, sizeof(char *) * sp.nenvv); + initVectorFromBlock (c->envv, buf+offset, sp.nenvv-1); + offset += sp.envvBytes; + } + + /* Initialize pdir */ + if (sp.dirlen == 0) { + c->pdir = 0; + } else { + c->pdir = buf+offset; + offset += sp.dirlen; + } + + /* Initialize parentPathv[] */ + ALLOC(parentPathv, sizeof (char *) * sp.nparentPathv) + initVectorFromBlock ((const char**)parentPathv, buf+offset, sp.nparentPathv-1); + offset += sp.parentPathvBytes; +} + +int main(int argc, char *argv[]) { + ChildStuff c; + int t; + struct stat buf; + /* argv[0] contains the fd number to read all the child info */ + int r, fdin, fdout; + + r = sscanf (argv[argc-1], "%d:%d", &fdin, &fdout); + if (r == 2 && fcntl(fdin, F_GETFD) != -1) { + fstat(fdin, &buf); + if (!S_ISFIFO(buf.st_mode)) + shutItDown(); + } else { + shutItDown(); + } + initChildStuff (fdin, fdout, &c); + + childProcess (&c); + return 0; /* NOT REACHED */ +}
--- a/src/solaris/native/java/net/NetworkInterface.c Tue Aug 27 13:37:38 2013 +0400 +++ b/src/solaris/native/java/net/NetworkInterface.c Tue Aug 27 21:46:00 2013 -0700 @@ -563,11 +563,9 @@ if ((sock = openSocketWithFallback(env, name_utf)) < 0) { (*env)->ReleaseStringUTFChars(env, name, name_utf); - return -1; + return -1; } - name_utf = (*env)->GetStringUTFChars(env, name, &isCopy); - ret = getFlags(sock, name_utf, &flags); close(sock);
--- a/src/windows/classes/java/lang/ProcessImpl.java Tue Aug 27 13:37:38 2013 +0400 +++ b/src/windows/classes/java/lang/ProcessImpl.java Tue Aug 27 21:46:00 2013 -0700 @@ -491,8 +491,10 @@ /** * Create a process using the win32 function CreateProcess. + * The method is synchronized due to MS kb315939 problem. + * All native handles should restore the inherit flag at the end of call. * - * @param cmdstr the Windows commandline + * @param cmdstr the Windows command line * @param envblock NUL-separated, double-NUL-terminated list of * environment strings in VAR=VALUE form * @param dir the working directory of the process, or null if @@ -508,7 +510,7 @@ * @param redirectErrorStream redirectErrorStream attribute * @return the native subprocess HANDLE returned by CreateProcess */ - private static native long create(String cmdstr, + private static synchronized native long create(String cmdstr, String envblock, String dir, long[] stdHandles,
--- a/src/windows/native/java/io/Console_md.c Tue Aug 27 13:37:38 2013 +0400 +++ b/src/windows/native/java/io/Console_md.c Tue Aug 27 21:46:00 2013 -0700 @@ -38,12 +38,10 @@ { if (hStdIn == INVALID_HANDLE_VALUE && (hStdIn = GetStdHandle(STD_INPUT_HANDLE)) == INVALID_HANDLE_VALUE) { - JNU_ThrowIOExceptionWithLastError(env, "Open Console input failed"); return JNI_FALSE; } if (hStdOut == INVALID_HANDLE_VALUE && (hStdOut = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE) { - JNU_ThrowIOExceptionWithLastError(env, "Open Console output failed"); return JNI_FALSE; } if (GetFileType(hStdIn) != FILE_TYPE_CHAR ||
--- a/src/windows/native/java/io/canonicalize_md.c Tue Aug 27 13:37:38 2013 +0400 +++ b/src/windows/native/java/io/canonicalize_md.c Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2013, Oracle and/or its affiliates. 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 @@ -179,6 +179,10 @@ wdots(WCHAR *start) { WCHAR *p = start; + // Skip "\\.\" prefix + if (wcslen(p) > 4 && !wcsncmp(p, L"\\\\.\\", 4)) + p = p + 4; + while (*p) { if ((p = wcschr(p, L'.')) == NULL) // find next occurence of '.' return 0; // no more dots
--- a/src/windows/native/java/io/io_util_md.c Tue Aug 27 13:37:38 2013 +0400 +++ b/src/windows/native/java/io/io_util_md.c Tue Aug 27 21:46:00 2013 -0700 @@ -251,12 +251,6 @@ free(pathbuf); if (h == INVALID_HANDLE_VALUE) { - int error = GetLastError(); - if (error == ERROR_TOO_MANY_OPEN_FILES) { - JNU_ThrowByName(env, JNU_JAVAIOPKG "IOException", - "Too many open files"); - return -1; - } throwFileNotFoundException(env, path); return -1; }
--- a/src/windows/native/java/lang/ProcessImpl_md.c Tue Aug 27 13:37:38 2013 +0400 +++ b/src/windows/native/java/lang/ProcessImpl_md.c Tue Aug 27 21:46:00 2013 -0700 @@ -113,6 +113,233 @@ CloseHandle(handle); } +static BOOL hasInheritFlag(HANDLE handle) +{ + DWORD mask; + if (GetHandleInformation(handle, &mask)) { + return mask & HANDLE_FLAG_INHERIT; + } + return FALSE; +} + +#define HANDLE_STORAGE_SIZE 6 +#define OFFSET_READ 0 +#define OFFSET_WRITE 1 +//long signed version of INVALID_HANDLE_VALUE +#define JAVA_INVALID_HANDLE_VALUE ((jlong) -1) +#define OPPOSITE_END(offset) (offset==OFFSET_READ ? OFFSET_WRITE : OFFSET_READ) + +/* Pipe holder structure */ +typedef struct _STDHOLDER { + HANDLE pipe[2]; + int offset; +} STDHOLDER; + +/* Responsible for correct initialization of the [pHolder] structure + (that is used for handles recycling) if needs, + and appropriate setup of IOE handle [phStd] for child process based + on created pipe or Java handle. */ +static BOOL initHolder( + JNIEnv *env, + jlong *pjhandles, /* IN OUT - the handle form Java, + that can be a file, console or undefined */ + STDHOLDER *pHolder, /* OUT - initialized structure that holds pipe + handles */ + HANDLE *phStd /* OUT - initialized handle for child process */ +) { + /* Here we test the value from Java against invalid + handle value. We are not using INVALID_HANDLE_VALUE macro + due to double signed/unsigned and 32/64bit ambiguity. + Otherwise it will be easy to get the wrong + value 0x00000000FFFFFFFF + instead 0xFFFFFFFFFFFFFFFF. */ + if (*pjhandles != JAVA_INVALID_HANDLE_VALUE) { + /* Java file or console redirection */ + *phStd = (HANDLE) *pjhandles; + /* Here we set the related Java stream (Process.getXXXXStream()) + to [ProcessBuilder.NullXXXXStream.INSTANCE] value. + The initial Java handle [*pjhandles] will be closed in + ANY case. It is not a handle leak. */ + *pjhandles = JAVA_INVALID_HANDLE_VALUE; + } else { + /* Creation of parent-child pipe */ + if (!CreatePipe( + &pHolder->pipe[OFFSET_READ], + &pHolder->pipe[OFFSET_WRITE], + NULL, /* we would like to inherit + default process access, + instead of 'Everybody' access */ + PIPE_SIZE)) + { + win32Error(env, L"CreatePipe"); + return FALSE; + } else { + /* [thisProcessEnd] has no the inherit flag because + the [lpPipeAttributes] param of [CreatePipe] + had the NULL value. */ + HANDLE thisProcessEnd = pHolder->pipe[OPPOSITE_END(pHolder->offset)]; + *phStd = pHolder->pipe[pHolder->offset]; + *pjhandles = (jlong) thisProcessEnd; + } + } + /* Pipe handle will be closed in the [releaseHolder] call, + file handle will be closed in Java. + The long-live handle need to restore the inherit flag, + we do it later in the [prepareIOEHandleState] call. */ + SetHandleInformation( + *phStd, + HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); + return TRUE; +} + +/* Smart recycling of pipe handles in [pHolder]. For the failed + create process attempts, both ends of pipe need to be released. + The [complete] has the [TRUE] value in the failed attempt. */ +static void releaseHolder(BOOL complete, STDHOLDER *pHolder) { + closeSafely(pHolder->pipe[pHolder->offset]); + if (complete) { + /* Error occur, close this process pipe end */ + closeSafely(pHolder->pipe[OPPOSITE_END(pHolder->offset)]); + } +} + +/* Stores and drops the inherit flag of handles that should not + be shared with the child process by default, but can hold the + inherit flag due to MS process birth specific. */ +static void prepareIOEHandleState( + HANDLE *stdIOE, + BOOL *inherit) +{ + int i; + for (i = 0; i < HANDLE_STORAGE_SIZE; ++i) { + HANDLE hstd = stdIOE[i]; + if (INVALID_HANDLE_VALUE != hstd && hasInheritFlag(hstd)) { + /* FALSE by default */ + inherit[i] = TRUE; + /* Java does not need implicit inheritance for IOE handles, + so we drop inherit flag that probably was installed by + previous CreateProcess call that launched current process. + We will return the handle state back after CreateProcess call. + By clearing inherit flag we prevent "greedy grandchild" birth. + The explicit inheritance for child process IOE handles is + implemented in the [initHolder] call. */ + SetHandleInformation(hstd, HANDLE_FLAG_INHERIT, 0); + } + } +} + +/* Restores the inheritance flag of handles from stored values. */ +static void restoreIOEHandleState( + const HANDLE *stdIOE, + const BOOL *inherit) +{ + /* The set of current process standard IOE handles and + the set of child process IOE handles can intersect. + To restore the inherit flag right, we use backward + array iteration. */ + int i; + for (i = HANDLE_STORAGE_SIZE - 1; i >= 0; --i) + if (INVALID_HANDLE_VALUE != stdIOE[i]) { + /* Restore inherit flag for any case. + The handle can be changed by explicit inheritance.*/ + SetHandleInformation(stdIOE[i], + HANDLE_FLAG_INHERIT, + inherit[i] ? HANDLE_FLAG_INHERIT : 0); + } +} + +/* Please, read about the MS inheritance problem + http://support.microsoft.com/kb/315939 + and critical section/synchronized block solution. */ +static jlong processCreate( + JNIEnv *env, + const jchar *pcmd, + const jchar *penvBlock, + const jchar *pdir, + jlong *handles, + jboolean redirectErrorStream) +{ + jlong ret = 0L; + STARTUPINFOW si = {sizeof(si)}; + + /* Handles for which the inheritance flag must be restored. */ + HANDLE stdIOE[HANDLE_STORAGE_SIZE] = { + /* Current process standard IOE handles: JDK-7147084 */ + INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, + /* Child process IOE handles: JDK-6921885 */ + (HANDLE)handles[0], (HANDLE)handles[1], (HANDLE)handles[2]}; + BOOL inherit[HANDLE_STORAGE_SIZE] = { + FALSE, FALSE, FALSE, + FALSE, FALSE, FALSE}; + + { + /* Extraction of current process standard IOE handles */ + DWORD idsIOE[3] = {STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE}; + int i; + for (i = 0; i < 3; ++i) + /* Should not be closed by CloseHandle! */ + stdIOE[i] = GetStdHandle(idsIOE[i]); + } + + prepareIOEHandleState(stdIOE, inherit); + { + /* Input */ + STDHOLDER holderIn = {{INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE}, OFFSET_READ}; + if (initHolder(env, &handles[0], &holderIn, &si.hStdInput)) { + + /* Output */ + STDHOLDER holderOut = {{INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE}, OFFSET_WRITE}; + if (initHolder(env, &handles[1], &holderOut, &si.hStdOutput)) { + + /* Error */ + STDHOLDER holderErr = {{INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE}, OFFSET_WRITE}; + BOOL success; + if (redirectErrorStream) { + si.hStdError = si.hStdOutput; + /* Here we set the error stream to [ProcessBuilder.NullInputStream.INSTANCE] + value. That is in accordance with Java Doc for the redirection case. + The Java file for the [ handles[2] ] will be closed in ANY case. It is not + a handle leak. */ + handles[2] = JAVA_INVALID_HANDLE_VALUE; + success = TRUE; + } else { + success = initHolder(env, &handles[2], &holderErr, &si.hStdError); + } + + if (success) { + PROCESS_INFORMATION pi; + DWORD processFlag = CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT; + + si.dwFlags = STARTF_USESTDHANDLES; + if (!CreateProcessW( + NULL, /* executable name */ + (LPWSTR)pcmd, /* command line */ + NULL, /* process security attribute */ + NULL, /* thread security attribute */ + TRUE, /* inherits system handles */ + processFlag, /* selected based on exe type */ + (LPVOID)penvBlock,/* environment block */ + (LPCWSTR)pdir, /* change to the new current directory */ + &si, /* (in) startup information */ + &pi)) /* (out) process information */ + { + win32Error(env, L"CreateProcess"); + } else { + closeSafely(pi.hThread); + ret = (jlong)pi.hProcess; + } + } + releaseHolder(ret == 0, &holderErr); + releaseHolder(ret == 0, &holderOut); + } + releaseHolder(ret == 0, &holderIn); + } + } + restoreIOEHandleState(stdIOE, inherit); + + return ret; +} + JNIEXPORT jlong JNICALL Java_java_lang_ProcessImpl_create(JNIEnv *env, jclass ignored, jstring cmd, @@ -121,138 +348,35 @@ jlongArray stdHandles, jboolean redirectErrorStream) { - HANDLE inRead = INVALID_HANDLE_VALUE; - HANDLE inWrite = INVALID_HANDLE_VALUE; - HANDLE outRead = INVALID_HANDLE_VALUE; - HANDLE outWrite = INVALID_HANDLE_VALUE; - HANDLE errRead = INVALID_HANDLE_VALUE; - HANDLE errWrite = INVALID_HANDLE_VALUE; - SECURITY_ATTRIBUTES sa; - PROCESS_INFORMATION pi; - STARTUPINFOW si; - const jchar* pcmd = NULL; - const jchar* pdir = NULL; - const jchar* penvBlock = NULL; - jlong *handles = NULL; jlong ret = 0; - DWORD processFlag; - - assert(cmd != NULL); - pcmd = (*env)->GetStringChars(env, cmd, NULL); - if (pcmd == NULL) goto Catch; - - if (dir != 0) { - pdir = (*env)->GetStringChars(env, dir, NULL); - if (pdir == NULL) goto Catch; - } - if (envBlock != NULL) { - penvBlock = ((*env)->GetStringChars(env, envBlock, NULL)); - if (penvBlock == NULL) goto Catch; - } - assert(stdHandles != NULL); - handles = (*env)->GetLongArrayElements(env, stdHandles, NULL); - if (handles == NULL) goto Catch; - - memset(&si, 0, sizeof(si)); - si.cb = sizeof(si); - si.dwFlags = STARTF_USESTDHANDLES; - - sa.nLength = sizeof(sa); - sa.lpSecurityDescriptor = 0; - sa.bInheritHandle = TRUE; - - if (handles[0] != (jlong) -1) { - si.hStdInput = (HANDLE) handles[0]; - handles[0] = (jlong) -1; - } else { - if (! CreatePipe(&inRead, &inWrite, &sa, PIPE_SIZE)) { - win32Error(env, L"CreatePipe"); - goto Catch; - } - si.hStdInput = inRead; - SetHandleInformation(inWrite, HANDLE_FLAG_INHERIT, 0); - handles[0] = (jlong) inWrite; - } - SetHandleInformation(si.hStdInput, - HANDLE_FLAG_INHERIT, - HANDLE_FLAG_INHERIT); - - if (handles[1] != (jlong) -1) { - si.hStdOutput = (HANDLE) handles[1]; - handles[1] = (jlong) -1; - } else { - if (! CreatePipe(&outRead, &outWrite, &sa, PIPE_SIZE)) { - win32Error(env, L"CreatePipe"); - goto Catch; + if (cmd != NULL && stdHandles != NULL) { + const jchar *pcmd = (*env)->GetStringChars(env, cmd, NULL); + if (pcmd != NULL) { + const jchar *penvBlock = (envBlock != NULL) + ? (*env)->GetStringChars(env, envBlock, NULL) + : NULL; + const jchar *pdir = (dir != NULL) + ? (*env)->GetStringChars(env, dir, NULL) + : NULL; + jlong *handles = (*env)->GetLongArrayElements(env, stdHandles, NULL); + if (handles != NULL) { + ret = processCreate( + env, + pcmd, + penvBlock, + pdir, + handles, + redirectErrorStream); + (*env)->ReleaseLongArrayElements(env, stdHandles, handles, 0); + } + if (pdir != NULL) + (*env)->ReleaseStringChars(env, dir, pdir); + if (penvBlock != NULL) + (*env)->ReleaseStringChars(env, envBlock, penvBlock); + (*env)->ReleaseStringChars(env, cmd, pcmd); } - si.hStdOutput = outWrite; - SetHandleInformation(outRead, HANDLE_FLAG_INHERIT, 0); - handles[1] = (jlong) outRead; } - SetHandleInformation(si.hStdOutput, - HANDLE_FLAG_INHERIT, - HANDLE_FLAG_INHERIT); - - if (redirectErrorStream) { - si.hStdError = si.hStdOutput; - handles[2] = (jlong) -1; - } else if (handles[2] != (jlong) -1) { - si.hStdError = (HANDLE) handles[2]; - handles[2] = (jlong) -1; - } else { - if (! CreatePipe(&errRead, &errWrite, &sa, PIPE_SIZE)) { - win32Error(env, L"CreatePipe"); - goto Catch; - } - si.hStdError = errWrite; - SetHandleInformation(errRead, HANDLE_FLAG_INHERIT, 0); - handles[2] = (jlong) errRead; - } - SetHandleInformation(si.hStdError, - HANDLE_FLAG_INHERIT, - HANDLE_FLAG_INHERIT); - - processFlag = CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT; - ret = CreateProcessW(0, /* executable name */ - (LPWSTR)pcmd, /* command line */ - 0, /* process security attribute */ - 0, /* thread security attribute */ - TRUE, /* inherits system handles */ - processFlag, /* selected based on exe type */ - (LPVOID)penvBlock,/* environment block */ - (LPCWSTR)pdir, /* change to the new current directory */ - &si, /* (in) startup information */ - &pi); /* (out) process information */ - if (!ret) { - win32Error(env, L"CreateProcess"); - goto Catch; - } - - CloseHandle(pi.hThread); - ret = (jlong)pi.hProcess; - - Finally: - /* Always clean up the child's side of the pipes */ - closeSafely(inRead); - closeSafely(outWrite); - closeSafely(errWrite); - - if (pcmd != NULL) - (*env)->ReleaseStringChars(env, cmd, pcmd); - if (pdir != NULL) - (*env)->ReleaseStringChars(env, dir, pdir); - if (penvBlock != NULL) - (*env)->ReleaseStringChars(env, envBlock, penvBlock); - if (handles != NULL) - (*env)->ReleaseLongArrayElements(env, stdHandles, handles, 0); return ret; - - Catch: - /* Clean up the parent's side of the pipes in case of failure only */ - closeSafely(inWrite); - closeSafely(outRead); - closeSafely(errRead); - goto Finally; } JNIEXPORT jint JNICALL
--- a/src/windows/native/sun/java2d/opengl/WGLSurfaceData.c Tue Aug 27 13:37:38 2013 +0400 +++ b/src/windows/native/sun/java2d/opengl/WGLSurfaceData.c Tue Aug 27 21:46:00 2013 -0700 @@ -67,12 +67,13 @@ J2dTraceLn(J2D_TRACE_INFO, "WGLSurfaceData_initOps"); - if (oglsdo == NULL) { - JNU_ThrowOutOfMemoryError(env, "Initialization of SurfaceData failed."); + if (wglsdo == NULL) { + JNU_ThrowOutOfMemoryError(env, "creating native wgl ops"); return; } - if (wglsdo == NULL) { - JNU_ThrowOutOfMemoryError(env, "creating native wgl ops"); + if (oglsdo == NULL) { + free(wglsdo); + JNU_ThrowOutOfMemoryError(env, "Initialization of SurfaceData failed."); return; }
--- a/src/windows/native/sun/security/krb5/NativeCreds.c Tue Aug 27 13:37:38 2013 +0400 +++ b/src/windows/native/sun/security/krb5/NativeCreds.c Tue Aug 27 21:46:00 2013 -0700 @@ -367,11 +367,12 @@ /* * Class: sun_security_krb5_Credentials * Method: acquireDefaultNativeCreds - * Signature: ()Lsun/security/krb5/Credentials; + * Signature: ([I])Lsun/security/krb5/Credentials; */ JNIEXPORT jobject JNICALL Java_sun_security_krb5_Credentials_acquireDefaultNativeCreds( JNIEnv *env, - jclass krbcredsClass) { + jclass krbcredsClass, + jintArray jetypes) { KERB_QUERY_TKT_CACHE_REQUEST CacheRequest; PKERB_RETRIEVE_TKT_RESPONSE TktCacheResponse = NULL; @@ -387,9 +388,12 @@ jobject ticketFlags, startTime, endTime, krbCreds = NULL; jobject authTime, renewTillTime, hostAddresses = NULL; KERB_EXTERNAL_TICKET *msticket; - int ignore_cache = 0; + int found_in_cache = 0; FILETIME Now, EndTime, LocalEndTime; + int i, netypes; + jint *etypes = NULL; + while (TRUE) { if (krbcredsConstructor == 0) { @@ -456,31 +460,33 @@ // got the native MS TGT msticket = &(TktCacheResponse->Ticket); + netypes = (*env)->GetArrayLength(env, jetypes); + etypes = (jint *) (*env)->GetIntArrayElements(env, jetypes, NULL); + // check TGT validity - switch (msticket->SessionKey.KeyType) { - case KERB_ETYPE_DES_CBC_CRC: - case KERB_ETYPE_DES_CBC_MD5: - case KERB_ETYPE_NULL: - case KERB_ETYPE_RC4_HMAC_NT: - GetSystemTimeAsFileTime(&Now); - EndTime.dwLowDateTime = msticket->EndTime.LowPart; - EndTime.dwHighDateTime = msticket->EndTime.HighPart; - FileTimeToLocalFileTime(&EndTime, &LocalEndTime); - if (CompareFileTime(&Now, &LocalEndTime) >= 0) { - ignore_cache = 1; - } - if (msticket->TicketFlags & KERB_TICKET_FLAGS_invalid) { - ignore_cache = 1; - } - break; - case KERB_ETYPE_RC4_MD4: - default: - // not supported - ignore_cache = 1; - break; + if (native_debug) { + printf("LSA: TICKET SessionKey KeyType is %d\n", msticket->SessionKey.KeyType); } - if (ignore_cache) { + if ((msticket->TicketFlags & KERB_TICKET_FLAGS_invalid) == 0) { + GetSystemTimeAsFileTime(&Now); + EndTime.dwLowDateTime = msticket->EndTime.LowPart; + EndTime.dwHighDateTime = msticket->EndTime.HighPart; + FileTimeToLocalFileTime(&EndTime, &LocalEndTime); + if (CompareFileTime(&Now, &LocalEndTime) < 0) { + for (i=0; i<netypes; i++) { + if (etypes[i] == msticket->SessionKey.KeyType) { + found_in_cache = 1; + if (native_debug) { + printf("LSA: Valid etype found: %d\n", etypes[i]); + } + break; + } + } + } + } + + if (!found_in_cache) { if (native_debug) { printf("LSA: MS TGT in cache is invalid/not supported; request new ticket\n"); } @@ -494,34 +500,41 @@ } pTicketRequest->MessageType = KerbRetrieveEncodedTicketMessage; - pTicketRequest->EncryptionType = KERB_ETYPE_DES_CBC_MD5; pTicketRequest->CacheOptions = KERB_RETRIEVE_TICKET_DONT_USE_CACHE; - Status = LsaCallAuthenticationPackage( - LogonHandle, - PackageId, - pTicketRequest, - requestSize, - &pTicketResponse, - &responseSize, - &SubStatus - ); + for (i=0; i<netypes; i++) { + pTicketRequest->EncryptionType = etypes[i]; + Status = LsaCallAuthenticationPackage( + LogonHandle, + PackageId, + pTicketRequest, + requestSize, + &pTicketResponse, + &responseSize, + &SubStatus + ); - if (native_debug) { - printf("LSA: Response size is %d\n", responseSize); - } + if (native_debug) { + printf("LSA: Response size is %d for %d\n", responseSize, etypes[i]); + } - if (!LSA_SUCCESS(Status) || !LSA_SUCCESS(SubStatus)) { - if (!LSA_SUCCESS(Status)) { - ShowNTError("LsaCallAuthenticationPackage", Status); - } else { - ShowNTError("Protocol status", SubStatus); + if (!LSA_SUCCESS(Status) || !LSA_SUCCESS(SubStatus)) { + if (!LSA_SUCCESS(Status)) { + ShowNTError("LsaCallAuthenticationPackage", Status); + } else { + ShowNTError("Protocol status", SubStatus); + } + continue; } + + // got the native MS Kerberos TGT + msticket = &(pTicketResponse->Ticket); break; } + } - // got the native MS Kerberos TGT - msticket = &(pTicketResponse->Ticket); + if (etypes != NULL) { + (*env)->ReleaseIntArrayElements(env, jetypes, etypes, 0); } /* @@ -644,7 +657,7 @@ hostAddresses); break; - } // end of WHILE + } // end of WHILE. This WHILE will never loop. // clean up resources if (TktCacheResponse != NULL) {
--- a/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c Tue Aug 27 13:37:38 2013 +0400 +++ b/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2013, Oracle and/or its affiliates. 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 @@ -91,7 +91,7 @@ * Code copied to target process */ #pragma check_stack (off) -static DWORD WINAPI thread_func(DataBlock *pData) +DWORD WINAPI jvm_attach_thread_func(DataBlock *pData) { HINSTANCE h; EnqueueOperationFunc addr; @@ -117,8 +117,8 @@ } } -/* This function marks the end of thread_func. */ -static void thread_end (void) { +/* This function marks the end of jvm_attach_thread_func. */ +void jvm_attach_thread_func_end (void) { } #pragma check_stack @@ -152,10 +152,10 @@ DWORD len; jbyteArray array; - len = (DWORD)((LPBYTE) thread_end - (LPBYTE) thread_func); + len = (DWORD)((LPBYTE) jvm_attach_thread_func_end - (LPBYTE) jvm_attach_thread_func); array= (*env)->NewByteArray(env, (jsize)len); if (array != NULL) { - (*env)->SetByteArrayRegion(env, array, 0, (jint)len, (jbyte*)&thread_func); + (*env)->SetByteArrayRegion(env, array, 0, (jint)len, (jbyte*)&jvm_attach_thread_func); } return array; }
--- a/test/ProblemList.txt Tue Aug 27 13:37:38 2013 +0400 +++ b/test/ProblemList.txt Tue Aug 27 21:46:00 2013 -0700 @@ -131,13 +131,6 @@ # 7196801 java/lang/management/MemoryMXBean/LowMemoryTest2.sh generic-all -# 8015780 -java/lang/reflect/Method/GenericStringTest.java generic-all - -# 8019845 due to memleak not related to the tested fix -java/lang/instrument/RedefineBigClass.sh linux-x64 -java/lang/instrument/RetransformBigClass.sh linux-x64 - # 8021230 java/lang/ThreadLocal/ThreadLocalSupplierTest.java generic-all @@ -296,9 +289,6 @@ sun/security/krb5/auto/BadKdc3.java solaris-sparcv9 sun/security/krb5/auto/BadKdc4.java solaris-sparcv9 -# 7194428 -sun/security/mscapi/ShortRSAKey1024.sh windows-all - ############################################################################ # jdk_sound @@ -315,9 +305,6 @@ # jdk_time -# 8016623 -java/time/test/java/time/format/TestDateTimeTextProvider.java generic-all - ############################################################################ # jdk_tools @@ -335,8 +322,6 @@ # Tests take too long, on sparcs see 7143279 tools/pack200/CommandLineTests.java solaris-all, macosx-all tools/pack200/Pack200Test.java solaris-all, macosx-all -# 8015666 -tools/pack200/TimeStamp.java generic-all # 8007410 tools/launcher/FXLauncherTest.java linux-all
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/com/sun/crypto/provider/Cipher/RSA/TestOAEPPadding.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. + * + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8020081 8022669 + * @summary encryption/decryption test for using OAEPPadding with + * OAEPParameterSpec specified and not specified during a Cipher.init(). + * @author Anthony Scarpino + */ + +import java.util.Arrays; + +import java.security.Security; +import java.security.Provider; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.MGF1ParameterSpec; + +import javax.crypto.Cipher; +import javax.crypto.spec.OAEPParameterSpec; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.spec.PSource; + + +public class TestOAEPPadding { + private static RSAPrivateKey privateKey; + private static RSAPublicKey publicKey; + static Provider cp; + static boolean failed = false; + + public static void main(String args[]) throws Exception { + cp = Security.getProvider("SunJCE"); + System.out.println("Testing provider " + cp.getName() + "..."); + Provider kfp = Security.getProvider("SunRsaSign"); + KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", kfp); + kpg.initialize(2048); + KeyPair kp = kpg.generateKeyPair(); + privateKey = (RSAPrivateKey)kp.getPrivate(); + publicKey = (RSAPublicKey)kp.getPublic(); + + // Test using a spec with each digest algorithm case + // MD5 + test(new OAEPParameterSpec("MD5", "MGF1", + MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("MD5", "MGF1", + MGF1ParameterSpec.SHA224, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("MD5", "MGF1", + MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("MD5", "MGF1", + MGF1ParameterSpec.SHA384, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("MD5", "MGF1", + MGF1ParameterSpec.SHA512, PSource.PSpecified.DEFAULT)); + // SHA1 + test(new OAEPParameterSpec("SHA1", "MGF1", + MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA1", "MGF1", + MGF1ParameterSpec.SHA224, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA1", "MGF1", + MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA1", "MGF1", + MGF1ParameterSpec.SHA384, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA1", "MGF1", + MGF1ParameterSpec.SHA512, PSource.PSpecified.DEFAULT)); + // For default OAEPParameterSpec case (SHA1) + test(null); + // SHA-224 + test(new OAEPParameterSpec("SHA-224", "MGF1", + MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-224", "MGF1", + MGF1ParameterSpec.SHA224, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-224", "MGF1", + MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-224", "MGF1", + MGF1ParameterSpec.SHA384, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-224", "MGF1", + MGF1ParameterSpec.SHA512, PSource.PSpecified.DEFAULT)); + // SHA-256 + test(new OAEPParameterSpec("SHA-256", "MGF1", + MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-256", "MGF1", + MGF1ParameterSpec.SHA224, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-256", "MGF1", + MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-256", "MGF1", + MGF1ParameterSpec.SHA384, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-256", "MGF1", + MGF1ParameterSpec.SHA512, PSource.PSpecified.DEFAULT)); + // SHA-384 + test(new OAEPParameterSpec("SHA-384", "MGF1", + MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-384", "MGF1", + MGF1ParameterSpec.SHA224, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-384", "MGF1", + MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-384", "MGF1", + MGF1ParameterSpec.SHA384, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-384", "MGF1", + MGF1ParameterSpec.SHA512, PSource.PSpecified.DEFAULT)); + // SHA-512 + test(new OAEPParameterSpec("SHA-512", "MGF1", + MGF1ParameterSpec.SHA1, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-512", "MGF1", + MGF1ParameterSpec.SHA224, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-512", "MGF1", + MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-512", "MGF1", + MGF1ParameterSpec.SHA384, PSource.PSpecified.DEFAULT)); + test(new OAEPParameterSpec("SHA-512", "MGF1", + MGF1ParameterSpec.SHA512, PSource.PSpecified.DEFAULT)); + if (failed) { + throw new Exception("Test failed"); + } + } + + /* + * Test with one byte, the max bytes, and the max + 1 bytes allowed by + * the RSA key size and the digest algorithm + */ + static void test(OAEPParameterSpec spec) throws Exception { + int dlen = 0; + String algo; + + // For default OAEPParameterSpec case (SHA1) + if (spec == null) { + dlen = 20; + algo = "Default"; + } else { + // Use the digest algorith provided in the spec + algo = spec.getDigestAlgorithm(); + if (algo.equals("MD5")) { + dlen = 16; + } else if (algo.equals("SHA1")) { + dlen = 20; + } else if (algo.equals("SHA-224")) { + dlen = 28; + } else if (algo.equals("SHA-256")) { + dlen = 32; + } else if (algo.equals("SHA-384")) { + dlen = 48; + } else if (algo.equals("SHA-512")) { + dlen = 64; + } + } + + // OAEP maximum length for a given digest algorith & RSA key length + int max = ((publicKey.getModulus().bitLength() / 8) - (2 * dlen) - 2); + + // Test with data length of 1 + try { + testEncryptDecrypt(spec, 1); + } catch (Exception e) { + System.out.println(algo + " failed with data length of 1"); + e.printStackTrace(); + failed = true; + } + + // Test with data length of maximum allowed + try { + testEncryptDecrypt(spec, max); + } catch (Exception e) { + System.out.println(algo + " failed with data length of " + max); + e.printStackTrace(); + failed = true; + } + + // Test with data length of maximum allowed + 1 + try { + testEncryptDecrypt(spec, max + 1); + throw new Exception(); + } catch (IllegalBlockSizeException ie) { + // expected to fail + } catch (Exception e) { + System.err.println(algo + " failed with data length of " + + (max + 1)); + e.printStackTrace(); + failed = true; + + } + } + + private static void testEncryptDecrypt(OAEPParameterSpec spec, + int dataLength) throws Exception { + + System.out.print("Testing OAEP with hash "); + if (spec != null) { + System.out.print(spec.getDigestAlgorithm() + " and MGF " + + ((MGF1ParameterSpec)spec.getMGFParameters()). + getDigestAlgorithm()); + } else { + System.out.print("Default"); + } + System.out.println(", " + dataLength + " bytes"); + + Cipher c = Cipher.getInstance("RSA/ECB/OAEPPadding", cp); + if (spec != null) { + c.init(Cipher.ENCRYPT_MODE, publicKey, spec); + } else { + c.init(Cipher.ENCRYPT_MODE, publicKey); + } + + byte[] data = new byte[dataLength]; + byte[] enc = c.doFinal(data); + if (spec != null) { + c.init(Cipher.DECRYPT_MODE, privateKey, spec); + } else { + c.init(Cipher.DECRYPT_MODE, privateKey); + } + byte[] dec = c.doFinal(enc); + if (Arrays.equals(data, dec) == false) { + throw new Exception("Data does not match"); + } + } +}
--- a/test/com/sun/jdi/sde/TemperatureTableTest.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/com/sun/jdi/sde/TemperatureTableTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -7,7 +7,7 @@ * @author Robert Field * * @library .. - * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE + * @run build TestScaffold VMConnection TargetListener TargetAdapter InstallSDE HelloWorld * @run compile TemperatureTableTest.java * @run compile -g TemperatureTableServlet.java * @run main TemperatureTableTest
--- a/test/java/io/File/WinDeviceName.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/io/File/WinDeviceName.java Tue Aug 27 21:46:00 2013 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2013, Oracle and/or its affiliates. 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 @@ -22,11 +22,12 @@ */ /* @test - @bug 6176051 - @summary Check isFile's handling of Windows device names + @bug 6176051 4858457 + @summary Check whether reserved names are handled correctly on Windows */ import java.io.File; +import java.io.IOException; public class WinDeviceName { private static String devnames[] = { @@ -35,22 +36,38 @@ "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9", "CLOCK$" }; - public static void main(String[] args) throws Exception { + public static void main(String[] args) { String osName = System.getProperty("os.name"); if (!osName.startsWith("Windows")) { return; } + for (int i = 0; i < devnames.length; i++) { - if (new File(devnames[i]).isFile() || - new File(devnames[i] + ".txt").isFile()) { - if ("CLOCK$".equals(devnames[i]) && - (osName.startsWith("Windows 9") || - osName.startsWith("Windows Me"))) { - //"CLOCK$" is a reserved device name for NT - continue; + String names[] = { devnames[i], devnames[i] + ".TXT", + devnames[i].toLowerCase(), + devnames[i].toLowerCase() + ".txt" }; + + for (String name : names) { + File f = new File(name); + if (f.isFile()) { + if ("CLOCK$".equals(devnames[i]) && + (osName.startsWith("Windows 9") || + osName.startsWith("Windows Me"))) { + //"CLOCK$" is a reserved device name for NT + continue; + } + throw new RuntimeException("isFile() returns true for " + + "Device name " + devnames[i]); } - throw new Exception("isFile() returns true for Device name " - + devnames[i]); + + if (!"CLOCK$".equals(devnames[i])) { + try { + System.out.println((new File(name)).getCanonicalPath()); + } catch(IOException ie) { + throw new RuntimeException("Fail to get canonical " + + "path for " + name); + } + } } } }
--- a/test/java/lang/Math/ExactArithTests.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/lang/Math/ExactArithTests.java Tue Aug 27 21:46:00 2013 -0700 @@ -132,7 +132,56 @@ fail("FAIL: int Math.multiplyExact(" + x + " * " + y + ")" + "; Unexpected exception: " + ex); } } + try { + // Test incrementExact + int inc = Math.incrementExact(x); + long inc2 = (long) x + 1L; + if ((int) inc2 != inc2) { + fail("FAIL: int Math.incrementExact(" + x + ") = " + inc + "; expected Arithmetic exception"); + } else if (inc != inc2) { + fail("FAIL: long Math.incrementExact(" + x + ") = " + inc + "; expected: " + inc2); + } + } catch (ArithmeticException ex) { + long inc2 = (long) x + 1L; + if ((int) inc2 == inc2) { + fail("FAIL: int Math.incrementExact(" + x + ")" + "; Unexpected exception: " + ex); + } + } + + try { + // Test decrementExact + int dec = Math.decrementExact(x); + long dec2 = (long) x - 1L; + if ((int) dec2 != dec2) { + fail("FAIL: int Math.decrementExact(" + x + ") = " + dec + "; expected Arithmetic exception"); + } else if (dec != dec2) { + fail("FAIL: long Math.decrementExact(" + x + ") = " + dec + "; expected: " + dec2); + } + } catch (ArithmeticException ex) { + long dec2 = (long) x - 1L; + if ((int) dec2 == dec2) { + fail("FAIL: int Math.decrementExact(" + x + ")" + "; Unexpected exception: " + ex); + + } + } + + try { + // Test negateExact + int neg = Math.negateExact(x); + long neg2 = -((long)x) ; + if ((int) neg2 != neg2) { + fail("FAIL: int Math.negateExact(" + x + ") = " + neg + "; expected Arithmetic exception"); + } else if (neg != neg2) { + fail("FAIL: long Math.negateExact(" + x + ") = " + neg + "; expected: " + neg2); + } + } catch (ArithmeticException ex) { + long neg2 = (long) x - 1L; + if ((int) neg2 == neg2) { + fail("FAIL: int Math.negateExact(" + x + ")" + "; Unexpected exception: " + ex); + + } + } } /** @@ -225,6 +274,39 @@ } try { + // Test incrementExact + resultBig = xBig.add(BigInteger.ONE); + long inc = Math.incrementExact(x); + checkResult("long Math.incrementExact", x, 1L, inc, resultBig); + } catch (ArithmeticException ex) { + if (inLongRange(resultBig)) { + fail("FAIL: long Math.incrementExact(" + x + "); Unexpected exception: " + ex); + } + } + + try { + // Test decrementExact + resultBig = xBig.subtract(BigInteger.ONE); + long dec = Math.decrementExact(x); + checkResult("long Math.decrementExact", x, 1L, dec, resultBig); + } catch (ArithmeticException ex) { + if (inLongRange(resultBig)) { + fail("FAIL: long Math.decrementExact(" + x + "); Unexpected exception: " + ex); + } + } + + try { + // Test negateExact + resultBig = xBig.negate(); + long dec = Math.negateExact(x); + checkResult("long Math.negateExact", x, 0L, dec, resultBig); + } catch (ArithmeticException ex) { + if (inLongRange(resultBig)) { + fail("FAIL: long Math.negateExact(" + x + "); Unexpected exception: " + ex); + } + } + + try { // Test toIntExact int value = Math.toIntExact(x); if ((long)value != x) {
--- a/test/java/lang/ProcessBuilder/Basic.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/lang/ProcessBuilder/Basic.java Tue Aug 27 21:46:00 2013 -0700 @@ -26,9 +26,10 @@ * @bug 4199068 4738465 4937983 4930681 4926230 4931433 4932663 4986689 * 5026830 5023243 5070673 4052517 4811767 6192449 6397034 6413313 * 6464154 6523983 6206031 4960438 6631352 6631966 6850957 6850958 - * 4947220 7018606 7034570 4244896 + * 4947220 7018606 7034570 4244896 5049299 * @summary Basic tests for Process and Environment Variable code * @run main/othervm/timeout=300 Basic + * @run main/othervm/timeout=300 -Djdk.lang.Process.launchMechanism=fork Basic * @author Martin Buchholz */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/lang/ProcessBuilder/InheritIOEHandle.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. + * + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 7147084 + * @run main/othervm InheritIOEHandle + * @summary inherit IOE handles and MS CreateProcess limitations (kb315939) + */ + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; + +public class InheritIOEHandle { + private static enum APP { + B, C; + } + private static File stopC = new File(".\\StopC.txt"); + private static String SIGNAL = "After call child process"; + private static String JAVA_EXE = System.getProperty("java.home") + + File.separator + "bin" + + File.separator + "java"; + + private static String[] getCommandArray(String processName) { + String[] cmdArray = { + JAVA_EXE, + "-cp", + System.getProperty("java.class.path"), + InheritIOEHandle.class.getName(), + processName + }; + return cmdArray; + } + + public static void main(String[] args) throws Exception { + if (!System.getProperty("os.name").startsWith("Windows")) { + return; + } + + if (args.length > 0) { + APP app = APP.valueOf(args[0]); + switch (app) { + case B: + performB(); + break; + case C: + performC(); + break; + } + return; + } + performA(); + } + + private static void performA() { + try { + stopC.delete(); + + ProcessBuilder builder = new ProcessBuilder( + getCommandArray(APP.B.name())); + builder.redirectErrorStream(true); + + Process process = builder.start(); + + process.getOutputStream().close(); + process.getErrorStream().close(); + + try (BufferedReader in = new BufferedReader( new InputStreamReader( + process.getInputStream(), "utf-8"))) + { + String result; + while ((result = in.readLine()) != null) { + if (!SIGNAL.equals(result)) { + throw new Error("Catastrophe in process B! Bad output."); + } + } + } + + // If JDK-7147084 is not fixed that point is unreachable. + + // write signal file + stopC.createNewFile(); + + System.err.println("Read stream finished."); + } catch (IOException ex) { + throw new Error("Catastrophe in process A!", ex); + } + } + + private static void performB() { + try { + ProcessBuilder builder = new ProcessBuilder( + getCommandArray(APP.C.name())); + + Process process = builder.start(); + + process.getInputStream().close(); + process.getOutputStream().close(); + process.getErrorStream().close(); + + System.out.println(SIGNAL); + + // JDK-7147084 subject: + // Process C inherits the [System.out] handle and + // handle close in B does not finalize the streaming for A. + // (handle reference count > 1). + } catch (IOException ex) { + throw new Error("Catastrophe in process B!", ex); + } + } + + private static void performC() { + // If JDK-7147084 is not fixed the loop is 5min long. + for (int i = 0; i < 5*60; ++i) { + try { + Thread.sleep(1000); + // check for sucess + if (stopC.exists()) + break; + } catch (InterruptedException ex) { + // that is ok. Longer sleep - better effect. + } + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/lang/ProcessBuilder/SiblingIOEHandle.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. + * + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 6921885 + * @run main/othervm SiblingIOEHandle + * @summary inherit IOE handles and MS CreateProcess limitations (kb315939) + */ + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CyclicBarrier; + +public class SiblingIOEHandle { + private static enum APP { + B, C; + } + private static File stopC = new File(".\\StopCs.txt"); + private static String SIGNAL = "B child reported."; + private static String JAVA_EXE = System.getProperty("java.home") + + File.separator + "bin" + + File.separator + "java"; + + private static String[] getCommandArray(String processName) { + String[] cmdArray = { + JAVA_EXE, + "-cp", + System.getProperty("java.class.path"), + SiblingIOEHandle.class.getName(), + processName + }; + return cmdArray; + } + + public static void main(String[] args) { + if (!System.getProperty("os.name").startsWith("Windows")) { + return; + } + + if (args.length > 0) { + APP app = APP.valueOf(args[0]); + switch (app) { + case B: + performB(); + break; + case C: + performC(); + break; + } + return; + } + performA(true); + performA(false); + } + + static boolean procClaunched = false; + + private static void waitAbit() { + try { + Thread.sleep(0); + } catch (InterruptedException ex) { + // that was long enough + } + } + private static boolean waitBarrier(CyclicBarrier barrier) { + while (true) try { + barrier.await(); + return true; + } catch (InterruptedException ex) { + continue; + } catch (BrokenBarrierException ex) { + ex.printStackTrace(); + return false; + } + } + + private static void performA(boolean fileOut) { + try { + stopC.delete(); + ProcessBuilder builderB = new ProcessBuilder( + getCommandArray(APP.B.name())); + + File outB = null; + if (fileOut) { + outB = new File("outB.txt"); + builderB.redirectOutput(outB); + } + builderB.redirectErrorStream(true); + + final CyclicBarrier barrier = new CyclicBarrier(2); + Thread procCRunner = new Thread(new Runnable() { + @Override public void run() { + try { + if (waitBarrier(barrier)) { + waitAbit(); + // Run process C next to B ASAP to make an attempt + // to capture the B-process IOE handles in C process. + Runtime.getRuntime().exec(getCommandArray(APP.C.name())); + procClaunched = true; + } + } catch (IOException ex) { + ex.printStackTrace(); + } + } + }); + procCRunner.start(); + + + if (!waitBarrier(barrier)) { + throw new Error("Catastrophe in process A! Synchronization failed."); + } + // Run process B first. + Process processB = builderB.start(); + + while (true) try { + procCRunner.join(); + break; + } catch (InterruptedException ex) { + continue; + } + + if (!procClaunched) { + throw new Error("Catastrophe in process A! C was not launched."); + } + + processB.getOutputStream().close(); + processB.getErrorStream().close(); + + if (fileOut) { + try { + processB.waitFor(); + } catch (InterruptedException ex) { + throw new Error("Catastrophe in process B! B hung up."); + } + System.err.println("Trying to delete [outB.txt]."); + if (!outB.delete()) { + throw new Error("Greedy brother C deadlock! File share."); + } + System.err.println("Succeeded in delete [outB.txt]."); + } else { + System.err.println("Read stream start."); + try (BufferedReader in = new BufferedReader( new InputStreamReader( + processB.getInputStream(), "utf-8"))) + { + String result; + while ((result = in.readLine()) != null) { + if (!SIGNAL.equals(result)) { + throw new Error("Catastrophe in process B! Bad output."); + } + } + } + System.err.println("Read stream finished."); + } + // If JDK-6921885 is not fixed that point is unreachable. + // Test timeout exception. + + // write signal file to stop C process. + stopC.createNewFile(); + } catch (IOException ex) { + throw new Error("Catastrophe in process A!", ex); + } + } + + private static void performB() { + System.out.println(SIGNAL); + } + + private static void performC() { + // If JDK-7147084 is not fixed the loop is 5min long. + for (int i = 0; i < 5*60; ++i) { + try { + Thread.sleep(1000); + // check for sucess + if (stopC.exists()) + break; + } catch (InterruptedException ex) { + // that is ok. Longer sleep - better effect. + } + } + } +}
--- a/test/java/lang/invoke/AccessControlTest.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/lang/invoke/AccessControlTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -28,7 +28,7 @@ * @library ../../../.. * @build test.java.lang.invoke.AccessControlTest * @build test.java.lang.invoke.AccessControlTest_subpkg.Acquaintance_remote - * @run junit/othervm test.java.lang.invoke.AccessControlTest + * @run testng/othervm test.java.lang.invoke.AccessControlTest */ package test.java.lang.invoke; @@ -36,12 +36,14 @@ import java.lang.invoke.*; import java.lang.reflect.*; import java.util.*; -import org.junit.*; +import org.testng.*; +import org.testng.annotations.*; import static java.lang.invoke.MethodHandles.*; import static java.lang.invoke.MethodHandles.Lookup.*; import static java.lang.invoke.MethodType.*; -import static org.junit.Assert.*; +import static org.testng.Assert.*; + import test.java.lang.invoke.AccessControlTest_subpkg.Acquaintance_remote;
--- a/test/java/lang/invoke/ClassValueTest.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/lang/invoke/ClassValueTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -26,20 +26,14 @@ /* @test * @summary tests for class-specific values * @compile ClassValueTest.java - * @run junit/othervm test.java.lang.invoke.ClassValueTest - */ - -/* - Manually: - $ $JAVA7X_HOME/bin/javac -d foo -cp $JUNIT4_JAR test/java/lang/invoke/ClassValueTest.java - $ $JAVA7X_HOME/bin/java -cp foo:$JUNIT4_JAR org.junit.runner.JUnitCore test.java.lang.invoke.ClassValueTest - Output: .testAdd => 1000 : Integer + * @run testng/othervm test.java.lang.invoke.ClassValueTest */ package test.java.lang.invoke; -import org.junit.*; -import static org.junit.Assert.*; +import org.testng.*; +import static org.testng.AssertJUnit.*; +import org.testng.annotations.*; /** * @author jrose
--- a/test/java/lang/invoke/InvokeGenericTest.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/lang/invoke/InvokeGenericTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -26,7 +26,7 @@ /* @test * @summary unit tests for java.lang.invoke.MethodHandle.invoke * @compile InvokeGenericTest.java - * @run junit/othervm test.java.lang.invoke.InvokeGenericTest + * @run testng/othervm test.java.lang.invoke.InvokeGenericTest */ package test.java.lang.invoke; @@ -36,10 +36,9 @@ import static java.lang.invoke.MethodType.*; import java.lang.reflect.*; import java.util.*; -import org.junit.*; -import static org.junit.Assert.*; -import static org.junit.Assume.*; - +import org.testng.*; +import static org.testng.AssertJUnit.*; +import org.testng.annotations.*; /** * @@ -71,7 +70,7 @@ String testName; static int allPosTests, allNegTests; int posTests, negTests; - @After + @AfterMethod public void printCounts() { if (verbosity >= 2 && (posTests | negTests) != 0) { System.out.println();
--- a/test/java/lang/invoke/JavaDocExamplesTest.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/lang/invoke/JavaDocExamplesTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -26,19 +26,9 @@ /* @test * @summary example code used in javadoc for java.lang.invoke API * @compile JavaDocExamplesTest.java - * @run junit/othervm test.java.lang.invoke.JavaDocExamplesTest + * @run testng/othervm test.java.lang.invoke.JavaDocExamplesTest */ -/* ----- To run outside jtreg: -$ $JAVA7X_HOME/bin/javac -cp $JUNIT4_JAR -d /tmp/Classes \ - $DAVINCI/sources/jdk/test/java/lang/invoke/JavaDocExamplesTest.java -$ $JAVA7X_HOME/bin/java -cp $JUNIT4_JAR:/tmp/Classes \ - -DJavaDocExamplesTest.verbosity=1 \ - test.java.lang.invoke.JavaDocExamplesTest ----- -*/ - package test.java.lang.invoke; import java.lang.invoke.*; @@ -47,22 +37,21 @@ import java.util.*; -import org.junit.*; -import static org.junit.Assert.*; - +import org.testng.*; +import static org.testng.AssertJUnit.*; +import org.testng.annotations.*; /** * @author jrose */ public class JavaDocExamplesTest { - /** Wrapper for running the JUnit tests in this module. - * Put JUnit on the classpath! + /** Wrapper for running the TestNG tests in this module. + * Put TestNG on the classpath! */ public static void main(String... ignore) throws Throwable { - System.out.println("can run this as:"); - System.out.println("$ java org.junit.runner.JUnitCore "+JavaDocExamplesTest.class.getName()); new JavaDocExamplesTest().run(); } + public void run() throws Throwable { testFindVirtual(); testPermuteArguments();
--- a/test/java/lang/invoke/MethodTypeTest.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/lang/invoke/MethodTypeTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -24,7 +24,7 @@ /* @test * @summary unit tests for java.lang.invoke.MethodType * @compile MethodTypeTest.java - * @run junit/othervm test.java.lang.invoke.MethodTypeTest + * @run testng/othervm test.java.lang.invoke.MethodTypeTest */ package test.java.lang.invoke; @@ -34,8 +34,9 @@ import java.lang.reflect.Method; import java.util.*; -import org.junit.*; -import static org.junit.Assert.*; +import org.testng.*; +import static org.testng.AssertJUnit.*; +import org.testng.annotations.*; /** * @@ -53,7 +54,7 @@ private MethodType[] GALLERY; private Method compareTo; - @Before + @BeforeMethod public void setUp() throws Exception { rtype = void.class; ptypes = new Class<?>[] { int.class, String.class }; @@ -94,7 +95,7 @@ }; } - @After + @AfterMethod public void tearDown() throws Exception { }
--- a/test/java/lang/invoke/PermuteArgsTest.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/lang/invoke/PermuteArgsTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -25,7 +25,7 @@ /* @test * @summary unit tests for method handles which permute their arguments - * @run junit/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-VerifyDependencies -ea -esa -DPermuteArgsTest.MAX_ARITY=8 test.java.lang.invoke.PermuteArgsTest + * @run testng/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-VerifyDependencies -ea -esa -DPermuteArgsTest.MAX_ARITY=8 test.java.lang.invoke.PermuteArgsTest */ /* Examples of manual runs: * java -DPermuteArgsTest.{DRY_RUN=true,MAX_ARITY=253} test.java.lang.invoke.PermuteArgsTest @@ -35,7 +35,8 @@ package test.java.lang.invoke; -import org.junit.*; +import org.testng.*; +import org.testng.annotations.*; import java.util.*; import java.lang.reflect.*;
--- a/test/java/lang/invoke/ThrowExceptionsTest.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/lang/invoke/ThrowExceptionsTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -25,12 +25,13 @@ /* @test * @summary unit tests for method handles which permute their arguments - * @run junit test.java.lang.invoke.ThrowExceptionsTest + * @run testng test.java.lang.invoke.ThrowExceptionsTest */ package test.java.lang.invoke; -import org.junit.*; +import org.testng.*; +import org.testng.annotations.*; import java.util.*; import java.lang.reflect.*;
--- a/test/java/lang/reflect/Method/GenericStringTest.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/lang/reflect/Method/GenericStringTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -48,10 +48,18 @@ if (egs != null) { String actual = method.toGenericString(); System.out.println(actual); - if (! egs.value().equals(actual)) { - failures++; - System.err.printf("ERROR: Expected ''%s''; got ''%s''.\n", - egs.value(), actual); + if (method.isBridge()) { + if (! egs.bridgeValue().equals(actual)) { + failures++; + System.err.printf("ERROR: Expected ''%s''; got ''%s''.\n", + egs.value(), actual); + } + } else { + if (! egs.value().equals(actual)) { + failures++; + System.err.printf("ERROR: Expected ''%s''; got ''%s''.\n", + egs.value(), actual); + } } } @@ -117,7 +125,8 @@ class Roebling implements Comparable<Roebling> { @ExpectedGenericString( - "public int Roebling.compareTo(Roebling)") + value="public int Roebling.compareTo(Roebling)", + bridgeValue="public int Roebling.compareTo(java.lang.Object)") public int compareTo(Roebling r) { throw new IllegalArgumentException(); } @@ -154,9 +163,11 @@ @Retention(RetentionPolicy.RUNTIME) @interface ExpectedGenericString { String value(); + String bridgeValue() default ""; } @Retention(RetentionPolicy.RUNTIME) @interface ExpectedString { String value(); } +
--- a/test/java/math/BigInteger/BigIntegerTest.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/math/BigInteger/BigIntegerTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -74,10 +74,10 @@ static final int ORDER_SMALL = 60; static final int ORDER_MEDIUM = 100; - // #bits for testing Karatsuba and Burnikel-Ziegler + // #bits for testing Karatsuba static final int ORDER_KARATSUBA = 1800; - // #bits for testing Toom-Cook - static final int ORDER_TOOM_COOK = 3000; + // #bits for testing Toom-Cook and Burnikel-Ziegler + static final int ORDER_TOOM_COOK = 4000; // #bits for testing Karatsuba squaring static final int ORDER_KARATSUBA_SQUARE = 3200; // #bits for testing Toom-Cook squaring @@ -964,12 +964,12 @@ nextProbablePrime(); arithmetic(order1); // small numbers - arithmetic(order3); // Karatsuba / Burnikel-Ziegler range - arithmetic(order4); // Toom-Cook range + arithmetic(order3); // Karatsuba range + arithmetic(order4); // Toom-Cook / Burnikel-Ziegler range divideAndRemainder(order1); // small numbers - divideAndRemainder(order3); // Karatsuba / Burnikel-Ziegler range - divideAndRemainder(order4); // Toom-Cook range + divideAndRemainder(order3); // Karatsuba range + divideAndRemainder(order4); // Toom-Cook / Burnikel-Ziegler range pow(order1); pow(order3); @@ -989,8 +989,8 @@ byteArrayConv(order1); modInv(order1); // small numbers - modInv(order3); // Karatsuba / Burnikel-Ziegler range - modInv(order4); // Toom-Cook range + modInv(order3); // Karatsuba range + modInv(order4); // Toom-Cook / Burnikel-Ziegler range modExp(order1, order2); modExp2(order1);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/net/IDN/IllegalArg.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. + * + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8020842 + * @summary IDN do not throw IAE when hostname ends with a trailing dot + */ + +import java.net.*; + +public class IllegalArg { + + public static void main(String[] args) throws Exception { + String[] illegalNames = { + "com..net", + "com..", + ".com", + ".com." + }; + + String[] legalNames = { + "example.com", + "com\u3002", + "com.", + "." + }; + + for (String name : illegalNames) { + try { + IDN.toASCII(name, IDN.USE_STD3_ASCII_RULES); + throw new Exception( + "Expected to get IllegalArgumentException for " + name); + } catch (IllegalArgumentException iae) { + // That's the right behavior. + } + + try { + IDN.toASCII(name); + throw new Exception( + "Expected to get IllegalArgumentException for " + name); + } catch (IllegalArgumentException iae) { + // That's the right behavior. + } + } + + for (String name : legalNames) { + System.out.println("Convering " + name); + System.out.println(IDN.toASCII(name, IDN.USE_STD3_ASCII_RULES)); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/net/NetworkInterface/MemLeakTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. + * + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8022584 + * @summary Some NetworkInterface methods can leak native memory + * @run main/othervm/timeout=700 MemLeakTest + */ + +/* Note: the test can cause a memory leak that's why othervm option is required + */ + +import java.io.BufferedReader; +import java.io.FileReader; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.Collection; +import java.util.Collections; + +public class MemLeakTest { + + /** + * Memory leak is assumed, if application consumes more than specified amount of memory during its execution. + * The number is given in Kb. + */ + private static final long MEM_LEAK_THRESHOLD = 32 * 1024; // 32Mb + + public static void main(String[] args) + throws Exception { + + if (!System.getProperty("os.name").equals("Linux")) { + System.out.println("Test only runs on Linux"); + return; + } + + // warm up + accessNetInterfaces(3); + + long vMemBefore = getVMemSize(); + accessNetInterfaces(500_000); + long vMemAfter = getVMemSize(); + + long vMemDelta = vMemAfter - vMemBefore; + if (vMemDelta > MEM_LEAK_THRESHOLD) { + throw new Exception("FAIL: Virtual memory usage increased by " + vMemDelta + "Kb " + + "(greater than " + MEM_LEAK_THRESHOLD + "Kb)"); + } + + System.out.println("PASS: Virtual memory usage increased by " + vMemDelta + "Kb " + + "(not greater than " + MEM_LEAK_THRESHOLD + "Kb)"); + } + + private static void accessNetInterfaces(int times) { + try { + Collection<NetworkInterface> interfaces = + Collections.list(NetworkInterface.getNetworkInterfaces()); + for (int i = 0; i != times; ++i) { + for (NetworkInterface netInterface : interfaces) { + netInterface.getMTU(); + netInterface.isLoopback(); + netInterface.isUp(); + netInterface.isPointToPoint(); + netInterface.supportsMulticast(); + } + } + } catch (SocketException ignore) {} + } + + /** + * Returns size of virtual memory allocated to the process in Kb. + * Linux specific. On other platforms and in case of any errors returns 0. + */ + private static long getVMemSize() { + + // Refer to the Linux proc(5) man page for details about /proc/self/stat file + // + // In short, this file contains status information about the current process + // written in one line. The fields are separated with spaces. + // The 23rd field is defined as 'vsize %lu Virtual memory size in bytes' + + try (FileReader fileReader = new FileReader("/proc/self/stat"); + BufferedReader bufferedReader = new BufferedReader(fileReader)) { + String line = bufferedReader.readLine(); + return Long.parseLong(line.split(" ")[22]) / 1024; + } catch (Exception ignore) {} + return 0; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/net/ServerSocket/SelectFdsLimit.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. + * + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8021820 + * @summary The total number of file descriptors is limited to + * 1024(FDSET_SIZE) on MacOSX (the size of fd array passed to select() + * call in java.net classes is limited to this value). + * @run main/othervm SelectFdsLimit + * @author aleksej.efimov@oracle.com + */ + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.ServerSocket; +import java.net.SocketTimeoutException; + + +/* + * Test must be run in othervm mode to ensure that all files + * opened by openFiles() are closed propertly. +*/ +public class SelectFdsLimit { + static final int FDTOOPEN = 1023; + static final String TESTFILE = "testfile"; + static FileInputStream [] testFIS; + + static void prepareTestEnv() throws IOException { + File fileToCreate = new File(TESTFILE); + if (!fileToCreate.exists()) + if (!fileToCreate.createNewFile()) + throw new RuntimeException("Can't create test file"); + } + + //If there will be some problem (i.e. ulimits on number of opened files will fail) + //then this method will fail with exception and test will be considered as + //failed. But allocated fds will be released because the test is executed by + //dedicated VM (@run main/othervm). + static void openFiles(int fn, File f) throws FileNotFoundException, IOException { + testFIS = new FileInputStream[FDTOOPEN]; + for (;;) { + if (0 == fn) + break; + FileInputStream fis = new FileInputStream(f); + testFIS[--fn] = fis; + } + } + + public static void main(String [] args) throws IOException, FileNotFoundException { + + //The bug 8021820 is a Mac specific and because of that test will pass on all + //other platforms + if (!System.getProperty("os.name").contains("OS X")) { + return; + } + + //Create test directory with test files + prepareTestEnv(); + + //Consume FD ids for this java process to overflow the 1024 + openFiles(FDTOOPEN,new File(TESTFILE)); + + //Wait for incoming connection and make the select() used in java.net + //classes fail the limitation on FDSET_SIZE + ServerSocket socket = new ServerSocket(0); + + //Set the minimal timeout, no one is + //going to connect to this server socket + socket.setSoTimeout(1); + + // The accept() call will throw SocketException if the + // select() has failed due to limitation on fds size, + // indicating test failure. A SocketTimeoutException + // is expected, so it is caught and ignored, and the test + // passes. + try { + socket.accept(); + } catch (SocketTimeoutException e) { } + } +}
--- a/test/java/net/URLClassLoader/profiles/Basic.java Tue Aug 27 13:37:38 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. 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. - * - * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -import java.net.*; -import java.io.File; -import java.util.jar.*; - -/** - * Attempts to load classes or resources from a JAR file. The load should succeed - * if the runtime supports the profile indicated by the Profile attribute, fail - * with UnsupportedProfileException otherwise. - */ - -public class Basic { - - static int indexOf(String profile) { - if (profile == null || "compact1".equals(profile)) return 1; - if ("compact2".equals(profile)) return 2; - if ("compact3".equals(profile)) return 3; - if ("".equals(profile)) return 4; - return Integer.MAX_VALUE; // unknown profile name - } - - public static void main(String[] args) throws Exception { - if (args.length < 2) - throw new RuntimeException("Usage: java <jarfile> <classname>"); - String jar = args[0]; - String cn = args[1]; - - File lib = new File(jar); - URL url = lib.toURI().toURL(); - URL urls[] = { url }; - - // ## replace this if there is a standard way to determine the profile - String thisProfile = sun.misc.Version.profileName(); - - String jarProfile = null; - try (JarFile jf = new JarFile(lib)) { - Manifest manifest = jf.getManifest(); - if (manifest != null) { - Attributes mainAttrs = manifest.getMainAttributes(); - if (mainAttrs != null) { - jarProfile = mainAttrs.getValue(Attributes.Name.PROFILE); - } - } - } - - boolean shouldFail = indexOf(thisProfile) < indexOf(jarProfile); - - try (URLClassLoader cl = new URLClassLoader(urls)) { - System.out.format("Loading %s from %s ...%n", cn, jar); - Class<?> c = Class.forName(cn, true, cl); - System.out.println(c); - if (shouldFail) - throw new RuntimeException("UnsupportedProfileException expected"); - } catch (UnsupportedProfileException x) { - if (!shouldFail) - throw x; - System.out.println("UnsupportedProfileException thrown as expected"); - } - - try (URLClassLoader cl = new URLClassLoader(urls)) { - System.out.format("Loading resource from %s ...%n", jar); - URL r = cl.findResource("META-INF/MANIFEST.MF"); - System.out.println(r); - if (shouldFail) - throw new RuntimeException("UnsupportedProfileException expected"); - } catch (UnsupportedProfileException x) { - if (!shouldFail) - throw x; - System.out.println("UnsupportedProfileException thrown as expected"); - } - } -} -
--- a/test/java/net/URLClassLoader/profiles/Lib.java Tue Aug 27 13:37:38 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. 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. - * - * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package lib; - -public class Lib { - private Lib() { } - - public static void doSomething() { } -}
--- a/test/java/net/URLClassLoader/profiles/basic.sh Tue Aug 27 13:37:38 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,55 +0,0 @@ -# -# Copyright (c) 2012, Oracle and/or its affiliates. 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. -# -# 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# @test -# @bug 8003255 -# @compile -XDignore.symbol.file Basic.java Lib.java -# @summary Test that UnsupportedProfileException thrown when attempting to -# load classes or resources from a JAR file with the Profile attribute -# @run shell basic.sh - -if [ -z "$TESTJAVA" ]; then - if [ $# -lt 1 ]; then exit 1; fi - TESTJAVA=$1; shift - COMPILEJAVA=$TESTJAVA - TESTSRC=`pwd` - TESTCLASSES=`pwd` -fi - -echo "Creating GoodLib.jar ..." -echo "Profile: compact3" > good.mf -$COMPILEJAVA/bin/jar cvfm GoodLib.jar good.mf -C $TESTCLASSES lib - -echo "Create BadLib.jar ..." -echo "Profile: badname" > bad.mf -$COMPILEJAVA/bin/jar cvfm BadLib.jar bad.mf -C $TESTCLASSES lib - -# remove classes so that they aren't on the classpath -rm -rf $TESTCLASSES/lib - -echo "Test with GoodLib.jar ..." -$TESTJAVA/bin/java -cp $TESTCLASSES Basic GoodLib.jar lib.Lib - -echo "Test with BadLib.jar ..." -$TESTJAVA/bin/java -cp $TESTCLASSES Basic BadLib.jar lib.Lib -
--- a/test/java/nio/channels/ServerSocketChannel/AdaptServerSocket.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/nio/channels/ServerSocketChannel/AdaptServerSocket.java Tue Aug 27 21:46:00 2013 -0700 @@ -35,7 +35,7 @@ public class AdaptServerSocket { static java.io.PrintStream out = System.out; - + static volatile boolean clientStarted = false; static volatile Exception clientException = null; static volatile Thread client = null; @@ -44,15 +44,14 @@ { Thread t = new Thread() { public void run() { - try { - Socket so = new Socket(); + try (Socket so = new Socket()) { out.println("client: " + so); + clientStarted = true; if (dally > 0) Thread.sleep(dally); so.connect(new InetSocketAddress(port)); if (Thread.interrupted()) { out.println("client interrupted"); - so.close(); return; } out.println("client: " + so); @@ -61,7 +60,6 @@ a += 1; so.getOutputStream().write(a); out.println("client: wrote " + a); - so.close(); } catch (Exception x) { if (x instanceof InterruptedException) return; @@ -78,43 +76,44 @@ static void test(int clientDally, int timeout, boolean shouldTimeout) throws Exception { + clientStarted = false; out.println(); - ServerSocketChannel ssc = ServerSocketChannel.open(); - ServerSocket sso = ssc.socket(); - out.println("created: " + ssc); - out.println(" " + sso); - if (timeout != 0) - sso.setSoTimeout(timeout); - out.println("timeout: " + sso.getSoTimeout()); - sso.bind(null); - out.println("bound: " + ssc); - out.println(" " + sso); - startClient(sso.getLocalPort(), clientDally); - Thread.sleep(10); + try (ServerSocketChannel ssc = ServerSocketChannel.open(); + ServerSocket sso = ssc.socket()) { + out.println("created: " + ssc); + out.println(" " + sso); + if (timeout != 0) + sso.setSoTimeout(timeout); + out.println("timeout: " + sso.getSoTimeout()); + sso.bind(null); + out.println("bound: " + ssc); + out.println(" " + sso); + startClient(sso.getLocalPort(), clientDally); + while (!clientStarted) { + Thread.sleep(20); + } + Socket so = null; + try { + so = sso.accept(); + } catch (SocketTimeoutException x) { + if (shouldTimeout) + out.println("Accept timed out, as expected"); + else + throw x; + } + if (shouldTimeout && (so != null)) + throw new Exception("Accept did not time out"); - Socket so = null; - try { - so = sso.accept(); - } catch (SocketTimeoutException x) { - if (shouldTimeout) - out.println("Accept timed out, as expected"); - else - throw x; + if (so != null) { + int a = 42; + so.getOutputStream().write(a); + int b = so.getInputStream().read(); + if (b != a + 1) + throw new Exception("Read incorrect data"); + out.println("server: read " + b); + } } - if (shouldTimeout && (so != null)) - throw new Exception("Accept did not time out"); - - if (so != null) { - int a = 42; - so.getOutputStream().write(a); - int b = so.getInputStream().read(); - if (b != a + 1) - throw new Exception("Read incorrect data"); - out.println("server: read " + b); - sso.close(); - } - client.interrupt(); client.join(); if (clientException != null)
--- a/test/java/time/tck/java/time/chrono/TCKChronology.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/time/tck/java/time/chrono/TCKChronology.java Tue Aug 27 21:46:00 2013 -0700 @@ -148,7 +148,7 @@ @DataProvider(name = "calendarDisplayName") Object[][] data_of_calendarDisplayNames() { return new Object[][] { - {"Hijrah", "Hijrah-umalqura"}, + {"Hijrah", "Islamic Umm al-Qura Calendar"}, {"ISO", "ISO"}, {"Japanese", "Japanese Calendar"}, {"Minguo", "Minguo Calendar"},
--- a/test/java/time/test/java/time/chrono/TestUmmAlQuraChronology.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/time/test/java/time/chrono/TestUmmAlQuraChronology.java Tue Aug 27 21:46:00 2013 -0700 @@ -438,13 +438,13 @@ // Test to verify the formatted dates @Test(dataProvider="patternMonthNames") public void test_ofPattern(int year, int month, int day, String expected) { - DateTimeFormatter test = DateTimeFormatter.ofPattern("dd G E MMMM yyyy"); + DateTimeFormatter test = DateTimeFormatter.ofPattern("dd G E MMMM yyyy", Locale.US); assertEquals(test.format(HijrahDate.of(year, month, day)), expected); } // Data provider for localized dates @DataProvider(name="chronoDateTimes") - Object[][] data_chronodatetimes() { + Object[][] data_chronodatetimes() { return new Object[][] { {1432, 12, 29, "Safar 1, 1434 AH"}, {1433, 1, 30, "Safar 30, 1434 AH"}, @@ -463,7 +463,7 @@ hdt = hdt.plus(1, ChronoUnit.HOURS); hdt = hdt.plus(1, ChronoUnit.MINUTES); hdt = hdt.plus(1, ChronoUnit.SECONDS); - DateTimeFormatter df = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).withChronology(Chronology.of("Hijrah-umalqura")).withLocale(Locale.forLanguageTag("en-US")); + DateTimeFormatter df = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).withChronology(Chronology.of("Hijrah-umalqura")).withLocale(Locale.US); assertEquals(df.format(hdt), expected); }
--- a/test/java/time/test/java/time/format/TestNonIsoFormatter.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/time/test/java/time/format/TestNonIsoFormatter.java Tue Aug 27 21:46:00 2013 -0700 @@ -110,7 +110,7 @@ // Chronology, Locale, Chronology Name { ISO8601, Locale.ENGLISH, "ISO" }, // No data in CLDR; Use Id. { BUDDHIST, Locale.ENGLISH, "Buddhist Calendar" }, - { HIJRAH, Locale.ENGLISH, "Hijrah-umalqura" }, // No data in CLDR; Use Id. + { HIJRAH, Locale.ENGLISH, "Islamic Umm al-Qura Calendar" }, // JDK-8015986 { JAPANESE, Locale.ENGLISH, "Japanese Calendar" }, { MINGUO, Locale.ENGLISH, "Minguo Calendar" }, @@ -121,6 +121,10 @@ { ISO8601, thTH, "ISO" }, // No data in CLDR; Use Id. { JAPANESE, thTH, "\u0e1b\u0e0f\u0e34\u0e17\u0e34\u0e19\u0e0d\u0e35\u0e48\u0e1b\u0e38\u0e48\u0e19" }, { BUDDHIST, thTH, "\u0e1b\u0e0f\u0e34\u0e17\u0e34\u0e19\u0e1e\u0e38\u0e17\u0e18" }, + + { HIJRAH, ARABIC, "\u0644\u062a\u0642\u0648\u064a\u0645 " + + "\u0627\u0644\u0647\u062c\u0631\u064a\u060c " + + "\u0623\u0645 \u0627\u0644\u0642\u0631\u0649" }, // JDK-8015986 }; }
--- a/test/java/time/test/java/util/TestFormatter.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/time/test/java/util/TestFormatter.java Tue Aug 27 21:46:00 2013 -0700 @@ -22,16 +22,27 @@ */ package test.java.util; +import static org.testng.Assert.assertEquals; + import java.time.Instant; +import java.time.LocalTime; import java.time.OffsetDateTime; import java.time.ZonedDateTime; import java.time.ZoneId; + +import java.time.chrono.ChronoLocalDate; +import java.time.chrono.ChronoLocalDateTime; +import java.time.chrono.ChronoZonedDateTime; +import java.time.chrono.Chronology; + import java.time.temporal.ChronoField; +import java.time.temporal.TemporalQuery; +import java.time.temporal.TemporalAccessor; import java.util.*; +import org.testng.annotations.DataProvider; import org.testng.annotations.Test; -import static org.testng.Assert.assertEquals; /* @test * @summary Unit test for j.u.Formatter threeten date/time support @@ -57,18 +68,32 @@ private int total = 0; private int failure = 0; - private boolean verbose = true; + private boolean verbose = false; - @Test - public void test () { + @DataProvider(name = "calendarsByLocale") + Object[][] data_calendars() { + return new Object[][] { + {"en_US"}, + {"th_TH"}, + {"ja-JP-u-ca-japanese"}, + }; + } + @Test(dataProvider="calendarsByLocale") + public void test (String calendarLocale) { + failure = 0; int N = 12; //locales = Locale.getAvailableLocales(); Locale[] locales = new Locale[] { Locale.ENGLISH, Locale.FRENCH, Locale.JAPANESE, Locale.CHINESE}; Random r = new Random(); - ZonedDateTime zdt0 = ZonedDateTime.now(); - ZonedDateTime[] zdts = new ZonedDateTime[] { + + Locale calLocale = Locale.forLanguageTag(calendarLocale); + Chronology chrono = Chronology.ofLocale(calLocale); + ChronoLocalDate now = chrono.dateNow(); + ChronoLocalDateTime<?> ldt0 = now.atTime(LocalTime.now()); + ChronoZonedDateTime<?> zdt0 = ldt0.atZone(ZoneId.systemDefault()); + ChronoZonedDateTime<?>[] zdts = new ChronoZonedDateTime<?>[] { zdt0, zdt0.withZoneSameLocal(ZoneId.of("UTC")), zdt0.withZoneSameLocal(ZoneId.of("GMT")), @@ -76,11 +101,11 @@ }; while (N-- > 0) { - for (ZonedDateTime zdt : zdts) { - zdt = zdt.withDayOfYear(r.nextInt(365) + 1) + for (ChronoZonedDateTime<?> zdt : zdts) { + zdt = zdt.with(ChronoField.DAY_OF_YEAR, (r.nextInt(365) + 1)) .with(ChronoField.SECOND_OF_DAY, r.nextInt(86400)); Instant instant = zdt.toInstant(); - Calendar cal = Calendar.getInstance(); + Calendar cal = Calendar.getInstance(calLocale); cal.setTimeInMillis(instant.toEpochMilli()); cal.setTimeZone(TimeZone.getTimeZone(zdt.getZone())); for (Locale locale : locales) { @@ -106,8 +131,19 @@ } private String getClassName(Object o) { - Class c = o.getClass(); - return c.getName().substring(c.getPackage().getName().length() + 1); + Class<?> c = o.getClass(); + String clname = c.getName().substring(c.getPackage().getName().length() + 1); + if (o instanceof TemporalAccessor) { + Chronology chrono = ((TemporalAccessor)o).query(TemporalQuery.chronology()); + if (chrono != null) { + clname = clname + "(" + chrono.getId() + ")"; + } + } + if (o instanceof Calendar) { + String type = ((Calendar)o).getCalendarType(); + clname = clname + "(" + type + ")"; + } + return clname; } private String test(String fmtStr, Locale locale, @@ -115,12 +151,12 @@ String out = new Formatter( new StringBuilder(), locale).format(fmtStr, dt).out().toString(); if (verbose) { - System.out.printf("%-18s : %s%n", getClassName(dt), out); + System.out.printf("%-24s : %s%n", getClassName(dt), out); } if (expected != null && !out.equals(expected)) { - System.out.printf("=====>%-18s : %s [ FAILED expected: %s ]%n", + System.out.printf("%-24s actual: %s%n FAILED; expected: %s%n", getClassName(dt), out, expected); - new RuntimeException().printStackTrace(); + new RuntimeException().printStackTrace(System.out); failure++; } total++; @@ -135,24 +171,29 @@ } private void testDate(String fmtStr, Locale locale, - ZonedDateTime zdt, Calendar cal) { + ChronoZonedDateTime<?> zdt, Calendar cal) { printFmtStr(locale, fmtStr); String expected = test(fmtStr, locale, null, cal); test(fmtStr, locale, expected, zdt); - test(fmtStr, locale, expected, zdt.toOffsetDateTime()); test(fmtStr, locale, expected, zdt.toLocalDateTime()); test(fmtStr, locale, expected, zdt.toLocalDate()); + if (zdt instanceof ZonedDateTime) { + test(fmtStr, locale, expected, ((ZonedDateTime)zdt).toOffsetDateTime()); + } } private void testTime(String fmtStr, Locale locale, - ZonedDateTime zdt, Calendar cal) { + ChronoZonedDateTime<?> zdt, Calendar cal) { printFmtStr(locale, fmtStr); String expected = test(fmtStr, locale, null, cal); test(fmtStr, locale, expected, zdt); - test(fmtStr, locale, expected, zdt.toOffsetDateTime()); test(fmtStr, locale, expected, zdt.toLocalDateTime()); - test(fmtStr, locale, expected, zdt.toOffsetDateTime().toOffsetTime()); test(fmtStr, locale, expected, zdt.toLocalTime()); + if (zdt instanceof ZonedDateTime) { + OffsetDateTime odt = ((ZonedDateTime)zdt).toOffsetDateTime(); + test(fmtStr, locale, expected, odt); + test(fmtStr, locale, expected, odt.toOffsetTime()); + } } private String toZoneIdStr(String expected) { @@ -164,7 +205,7 @@ .replaceAll("GMT|UTC|UT", "Z"); } - private void testZoneId(Locale locale, ZonedDateTime zdt, Calendar cal) { + private void testZoneId(Locale locale, ChronoZonedDateTime<?> zdt, Calendar cal) { String fmtStr = "z:[%tz] z:[%1$Tz] Z:[%1$tZ] Z:[%1$TZ]"; printFmtStr(locale, fmtStr); String expected = toZoneIdStr(test(fmtStr, locale, null, cal)); @@ -174,8 +215,11 @@ cal0.setTimeInMillis(zdt.toInstant().toEpochMilli()); cal0.setTimeZone(TimeZone.getTimeZone("GMT" + zdt.getOffset().getId())); expected = toZoneOffsetStr(test(fmtStr, locale, null, cal0)); - test(fmtStr, locale, expected, zdt.toOffsetDateTime()); - test(fmtStr, locale, expected, zdt.toOffsetDateTime().toOffsetTime()); + if (zdt instanceof ZonedDateTime) { + OffsetDateTime odt = ((ZonedDateTime)zdt).toOffsetDateTime(); + test(fmtStr, locale, expected, odt); + test(fmtStr, locale, expected, odt.toOffsetTime()); + } // datetime + zid fmtStr = "c:[%tc] c:[%1$Tc]"; @@ -185,12 +229,15 @@ } private void testInstant(Locale locale, Instant instant, - ZonedDateTime zdt, Calendar cal) { + ChronoZonedDateTime<?> zdt, Calendar cal) { String fmtStr = "s:[%ts] s:[%1$Ts] Q:[%1$tQ] Q:[%1$TQ]"; printFmtStr(locale, fmtStr); String expected = test(fmtStr, locale, null, cal); test(fmtStr, locale, expected, instant); test(fmtStr, locale, expected, zdt); - test(fmtStr, locale, expected, zdt.toOffsetDateTime()); + if (zdt instanceof ZonedDateTime) { + OffsetDateTime odt = ((ZonedDateTime)zdt).toOffsetDateTime(); + test(fmtStr, locale, expected, odt); + } } }
--- a/test/java/util/Collection/ListDefaults.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/util/Collection/ListDefaults.java Tue Aug 27 21:46:00 2013 -0700 @@ -49,6 +49,7 @@ /** * @test + * @bug 8023367 * @library testlibrary * @build CollectionAsserts CollectionSupplier * @run testng ListDefaults @@ -100,6 +101,7 @@ @DataProvider(name="listProvider", parallel=true) public static Object[][] listCases() { final List<Object[]> cases = new LinkedList<>(); + cases.add(new Object[] { Collections.emptyList() }); cases.add(new Object[] { new ArrayList<>() }); cases.add(new Object[] { new LinkedList<>() }); cases.add(new Object[] { new Vector<>() }); @@ -128,6 +130,11 @@ list.removeIf(null); fail("expected NPE not thrown"); } catch (NullPointerException npe) {} + try { + list.sort(null); + } catch (Throwable t) { + fail("Exception not expected: " + t); + } } @Test
--- a/test/java/util/Collection/MOAT.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/util/Collection/MOAT.java Tue Aug 27 21:46:00 2013 -0700 @@ -30,7 +30,6 @@ * @summary Run many tests on many Collection and Map implementations * @author Martin Buchholz * @run main MOAT - * @run main/othervm -XX:+AggressiveOpts MOAT */ /* Mother Of All (Collection) Tests
--- a/test/java/util/Comparator/TypeTest.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/util/Comparator/TypeTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -75,7 +75,7 @@ } } - public static void main(String[] args) { + public void testOrder() { Manager m1 = new Manager("Manager", 2, 2000); Manager m2 = new Manager("Manager", 4, 1300);
--- a/test/java/util/Currency/tablea1.txt Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/util/Currency/tablea1.txt Tue Aug 27 21:46:00 2013 -0700 @@ -1,12 +1,12 @@ # # -# Amendments up until ISO 4217 AMENDMENT NUMBER 155 -# (As of 11 April 2013) +# Amendments up until ISO 4217 AMENDMENT NUMBER 156 +# (As of 23 July 2013) # # Version FILEVERSION=1 -DATAVERSION=155 +DATAVERSION=156 # ISO 4217 currency data AF AFN 971 2 @@ -135,7 +135,7 @@ KW KWD 414 3 KG KGS 417 2 LA LAK 418 2 -LV LVL 428 2 +LV LVL 428 2 2013-12-31-22-00-00 EUR 978 2 LB LBP 422 2 #LS ZAR 710 2 LS LSL 426 2
--- a/test/java/util/Spliterator/SpliteratorCharacteristics.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/util/Spliterator/SpliteratorCharacteristics.java Tue Aug 27 21:46:00 2013 -0700 @@ -23,7 +23,7 @@ /** * @test - * @bug 8020156 8020009 + * @bug 8020156 8020009 8022326 * @run testng SpliteratorCharacteristics */ @@ -32,80 +32,134 @@ import java.util.Arrays; import java.util.Collection; import java.util.Comparator; +import java.util.Map; +import java.util.Set; +import java.util.SortedMap; +import java.util.SortedSet; import java.util.Spliterator; import java.util.TreeMap; import java.util.TreeSet; +import java.util.concurrent.ConcurrentSkipListMap; +import java.util.concurrent.ConcurrentSkipListSet; import static org.testng.Assert.*; @Test public class SpliteratorCharacteristics { - public void testTreeMap() { - TreeMap<Integer, String> tm = new TreeMap<>(); - tm.put(1, "4"); - tm.put(2, "3"); - tm.put(3, "2"); - tm.put(4, "1"); + // TreeMap - assertCharacteristics(tm.keySet(), - Spliterator.SIZED | Spliterator.DISTINCT | - Spliterator.SORTED | Spliterator.ORDERED); - assertNullComparator(tm.keySet()); - - assertCharacteristics(tm.values(), - Spliterator.SIZED | Spliterator.ORDERED); - assertISEComparator(tm.values()); - - assertCharacteristics(tm.entrySet(), - Spliterator.SIZED | Spliterator.DISTINCT | - Spliterator.SORTED | Spliterator.ORDERED); - assertNotNullComparator(tm.entrySet()); + public void testTreeMap() { + assertSortedMapCharacteristics(new TreeMap<>(), + Spliterator.SIZED | Spliterator.DISTINCT | + Spliterator.SORTED | Spliterator.ORDERED); } public void testTreeMapWithComparator() { - TreeMap<Integer, String> tm = new TreeMap<>(Comparator.<Integer>reverseOrder()); - tm.put(1, "4"); - tm.put(2, "3"); - tm.put(3, "2"); - tm.put(4, "1"); - - assertCharacteristics(tm.keySet(), - Spliterator.SIZED | Spliterator.DISTINCT | - Spliterator.SORTED | Spliterator.ORDERED); - assertNotNullComparator(tm.keySet()); - - assertCharacteristics(tm.values(), - Spliterator.SIZED | Spliterator.ORDERED); - assertISEComparator(tm.values()); - - assertCharacteristics(tm.entrySet(), - Spliterator.SIZED | Spliterator.DISTINCT | - Spliterator.SORTED | Spliterator.ORDERED); - assertNotNullComparator(tm.entrySet()); + assertSortedMapCharacteristics(new TreeMap<>(Comparator.reverseOrder()), + Spliterator.SIZED | Spliterator.DISTINCT | + Spliterator.SORTED | Spliterator.ORDERED); } - public void testTreeSet() { - TreeSet<Integer> ts = new TreeSet<>(); - ts.addAll(Arrays.asList(1, 2, 3, 4)); + + // TreeSet - assertCharacteristics(ts, - Spliterator.SIZED | Spliterator.DISTINCT | - Spliterator.SORTED | Spliterator.ORDERED); - assertNullComparator(ts); + public void testTreeSet() { + assertSortedSetCharacteristics(new TreeSet<>(), + Spliterator.SIZED | Spliterator.DISTINCT | + Spliterator.SORTED | Spliterator.ORDERED); } public void testTreeSetWithComparator() { - TreeSet<Integer> ts = new TreeSet<>(Comparator.reverseOrder()); - ts.addAll(Arrays.asList(1, 2, 3, 4)); + assertSortedSetCharacteristics(new TreeSet<>(Comparator.reverseOrder()), + Spliterator.SIZED | Spliterator.DISTINCT | + Spliterator.SORTED | Spliterator.ORDERED); + } + + + // ConcurrentSkipListMap + + public void testConcurrentSkipListMap() { + assertSortedMapCharacteristics(new ConcurrentSkipListMap<>(), + Spliterator.CONCURRENT | Spliterator.NONNULL | + Spliterator.DISTINCT | Spliterator.SORTED | + Spliterator.ORDERED); + } - assertCharacteristics(ts, - Spliterator.SIZED | Spliterator.DISTINCT | - Spliterator.SORTED | Spliterator.ORDERED); - assertNotNullComparator(ts); + public void testConcurrentSkipListMapWithComparator() { + assertSortedMapCharacteristics(new ConcurrentSkipListMap<>(Comparator.<Integer>reverseOrder()), + Spliterator.CONCURRENT | Spliterator.NONNULL | + Spliterator.DISTINCT | Spliterator.SORTED | + Spliterator.ORDERED); + } + + + // ConcurrentSkipListSet + + public void testConcurrentSkipListSet() { + assertSortedSetCharacteristics(new ConcurrentSkipListSet<>(), + Spliterator.CONCURRENT | Spliterator.NONNULL | + Spliterator.DISTINCT | Spliterator.SORTED | + Spliterator.ORDERED); + } + + public void testConcurrentSkipListSetWithComparator() { + assertSortedSetCharacteristics(new ConcurrentSkipListSet<>(Comparator.reverseOrder()), + Spliterator.CONCURRENT | Spliterator.NONNULL | + Spliterator.DISTINCT | Spliterator.SORTED | + Spliterator.ORDERED); } + // + + void assertSortedMapCharacteristics(SortedMap<Integer, String> m, int keyCharacteristics) { + initMap(m); + + boolean hasComparator = m.comparator() != null; + + Set<Integer> keys = m.keySet(); + assertCharacteristics(keys, keyCharacteristics); + if (hasComparator) { + assertNotNullComparator(keys); + } + else { + assertNullComparator(keys); + } + + assertCharacteristics(m.values(), + keyCharacteristics & ~(Spliterator.DISTINCT | Spliterator.SORTED)); + assertISEComparator(m.values()); + + assertCharacteristics(m.entrySet(), keyCharacteristics); + assertNotNullComparator(m.entrySet()); + } + + void assertSortedSetCharacteristics(SortedSet<Integer> s, int keyCharacteristics) { + initSet(s); + + boolean hasComparator = s.comparator() != null; + + assertCharacteristics(s, keyCharacteristics); + if (hasComparator) { + assertNotNullComparator(s); + } + else { + assertNullComparator(s); + } + } + + void initMap(Map<Integer, String> m) { + m.put(1, "4"); + m.put(2, "3"); + m.put(3, "2"); + m.put(4, "1"); + } + + void initSet(Set<Integer> s) { + s.addAll(Arrays.asList(1, 2, 3, 4)); + } + void assertCharacteristics(Collection<?> c, int expectedCharacteristics) { assertCharacteristics(c.spliterator(), expectedCharacteristics); }
--- a/test/java/util/Spliterator/SpliteratorCollisions.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/util/Spliterator/SpliteratorCollisions.java Tue Aug 27 21:46:00 2013 -0700 @@ -148,7 +148,6 @@ List<Object[]> data = new ArrayList<>(); for (int size : SIZES) { List<HashableInteger> exp = listIntRange(size, true); - exp.add(0, null); SpliteratorDataBuilder<HashableInteger> db = new SpliteratorDataBuilder<>(data, exp); // Maps
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/util/jar/JarInputStream/ExtraFileInMetaInf.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. + * + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8021788 + * @summary JarInputStream doesn't provide certificates for some file under META-INF + */ + +import java.util.jar.*; +import java.io.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +public class ExtraFileInMetaInf { + public static void main(String args[]) throws Exception { + + // Create a zip file with 2 entries + try (ZipOutputStream zos = + new ZipOutputStream(new FileOutputStream("x.jar"))) { + zos.putNextEntry(new ZipEntry("META-INF/SUB/file")); + zos.write(new byte[10]); + zos.putNextEntry(new ZipEntry("x")); + zos.write(new byte[10]); + zos.close(); + } + + // Sign it + new File("ks").delete(); + sun.security.tools.keytool.Main.main( + ("-keystore ks -storepass changeit -keypass changeit " + + "-alias a -dname CN=A -genkeypair").split(" ")); + sun.security.tools.jarsigner.Main.main( + "-keystore ks -storepass changeit x.jar a".split(" ")); + + // Check if the entries are signed + try (JarInputStream jis = + new JarInputStream(new FileInputStream("x.jar"))) { + JarEntry je; + while ((je = jis.getNextJarEntry()) != null) { + String name = je.toString(); + if (name.equals("META-INF/SUB/file") || name.equals("x")) { + while (jis.read(new byte[1000]) >= 0); + if (je.getCertificates() == null) { + throw new Exception(name + " not signed"); + } + } + } + } + } +}
--- a/test/java/util/logging/bundlesearch/ResourceBundleSearchTest.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/util/logging/bundlesearch/ResourceBundleSearchTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -57,9 +57,32 @@ private static int numFail = 0; private static List<String> msgs = new ArrayList<>(); + // This test has been falling in timeout - so we're adding some + // time stamp here and there to help diagnose whether it's a + // simple system slowness or whether there's a deeper issue, + // like a deadlock. The timeout issue should be fixed now, + // but we leave the time stamps in case it reappears. + // + static final long stamp = System.currentTimeMillis(); + private static String getTimeStamp() { + long time = System.currentTimeMillis(); + long delta = time - stamp; + long min = delta/60000; + long sec = (delta - min * 60000) / 10000; + long msec = delta - min * 60000 - sec * 1000; + return (min == 0 ? "" : (min + " min. ")) + + (sec == 0 ? "" : (sec + " sec. ")) + + (msec == 0 ? "" : (msec + "ms.")); + } + public static void main(String[] args) throws Throwable { + System.out.println("ResourceBundleSearchTest starting: "+getTimeStamp()); ResourceBundleSearchTest test = new ResourceBundleSearchTest(); - test.runTests(); + try { + test.runTests(); + } finally { + System.out.println("ResourceBundleSearchTest terminated: "+getTimeStamp()); + } } private void runTests() throws Throwable { @@ -77,15 +100,19 @@ urls[0] = Paths.get(testDir, "resources").toUri().toURL(); URLClassLoader rbClassLoader = new URLClassLoader(urls); + int testnb = 1; + System.out.println("ResourceBundleSearchTest starting test #"+(testnb++)+": "+getTimeStamp()); // Test 1 - can we find a Logger bundle from doing a stack search? // We shouldn't be able to assertFalse(testGetBundleFromStackSearch(), "1-testGetBundleFromStackSearch"); + System.out.println("ResourceBundleSearchTest starting test #"+(testnb++)+": "+getTimeStamp()); // Test 2 - can we find a Logger bundle off of the Thread context class // loader? We should be able to. assertTrue(testGetBundleFromTCCL(TCCL_TEST_BUNDLE, rbClassLoader), "2-testGetBundleFromTCCL"); + System.out.println("ResourceBundleSearchTest starting test #"+(testnb++)+": "+getTimeStamp()); // Test 3 - Can we find a Logger bundle from the classpath? We should be // able to. We'll first check to make sure the setup is correct and // it actually is on the classpath before checking whether logging @@ -99,21 +126,25 @@ + " on the classpath"); } + System.out.println("ResourceBundleSearchTest starting test #"+(testnb++)+": "+getTimeStamp()); // Test 4 - we should be able to find a bundle from the caller's // classloader, but only one level up. assertTrue(testGetBundleFromCallersClassLoader(), "4-testGetBundleFromCallersClassLoader"); + System.out.println("ResourceBundleSearchTest starting test #"+(testnb++)+": "+getTimeStamp()); // Test 5 - this ensures that getAnonymousLogger(String rbName) // can find the bundle from the caller's classloader assertTrue(testGetAnonymousLogger(), "5-testGetAnonymousLogger"); + System.out.println("ResourceBundleSearchTest starting test #"+(testnb++)+": "+getTimeStamp()); // Test 6 - first call getLogger("myLogger"). // Then call getLogger("myLogger","bundleName") from a different ClassLoader // Make sure we find the bundle assertTrue(testGetBundleFromSecondCallersClassLoader(), "6-testGetBundleFromSecondCallersClassLoader"); + System.out.println("ResourceBundleSearchTest generating report: "+getTimeStamp()); report(); } @@ -132,6 +163,7 @@ public void assertTrue(boolean testResult, String testName) { if (testResult) { numPass++; + System.out.println("PASSED: " + testName); } else { numFail++; System.out.println("FAILED: " + testName @@ -142,6 +174,7 @@ public void assertFalse(boolean testResult, String testName) { if (!testResult) { numPass++; + System.out.println("PASSED: " + testName); } else { numFail++; System.out.println("FAILED: " + testName @@ -170,12 +203,10 @@ debug("Looking for " + bundleName + " using TCCL"); LoggingThread lr = new LoggingThread(bundleName, setOnTCCL); lr.start(); - synchronized (lr) { - try { - lr.wait(); - } catch (InterruptedException ex) { - throw ex; - } + try { + lr.join(); + } catch (InterruptedException ex) { + throw ex; } msgs.add(lr.msg); return lr.foundBundle;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/util/stream/bootlib/java/util/stream/LambdaTestMode.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. + * + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package java.util.stream; + +/** + * Runtime modes of test execution. + */ +public enum LambdaTestMode { + /** + * Execution mode with no particular runtime constraints. + */ + NORMAL, + + /** + * Execution mode where tests are executed for testing lambda serialization + * and deserialization. + * + * <p>This mode may be queried by tests or data supplied by data + * providers, which cannot otherwise be assigned to the test group + * <em>serialization-hostile</em>, to not execute or declare + * serialization-hostile code or data. + * + * <p>This mode is enabled if the boolean system property + * {@code org.openjdk.java.util.stream.sand.mode} is declared with a + * {@code true} value. + */ + SERIALIZATION; + + /** + * {@code true} if tests are executed in the mode for testing lambda + * Serialization ANd Deserialization (SAND). + */ + private static final boolean IS_LAMBDA_SERIALIZATION_MODE = + Boolean.getBoolean("org.openjdk.java.util.stream.sand.mode"); + + /** + * + * @return the mode of test execution. + */ + public static LambdaTestMode getMode() { + return IS_LAMBDA_SERIALIZATION_MODE ? SERIALIZATION : NORMAL; + } + + /** + * + * @return {@code true} if normal test mode. + */ + public static boolean isNormalMode() { + return getMode() == NORMAL; + } +}
--- a/test/java/util/stream/bootlib/java/util/stream/StreamTestDataProvider.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/util/stream/bootlib/java/util/stream/StreamTestDataProvider.java Tue Aug 27 21:46:00 2013 -0700 @@ -96,8 +96,14 @@ list.add(streamDataDescr("DelegatingStream(ArrayList):" + name, () -> new ArrayList<>(intsAsList).stream())); List<Integer> aList = new ArrayList<>(intsAsList); - list.add(collectionDataDescr("ArrayList.Sublist:" + name, - (ints.length) <= 1 ? aList.subList(0, 0) : aList.subList(1, ints.length / 2))); + if (LambdaTestMode.isNormalMode()) { + // Only include sub-lists for normal test execution mode + // This data is serialization-hostile since the state of the + // deserialized sub-list will be out of sync with the + // enclosing list. + list.add(collectionDataDescr("ArrayList.Sublist:" + name, + (ints.length) <= 1 ? aList.subList(0, 0) : aList.subList(1, ints.length / 2))); + } list.add(collectionDataDescr("LinkedList:" + name, new LinkedList<>(intsAsList))); list.add(collectionDataDescr("HashSet:" + name, new HashSet<>(intsAsList))); list.add(collectionDataDescr("LinkedHashSet:" + name, new LinkedHashSet<>(intsAsList)));
--- a/test/java/util/stream/test/org/openjdk/tests/java/util/stream/TabulatorsTest.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/util/stream/test/org/openjdk/tests/java/util/stream/TabulatorsTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; @@ -52,6 +53,7 @@ import org.testng.annotations.Test; +import static java.util.stream.Collectors.collectingAndThen; import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.groupingByConcurrent; import static java.util.stream.Collectors.partitioningBy; @@ -603,4 +605,17 @@ new PartitionAssertion<>(classifier, new ReduceAssertion<>(0, LambdaTestHelpers.identity(), Integer::sum))); } + + @Test(dataProvider = "StreamTestData<Integer>", dataProviderClass = StreamTestDataProvider.class) + public void testComposeFinisher(String name, TestData.OfRef<Integer> data) throws ReflectiveOperationException { + List<Integer> asList = exerciseTerminalOps(data, s -> s.collect(toList())); + List<Integer> asImmutableList = exerciseTerminalOps(data, s -> s.collect(collectingAndThen(toList(), Collections::<Integer>unmodifiableList))); + assertEquals(asList, asImmutableList); + try { + asImmutableList.add(0); + fail("Expecting immutable result"); + } + catch (UnsupportedOperationException ignored) { } + } + }
--- a/test/java/util/zip/TestExtraTime.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/java/util/zip/TestExtraTime.java Tue Aug 27 21:46:00 2013 -0700 @@ -23,14 +23,19 @@ /** * @test - * @bug 4759491 6303183 7012868 + * @bug 4759491 6303183 7012868 8015666 * @summary Test ZOS and ZIS timestamp in extra field correctly */ import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.attribute.FileTime; import java.util.TimeZone; import java.util.concurrent.TimeUnit; import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; @@ -41,14 +46,32 @@ File src = new File(System.getProperty("test.src", "."), "TestExtraTime.java"); if (src.exists()) { - long mtime = src.lastModified(); - test(mtime, null); - test(10, null); // ms-dos 1980 epoch problem - test(mtime, TimeZone.getTimeZone("Asia/Shanghai")); + long time = src.lastModified(); + FileTime mtime = FileTime.from(time, TimeUnit.MILLISECONDS); + FileTime atime = FileTime.from(time + 300000, TimeUnit.MILLISECONDS); + FileTime ctime = FileTime.from(time - 300000, TimeUnit.MILLISECONDS); + TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai"); + + test(mtime, null, null, null); + // ms-dos 1980 epoch problem + test(FileTime.from(10, TimeUnit.MILLISECONDS), null, null, null); + // non-default tz + test(mtime, null, null, tz); + + test(mtime, atime, null, null); + test(mtime, null, ctime, null); + test(mtime, atime, ctime, null); + + test(mtime, atime, null, tz); + test(mtime, null, ctime, tz); + test(mtime, atime, ctime, tz); } } - private static void test(long mtime, TimeZone tz) throws Throwable { + static void test(FileTime mtime, FileTime atime, FileTime ctime, + TimeZone tz) throws Throwable { + System.out.printf("--------------------%nTesting: [%s]/[%s]/[%s]%n", + mtime, atime, ctime); TimeZone tz0 = TimeZone.getDefault(); if (tz != null) { TimeZone.setDefault(tz); @@ -57,23 +80,55 @@ ZipOutputStream zos = new ZipOutputStream(baos); ZipEntry ze = new ZipEntry("TestExtreTime.java"); - ze.setTime(mtime); + ze.setLastModifiedTime(mtime); + if (atime != null) + ze.setLastAccessTime(atime); + if (ctime != null) + ze.setCreationTime(ctime); zos.putNextEntry(ze); zos.write(new byte[] { 1,2 ,3, 4}); zos.close(); if (tz != null) { TimeZone.setDefault(tz0); } + // ZipInputStream ZipInputStream zis = new ZipInputStream( new ByteArrayInputStream(baos.toByteArray())); ze = zis.getNextEntry(); zis.close(); + check(mtime, atime, ctime, ze); - System.out.printf("%tc => %tc%n", mtime, ze.getTime()); + // ZipFile + Path zpath = Paths.get(System.getProperty("test.dir", "."), + "TestExtraTimp.zip"); + Files.copy(new ByteArrayInputStream(baos.toByteArray()), zpath); + ZipFile zf = new ZipFile(zpath.toFile()); + ze = zf.getEntry("TestExtreTime.java"); + // ZipFile read entry from cen, which does not have a/ctime, + // for now. + check(mtime, null, null, ze); + zf.close(); + Files.delete(zpath); + } - if (TimeUnit.MILLISECONDS.toSeconds(mtime) != - TimeUnit.MILLISECONDS.toSeconds(ze.getTime())) - throw new RuntimeException("Timestamp storing failed!"); - + static void check(FileTime mtime, FileTime atime, FileTime ctime, + ZipEntry ze) { + /* + System.out.printf(" mtime [%tc]: [%tc]/[%tc]%n", + mtime.to(TimeUnit.MILLISECONDS), + ze.getTime(), + ze.getLastModifiedTime().to(TimeUnit.MILLISECONDS)); + */ + if (mtime.to(TimeUnit.SECONDS) != + ze.getLastModifiedTime().to(TimeUnit.SECONDS)) + throw new RuntimeException("Timestamp: storing mtime failed!"); + if (atime != null && + atime.to(TimeUnit.SECONDS) != + ze.getLastAccessTime().to(TimeUnit.SECONDS)) + throw new RuntimeException("Timestamp: storing atime failed!"); + if (ctime != null && + ctime.to(TimeUnit.SECONDS) != + ze.getCreationTime().to(TimeUnit.SECONDS)) + throw new RuntimeException("Timestamp: storing ctime failed!"); } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/xml/jaxp/parsers/8022548/JDK8022548.xml Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> + +<?xml-stylesheet type="text/xsl" href="../resources/style/pagex.xsl"?> + +<my:doc xmlns:my="http://www.jenitennison.com/" xmlns="http://www.w3.org/1999/xhtml"> + + <p> + These pages are all about XSLT, an XML-based language for translating one set of XML into another set of XML, or into HTML. Of course, there are all sorts of <my:link href="#links">other pages</my:link> around that cover XSLT. Jeni's XSLT Pages, though, are dedicated to helping people understand and make the most of using XSLT. +</p> + <p> + My warmest thanks to all those people who post interesting problems on <my:link href="http://www.mulberytech.com/xsl/xsl-list/">XSL-List</my:link>, and especially to those of you that have encouraged me to set up this site through your kind emails. +</p> + +</my:doc>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/xml/jaxp/parsers/8022548/JDK8022548.xsl Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,618 @@ +<?xml version="1.0" encoding='UTF-8'?> + +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + version="1.0" + xmlns:my="http://www.jenitennison.com/" + xmlns="http://www.w3.org/1999/xhtml" + xmlns:html="http://www.w3.org/1999/xhtml" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:dcq="http://purl.org/dc/qualifiers/1.0/" + xmlns:vcf="http://www.ietf.org/internet-drafts/draft-dawson-vcard-xml-dtd-03.txt" + xmlns:msxsl="urn:schemas-microsoft-com:xslt" + exclude-result-prefixes="rdf dc dcq my html vcf msxsl"> + +<xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" + cdata-section-elements="script" + indent="no" + method="xml" + encoding='UTF-8'/> + +<xsl:param name="dynamic" select="'true'" /> +<xsl:param name="base" select="'/'" /> + +<xsl:variable name="supports-document" select="function-available('document')" /> +<xsl:variable name="supports-keys" select="function-available('key')" /> + +<xsl:variable name="default-title" select='"Jeni's XML Site"' /> + +<xsl:template match="my:doc"> + <xsl:variable name="metadata" select="/*/rdf:RDF" /> + <xsl:variable name="uri" select="$metadata/rdf:Description[1]/@about" /> + <html> + <head> + <title> + <xsl:call-template name="get-metadata"> + <xsl:with-param name="what" select="'title'" /> + <xsl:with-param name="about" select="$uri" /> + </xsl:call-template> + </title> + <xsl:call-template name="get-metadata"> + <xsl:with-param name="what" select="'link'" /> + <xsl:with-param name="about" select="$uri" /> + </xsl:call-template> + <link rel="alternate" type="text/xml" href="{$uri}" /> + <xsl:call-template name="get-metadata"> + <xsl:with-param name="what" select="'rights'" /> + <xsl:with-param name="about" select="$uri" /> + </xsl:call-template> + </head> + <body> + <xsl:if test="$dynamic = 'false'"> + <p id="xml-link"> + Try the <a href="{$uri}">XML version</a> of this page. + If you have problems with it, consult the + <a href="/compatibility.html">compatibility page</a>. + </p> + </xsl:if> + <xsl:apply-templates /> + <xsl:apply-templates select="." mode="colophon" /> + </body> + </html> +</xsl:template> + +<xsl:template match="html:h1"> + <h1> + <xsl:apply-templates /> + <xsl:call-template name="insert-navigation" /> + </h1> +</xsl:template> + +<xsl:template name="insert-navigation"> + <xsl:variable name="metadata" select="/*/rdf:RDF" /> + <xsl:variable name="uri" select="$metadata/rdf:Description[1]/@about" /> + <xsl:if test="$uri != concat($base, 'index.xml')"> + <span id="link-top"> + <a class="img"> + <xsl:attribute name="href"> + <xsl:choose> + <xsl:when test="$dynamic = 'true'">/index.xml</xsl:when> + + <xsl:otherwise>/index.html</xsl:otherwise> + </xsl:choose> + </xsl:attribute> + <img src="{$base}resources/icons/top.gif" width="29" height="29" /> + </a> + </span> + <span id="link-up"> + <a class="img"> + <xsl:attribute name="href"> + <xsl:choose> + <xsl:when test="contains($uri, 'index.xml')"> + <xsl:choose> + <xsl:when test="$dynamic = 'true'">../index.xml</xsl:when> + <xsl:otherwise>../index.html</xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:otherwise> + <xsl:choose> + <xsl:when test="$dynamic = 'true'">index.xml</xsl:when> + <xsl:otherwise>index.html</xsl:otherwise> + </xsl:choose> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + <img src="{$base}resources/icons/up.gif" width="29" height="29" /> + </a> + </span> +</xsl:if> +</xsl:template> + + +<xsl:template match="rdf:RDF" /> + +<xsl:template name="get-metadata"> + <xsl:param name="what" /> + <xsl:param name="about" select="/*/rdf:RDF/rdf:Description/@about" /> + <xsl:variable name="metadata" select="/*/rdf:RDF" /> + <xsl:variable name="type"> + <xsl:choose> + <xsl:when test="contains($what, '::')"> + <xsl:value-of select="substring-before($what, '::')" /> + </xsl:when> + <xsl:otherwise><xsl:value-of select="$what" /></xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:variable name="mode"> + <xsl:choose> + <xsl:when test="contains($what, '::')"> + <xsl:value-of select="substring-after($what, '::')" /> + </xsl:when> + <xsl:otherwise /> + </xsl:choose> + </xsl:variable> + <xsl:apply-templates select="$metadata/rdf:Description[@about = $about or + (@aboutEachPrefix != '' and starts-with($about, @aboutEachPrefix))]/*[local-name() = $type]"> + <xsl:with-param name="mode" select="$mode" /> + </xsl:apply-templates> +</xsl:template> + +<xsl:template match="rdf:Description/*"> + <xsl:param name="mode" /> + <xsl:choose> + <xsl:when test="@rdf:resource != ''"> + <xsl:call-template name="get-metadata"> + <xsl:with-param name="about" select="@rdf:resource" /> + <xsl:with-param name="what" select="$mode" /> + </xsl:call-template> + </xsl:when> + <xsl:when test="$mode = '' and @rdf:value != ''"> + <xsl:value-of select="@rdf:value" /> + </xsl:when> + <xsl:when test="$mode = '' and *"> + <xsl:apply-templates /> + </xsl:when> + <xsl:otherwise> + <xsl:apply-templates select="." mode="get-metadata"> + <xsl:with-param name="mode" select="$mode" /> + </xsl:apply-templates> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template match="html:link" mode="get-metadata"> + <link> + <xsl:copy-of select="@*" /> + </link> +</xsl:template> + +<xsl:template match="dc:rights" mode="get-metadata"> + <xsl:comment> + <xsl:value-of select="." /> + </xsl:comment> +</xsl:template> + +<xsl:template match="dc:date" mode="get-metadata"> + <xsl:param name="mode" select="''" /> + <xsl:if test="$mode = @dcq:dateType"> + <xsl:value-of select="@rdf:value" /> + </xsl:if> +</xsl:template> + +<xsl:template match="vcf:vCard" mode="get-metadata"> + <xsl:param name="mode" select="''" /> + <xsl:choose> + <xsl:when test="$mode = 'mailto-link'"> + <xsl:call-template name="link"> + <xsl:with-param name="link"> + <xsl:choose> + <xsl:when test="vcf:email[contains(@email.type, 'PREF')]"> + <xsl:value-of select="vcf:email[contains(@email.type, 'PREF')]" /> + </xsl:when> + <xsl:otherwise><xsl:value-of select="vcf:email[1]" /></xsl:otherwise> + </xsl:choose> + </xsl:with-param> + <xsl:with-param name="value"> + <xsl:apply-templates select="vcf:n" mode="full" /> + </xsl:with-param> + </xsl:call-template> + </xsl:when> + <xsl:when test="$mode = 'name'"> + <xsl:apply-templates select="vcf:n" mode="full" /> + </xsl:when> + <xsl:otherwise /> + </xsl:choose> +</xsl:template> + +<xsl:template match="vcf:n" mode="full"> + <xsl:if test="vcf:prefix"> + <xsl:value-of select="vcf:prefix" /><xsl:text> </xsl:text> + </xsl:if> + <xsl:choose> + <xsl:when test="../vcf:nickname"> + <xsl:value-of select="../vcf:nickname" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="vcf:given" /> + </xsl:otherwise> + </xsl:choose> + <xsl:text> </xsl:text> + <xsl:value-of select="vcf:family" /> +</xsl:template> + +<xsl:template match="html:*"> + <xsl:element name="{local-name()}"> + <xsl:copy-of select="@*" /> + <xsl:apply-templates /> + </xsl:element> +</xsl:template> + +<xsl:template match="my:vars"> + <dl> + <xsl:apply-templates /> + </dl> +</xsl:template> + +<xsl:template match="my:var"> + <dt id="{translate(my:name, ' ', '-')}"> + <xsl:text/>$<xsl:value-of select="my:name" /> + <xsl:choose> + <xsl:when test="my:value"> + <xsl:text/> = <xsl:apply-templates select="my:value" /> + </xsl:when> + <xsl:when test="my:default"> + <xsl:text/> [= <xsl:apply-templates select="my:default" />]<xsl:text/> + </xsl:when> + </xsl:choose> + </dt> + <dd> + <xsl:if test="my:desc"><xsl:apply-templates select="my:desc" /></xsl:if> + <xsl:if test="my:option"> + <ul> + <xsl:apply-templates select="my:option" /> + </ul> + </xsl:if> + <xsl:apply-templates select="my:defn" /> + </dd> +</xsl:template> + +<xsl:template match="my:option"> + <li><xsl:apply-templates select="my:value" />: <xsl:apply-templates select="my:desc" /></li> +</xsl:template> + +<xsl:template match="my:value | my:default"> + <xsl:choose> + <xsl:when test="@type"> + <span class="{@type}"> + <xsl:choose> + <xsl:when test="@type = 'string'">'<xsl:value-of select="." />'</xsl:when> + <xsl:when test="@type = 'rtf'">"<xsl:value-of select="." />"</xsl:when> + <xsl:otherwise><xsl:value-of select="." /></xsl:otherwise> + </xsl:choose> + </span> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="." /> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template match="my:post"> + <div class="post"> + <xsl:apply-templates /> + </div> +</xsl:template> + +<xsl:template match="my:response"> + <div class="response"> + <xsl:apply-templates /> + </div> +</xsl:template> + +<xsl:template match="my:question"> + <div class="question"> + <p> + <xsl:call-template name="insert-icon"> + <xsl:with-param name="icon" select="'question'" /> + <xsl:with-param name="active" select="false()" /> + </xsl:call-template> + <xsl:text> </xsl:text> + <xsl:apply-templates select="*[1]/node()" /> + </p> + <xsl:apply-templates select="*[position() > 1]"/> + </div> +</xsl:template> + +<xsl:template match="my:example | my:defn"> + <pre> + <xsl:apply-templates /> + </pre> +</xsl:template> + +<xsl:template match="my:example[parent::my:aside and ancestor::my:example]"> + <xsl:choose> + <xsl:when test="$dynamic = 'true'"> + <pre> + <xsl:apply-templates /> + </pre> + </xsl:when> + <xsl:otherwise> + <span class="example"> + <xsl:apply-templates /> + </span> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template match="my:example[parent::my:aside and not(ancestor::my:example)]"> + <xsl:call-template name="split-and-code"> + <xsl:with-param name="text" select="string(.)" /> + </xsl:call-template> +</xsl:template> + +<xsl:template name="split-and-code"> + <xsl:param name="text" /> + <br /> + <xsl:choose> + <xsl:when test="contains($text, '
')"> + <code><xsl:value-of select="substring-before($text, '
')" /></code> + <xsl:call-template name="split-and-code"> + <xsl:with-param name="text" select="substring-after($text, '
')" /> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <code><xsl:value-of select="$text" /></code> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template match="my:aside"> + <xsl:choose> + <xsl:when test="$dynamic = 'true'"> + <span class="note" + ><img src="{$base}resources/icons/note.gif" height="17" width="13" border="0" + style="z-index: 2;" + onmouseover="javascript:{generate-id()}.style.visibility='visible';" + onmouseout="javascript:{generate-id()}.style.visibility='hidden';" + /><span class="popup" id="{generate-id()}" + onmouseover="javascript:{generate-id()}.style.visibility='visible';" + onmouseout="javascript:{generate-id()}.style.visibility='hidden';"> + <xsl:apply-templates /> + </span + ></span> + </xsl:when> + <xsl:otherwise> + <xsl:text> </xsl:text> + <span class="note">[<xsl:apply-templates />]</span> + <xsl:text> </xsl:text> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template match="my:quote"> + <blockquote uri="{@href}"> + <xsl:apply-templates /> + </blockquote> + <p class="byline"> + <xsl:text>[From </xsl:text> + <xsl:call-template name="link"> + <xsl:with-param name="link" select="@href" /> + <xsl:with-param name="value"> + <xsl:value-of select="@href" /> + </xsl:with-param> + </xsl:call-template> + <xsl:text>]</xsl:text> + </p> +</xsl:template> + +<xsl:template match="my:icon"> + <xsl:call-template name="insert-icon"> + <xsl:with-param name="icon" select="@name" /> + </xsl:call-template> +</xsl:template> + +<xsl:template name="insert-icon"> + <xsl:param name="icon" select="'goto'" /> + <xsl:param name="active" select="true()" /> + <img src="{$base}resources/icons/{$icon}.gif" height="28" width="28" border="0"> + <xsl:attribute name="src"> + <xsl:value-of select="$base" /> + <xsl:text>resources/icons/</xsl:text> + <xsl:if test="not($active)">click-</xsl:if> + <xsl:value-of select="$icon" /> + <xsl:text>.gif</xsl:text> + </xsl:attribute> + <xsl:if test="$active"> + <xsl:attribute name="onmouseover">javascript:this.src='<xsl:value-of select="$base" />resources/icons/over-<xsl:value-of select="$icon" />.gif'</xsl:attribute> + <xsl:attribute name="onclick">javascript:this.src='<xsl:value-of select="$base" />resources/icons/click-<xsl:value-of select="$icon" />.gif'</xsl:attribute> + <xsl:attribute name="onmouseout">javascript:this.src='<xsl:value-of select="$base" />resources/icons/<xsl:value-of select="$icon" />.gif'</xsl:attribute> + </xsl:if> + </img> +</xsl:template> + +<xsl:template match="my:links"> + <xsl:choose> + <xsl:when test="parent::html:dd"> + <xsl:apply-templates select="my:link" mode="list" /> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="columnise"> + <xsl:with-param name="max-height" select="3" /> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template name="columnise"> + <xsl:param name="max-height" select="5" /> + <xsl:param name="max-width" select="3" /> + <xsl:variable name="no-items" select="count(*)" /> + <xsl:variable name="width"> + <xsl:choose> + <xsl:when test="$no-items > $max-height * $max-width"> + <xsl:value-of select="$max-width" /> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="ceiling($no-items div $max-height)" /> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:variable name="height" select="ceiling($no-items div $width)" /> + <table> + <colgroup span="{$width}" /> + <tr> + <xsl:for-each select="*[position() = 1 or position() mod $height = 1]"> + <td> + <xsl:apply-templates select=". | following-sibling::*[position() < $height]" mode="list" /> + </td> + </xsl:for-each> + </tr> + </table> +</xsl:template> + +<xsl:template match="my:link" mode="list"> + <p class="link"> + <xsl:call-template name="link"> + <xsl:with-param name="link" select="@href" /> + <xsl:with-param name="value"> + <xsl:value-of select="." /> + </xsl:with-param> + <xsl:with-param name="addicon" select="true()" /> + </xsl:call-template> + </p> +</xsl:template> + +<xsl:template match="my:link"> + <xsl:apply-templates select="." mode="link" /> +</xsl:template> + +<xsl:template match="*[@href][. != '']" mode="link"> + <xsl:call-template name="link"> + <xsl:with-param name="link" select="@href" /> + <xsl:with-param name="value"> + <xsl:apply-templates /> + </xsl:with-param> + <xsl:with-param name="addicon" select="@addicon" /> + </xsl:call-template> +</xsl:template> + +<xsl:template match="*[@href][. = '']" mode="link"> + <xsl:call-template name="link"> + <xsl:with-param name="link" select="@href" /> + <xsl:with-param name="value"> + <xsl:value-of select="@href" /> + </xsl:with-param> + <xsl:with-param name="addicon" select="@addicon" /> + </xsl:call-template> +</xsl:template> + +<xsl:template match="text()|@*" mode="link"> + <xsl:call-template name="link"> + <xsl:with-param name="link" select="." /> + <xsl:with-param name="value"> + <xsl:value-of select="." /> + </xsl:with-param> + </xsl:call-template> +</xsl:template> + +<xsl:template name="link"> + <xsl:param name="link" /> + <xsl:param name="value" /> + <xsl:param name="addicon" select="''" /> + <xsl:variable name="uri"> + <xsl:call-template name="full-uri"> + <xsl:with-param name="uri" select="$link" /> + </xsl:call-template> + </xsl:variable> + <xsl:variable name="class"> + <xsl:call-template name="uri-class"> + <xsl:with-param name="uri" select="$uri" /> + </xsl:call-template> + </xsl:variable> + <xsl:if test="$addicon"> + <a href="{$uri}"> + <xsl:attribute name="class"> + <xsl:text>img </xsl:text> + <xsl:value-of select="$class" /> + </xsl:attribute> + <xsl:call-template name="insert-icon"> + <xsl:with-param name="icon"> + <xsl:call-template name="icon-type"> + <xsl:with-param name="uri" select="$uri" /> + </xsl:call-template> + </xsl:with-param> + </xsl:call-template> + </a> + <xsl:text> </xsl:text> + </xsl:if> + <a href="{$uri}"> + <xsl:if test="$class != ''"> + <xsl:attribute name="class"> + <xsl:value-of select="$class" /> + </xsl:attribute> + </xsl:if> + <xsl:copy-of select="$value" /> + </a> +</xsl:template> + +<xsl:template name="full-uri"> + <xsl:param name="uri" /> + <xsl:variable name="partial-uri"> + <xsl:choose> + <xsl:when test="$dynamic='false' and + substring($uri, string-length($uri) - 3, 4) = '.xml'"> + <xsl:value-of select="concat(substring($uri, 1, string-length($uri) - 4), '.html')" /> + </xsl:when> + <xsl:otherwise><xsl:value-of select="$uri" /></xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:choose> + <xsl:when test="starts-with($partial-uri, 'www')"> + <xsl:text>http://</xsl:text><xsl:value-of select="$partial-uri" /> + </xsl:when> + <xsl:when test="contains($partial-uri, '@') and not(starts-with($partial-uri, 'mailto:'))"> + <xsl:text>mailto:</xsl:text><xsl:value-of select="$partial-uri" /> + </xsl:when> + <xsl:otherwise><xsl:value-of select="$partial-uri" /></xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template name="uri-class"> + <xsl:param name="uri" /> + <xsl:choose> + <xsl:when test="starts-with($uri, 'http://') and not(starts-with($uri, $base))">offsite</xsl:when> + <xsl:when test="starts-with($uri, 'mailto:')">mailto</xsl:when> + <xsl:when test="starts-with($uri, '#')">local</xsl:when> + </xsl:choose> +</xsl:template> + +<xsl:template name="icon-type"> + <xsl:param name="uri" /> + <xsl:variable name="url"> + <xsl:choose> + <xsl:when test="starts-with($uri, 'http://')"><xsl:value-of select="substring-after($uri, 'http://')" /></xsl:when> + <xsl:otherwise><xsl:value-of select="$uri" /></xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:choose> + <xsl:when test="(not(contains($url, '/')) and starts-with($url, 'www.')) or (contains($url, '/') and not(substring-after($url, '/')))">home</xsl:when> + <xsl:when test="contains($url, '@')">mail</xsl:when> + <xsl:otherwise>goto</xsl:otherwise> + </xsl:choose> +</xsl:template> + +<xsl:template match="/*" mode="colophon"> + <xsl:variable name="metadata" select="/*/rdf:RDF" /> + <xsl:variable name="uri" select="$metadata/rdf:Description[1]/@about" /> + <div id="colophon"> + <hr class="final" /> + <p> + <xsl:apply-templates select="$uri" mode="link" /> + <xsl:variable name="modified"> + <xsl:call-template name="get-metadata"> + <xsl:with-param name="what" select="'date::modified'" /> + </xsl:call-template> + </xsl:variable> + <xsl:if test="string($modified)"> + <xsl:text> last modified </xsl:text> + <xsl:copy-of select="$modified" /> + </xsl:if> + <xsl:variable name="creator"> + <xsl:call-template name="get-metadata"> + <xsl:with-param name="what" select="'creator::vCard::mailto-link'" /> + </xsl:call-template> + </xsl:variable> + <xsl:text> by </xsl:text> + <xsl:choose> + <xsl:when test="string($creator)"> + <xsl:copy-of select="$creator" /> + </xsl:when> + <xsl:otherwise> + <a href="mailto:mail@jenitennison.com" class="mailto">Jeni Tennison</a> + </xsl:otherwise> + </xsl:choose> + </p> + </div> +</xsl:template> + +</xsl:stylesheet>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/xml/jaxp/parsers/8022548/TestBase.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,73 @@ + +import java.security.Policy; + +/** + * + * + * @author huizhe.wang@oracle.com + */ +public class TestBase { + public String filePath; + boolean hasSM; + String curdir; + Policy origPolicy; + + String testName; + String errMsg; + + int passed = 0, failed = 0; + + /** + * Creates a new instance of StreamReader + */ + public TestBase(String name) { + testName = name; + } + + //junit @Override + protected void setUp() { + if (System.getSecurityManager() != null) { + hasSM = true; + System.setSecurityManager(null); + } + + filePath = System.getProperty("test.src"); + if (filePath == null) { + //current directory + filePath = System.getProperty("user.dir"); + } + origPolicy = Policy.getPolicy(); + + } + + //junit @Override + public void tearDown() { + // turn off security manager and restore policy + System.setSecurityManager(null); + Policy.setPolicy(origPolicy); + if (hasSM) { + System.setSecurityManager(new SecurityManager()); + } + System.out.println("\nNumber of tests passed: " + passed); + System.out.println("Number of tests failed: " + failed + "\n"); + + if (errMsg != null ) { + throw new RuntimeException(errMsg); + } + } + + void fail(String msg) { + if (errMsg == null) { + errMsg = msg; + } else { + errMsg = errMsg + "\n" + msg; + } + failed++; + } + + void success(String msg) { + passed++; + System.out.println(msg); + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/xml/jaxp/parsers/8022548/XOMParserTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. + * + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test @bug 8022548 + * @summary test that a parser can use DTDConfiguration + * @run main XOMParserTest + */ +import com.sun.org.apache.xerces.internal.impl.Constants; +import com.sun.org.apache.xerces.internal.parsers.*; +import java.io.*; +import javax.xml.transform.*; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import org.xml.sax.InputSource; + +/** + * <p>Test {@link javax.xml.transform.Transformer} for JDK-8022548: SPECJVM2008 + * has errors introduced in 7u40-b34 + * + * Test XOM is supported after jaxp 1.5 </p> + * + * @author Joe Wang <huizhe.wang@oracle.com> + * + */ +public class XOMParserTest extends TestBase { + + public XOMParserTest(String name) { + super(name); + } + + /** + * @param args the command line arguments + */ + public static void main(String[] args) { + XOMParserTest test = new XOMParserTest("XOM parser test"); + test.setUp(); + test.testTransform(); + test.tearDown(); + } + + public final void testTransform() { + + try { + + String inFilename = filePath + "/JDK8022548.xml"; + String xslFilename = filePath + "/JDK8022548.xsl"; + String outFilename = filePath + "/JDK8022548.out"; + + StringWriter sw = new StringWriter(); + // Create transformer factory + TransformerFactory factory = TransformerFactory.newInstance(); + // set the translet name +// factory.setAttribute("translet-name", "myTranslet"); + + // set the destination directory +// factory.setAttribute("destination-directory", "c:\\temp"); +// factory.setAttribute("generate-translet", Boolean.TRUE); + + // Use the factory to create a template containing the xsl file + Templates template = factory.newTemplates(new StreamSource(new FileInputStream(xslFilename))); + // Use the template to create a transformer + Transformer xformer = template.newTransformer(); + // Prepare the input and output files + Source source = new StreamSource(new FileInputStream(inFilename)); + Result result = new StreamResult(new FileOutputStream(outFilename)); + //Result result = new StreamResult(sw); + // Apply the xsl file to the source file and write the result to the output file + xformer.transform(source, result); + + /** + * String out = sw.toString(); if (out.indexOf("<p>") < 0 ) { + * fail(out); } + */ + String canonicalizedFileName = outFilename + ".canonicalized"; + canonicalize(outFilename, canonicalizedFileName); + } catch (Exception e) { + // unexpected failure + fail(e.getMessage()); + } + } + + public void canonicalize(String inName, String outName) { + try (//FileOutputStream outStream = new FileOutputStream(outName); + FileInputStream inputStream = new FileInputStream(inName);) { + JDK15XML1_0Parser parser = new JDK15XML1_0Parser(); + parser.parse(new InputSource(inputStream)); + success("test passed"); + } catch (Exception e) { + fail(e.getMessage()); + } + + } + + class JDK15XML1_0Parser extends SAXParser { + + JDK15XML1_0Parser() throws org.xml.sax.SAXException { + + super(new DTDConfiguration()); + // workaround for Java 1.5 beta 2 bugs + com.sun.org.apache.xerces.internal.util.SecurityManager manager = + new com.sun.org.apache.xerces.internal.util.SecurityManager(); + setProperty(Constants.XERCES_PROPERTY_PREFIX + Constants.SECURITY_MANAGER_PROPERTY, manager); + + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/sun/security/ssl/javax/net/ssl/ServerName/IllegalSNIName.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. + * + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8020842 + * @summary SNIHostName does not throw IAE when hostname ends + * with a trailing dot + */ + +import javax.net.ssl.SNIHostName; + +public class IllegalSNIName { + + public static void main(String[] args) throws Exception { + String[] illegalNames = { + "example\u3003\u3002com", + "example..com", + "com\u3002", + "com.", + "." + }; + + for (String name : illegalNames) { + try { + SNIHostName hostname = new SNIHostName(name); + throw new Exception( + "Expected to get IllegalArgumentException for " + name); + } catch (IllegalArgumentException iae) { + // That's the right behavior. + } + } + } +}
--- a/test/sun/text/resources/LocaleData Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/text/resources/LocaleData Tue Aug 27 21:46:00 2013 -0700 @@ -7679,3 +7679,5 @@ FormatData/pt/MonthAbbreviations/10=nov FormatData/pt/MonthAbbreviations/11=dez +# bug 8021121 +CurrencyNames/lv_LV/EUR=\u20AC
--- a/test/sun/text/resources/LocaleDataTest.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/text/resources/LocaleDataTest.java Tue Aug 27 21:46:00 2013 -0700 @@ -35,7 +35,7 @@ * 6645405 6650730 6910489 6573250 6870908 6585666 6716626 6914413 6916787 * 6919624 6998391 7019267 7020960 7025837 7020583 7036905 7066203 7101495 * 7003124 7085757 7028073 7171028 7189611 8000983 7195759 8004489 8006509 - * 7114053 7074882 7040556 8013836 + * 7114053 7074882 7040556 8013836 8021121 * @summary Verify locale data * */
--- a/test/sun/util/calendar/zi/tzdata/VERSION Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/VERSION Tue Aug 27 21:46:00 2013 -0700 @@ -21,4 +21,4 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -tzdata2013c +tzdata2013d
--- a/test/sun/util/calendar/zi/tzdata/africa Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/africa Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. @@ -875,12 +875,18 @@ # announced that year's Ramadan daylight-saving transitions would be # 2012-07-20 and 2012-08-20; see # <http://www.mmsp.gov.ma/fr/actualites.aspx?id=288>. -# + +# From Andrew Paprocki (2013-07-02): +# Morocco announced that the year's Ramadan daylight-savings +# transitions would be 2013-07-07 and 2013-08-10; see: +# http://www.maroc.ma/en/news/morocco-suspends-daylight-saving-time-july-7-aug10 + +# From Paul Eggert (2013-07-03): # To estimate what the Moroccan government will do in future years, -# transition dates for 2013 through 2021 were determined by running +# transition dates for 2014 through 2021 were determined by running # the following program under GNU Emacs 24.3: # -# (let ((islamic-year 1434)) +# (let ((islamic-year 1435)) # (while (< islamic-year 1444) # (let ((a # (calendar-gregorian-from-absolute @@ -933,8 +939,8 @@ Rule Morocco 2012 max - Sep lastSun 3:00 0 - Rule Morocco 2012 only - Jul 20 3:00 0 - Rule Morocco 2012 only - Aug 20 2:00 1:00 S -Rule Morocco 2013 only - Jul 9 3:00 0 - -Rule Morocco 2013 only - Aug 8 2:00 1:00 S +Rule Morocco 2013 only - Jul 7 3:00 0 - +Rule Morocco 2013 only - Aug 10 2:00 1:00 S Rule Morocco 2014 only - Jun 29 3:00 0 - Rule Morocco 2014 only - Jul 29 2:00 1:00 S Rule Morocco 2015 only - Jun 18 3:00 0 -
--- a/test/sun/util/calendar/zi/tzdata/antarctica Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/antarctica Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/test/sun/util/calendar/zi/tzdata/asia Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/asia Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. @@ -1235,39 +1235,21 @@ Rule Zion 2012 only - Mar Fri>=26 2:00 1:00 D Rule Zion 2012 only - Sep 23 2:00 0 S -# From Ephraim Silverberg (2012-10-18): -# Yesterday, the Interior Ministry Committee, after more than a year -# past, approved sending the proposed June 2011 changes to the Time -# Decree Law back to the Knesset for second and third (final) votes -# before the upcoming elections on Jan. 22, 2013. Hence, although the -# changes are not yet law, they are expected to be so before February 2013. +# From Ephraim Silverberg (2013-06-27): +# On June 23, 2013, the Israeli government approved changes to the +# Time Decree Law. The next day, the changes passed the First Reading +# in the Knesset. The law is expected to pass the Second and Third +# (final) Readings by the beginning of September 2013. # -# As of 2013, DST starts at 02:00 on the Friday before the last Sunday in March. -# DST ends at 02:00 on the first Sunday after October 1, unless it occurs on the -# second day of the Jewish Rosh Hashana holiday, in which case DST ends a day -# later (i.e. at 02:00 the first Monday after October 2). -# [Rosh Hashana holidays are factored in until 2100.] - -# From Ephraim Silverberg (2012-11-05): -# The Knesset passed today (in second and final readings) the amendment to the -# Time Decree Law making the changes ... law. +# As of 2013, DST starts at 02:00 on the Friday before the last Sunday +# in March. DST ends at 02:00 on the last Sunday of October. # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Zion 2013 max - Mar Fri>=23 2:00 1:00 D -Rule Zion 2013 2026 - Oct Sun>=2 2:00 0 S -Rule Zion 2027 only - Oct Mon>=3 2:00 0 S -Rule Zion 2028 max - Oct Sun>=2 2:00 0 S -# The following rules are commented out for now, as they break older -# versions of zic that support only signed 32-bit timestamps, i.e., -# through 2038-01-19 03:14:07 UTC. -#Rule Zion 2028 2053 - Oct Sun>=2 2:00 0 S -#Rule Zion 2054 only - Oct Mon>=3 2:00 0 S -#Rule Zion 2055 2080 - Oct Sun>=2 2:00 0 S -#Rule Zion 2081 only - Oct Mon>=3 2:00 0 S -#Rule Zion 2082 max - Oct Sun>=2 2:00 0 S +Rule Zion 2013 max - Oct lastSun 2:00 0 S # Zone NAME GMTOFF RULES FORMAT [UNTIL] -Zone Asia/Jerusalem 2:20:56 - LMT 1880 +Zone Asia/Jerusalem 2:20:54 - LMT 1880 2:20:40 - JMT 1918 # Jerusalem Mean Time? 2:00 Zion I%sT @@ -2570,8 +2552,8 @@ Rule Syria 2007 only - Mar lastFri 0:00 1:00 S # From Jesper Norgard (2007-10-27): # The sister center ICARDA of my work CIMMYT is confirming that Syria DST will -# not take place 1.st November at 0:00 o'clock but 1.st November at 24:00 or -# rather Midnight between Thursday and Friday. This does make more sence than +# not take place 1st November at 0:00 o'clock but 1st November at 24:00 or +# rather Midnight between Thursday and Friday. This does make more sense than # having it between Wednesday and Thursday (two workdays in Syria) since the # weekend in Syria is not Saturday and Sunday, but Friday and Saturday. So now # it is implemented at midnight of the last workday before weekend...
--- a/test/sun/util/calendar/zi/tzdata/australasia Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/australasia Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. @@ -253,10 +253,16 @@ # - Macquarie Island will stay on UTC+11 for winter and therefore not # switch back from daylight savings time when other parts of Australia do # on 4 April. +# +# From Arthur David Olson (2013-05-23): +# The 1919 transition is overspecified below so pre-2013 zics +# will produce a binary file with an EST-type as the first 32-bit type; +# this is required for correct handling of times before 1916 by +# pre-2013 versions of localtime. Zone Antarctica/Macquarie 0 - zzz 1899 Nov 10:00 - EST 1916 Oct 1 2:00 10:00 1:00 EST 1917 Feb - 10:00 Aus EST 1919 Apr + 10:00 Aus EST 1919 Apr 1 0:00s 0 - zzz 1948 Mar 25 10:00 Aus EST 1967 10:00 AT EST 2010 Apr 4 3:00 @@ -1498,12 +1504,12 @@ # From Paul Eggert (2000-01-08): # IATA SSIM (1999-09) says DST ends 0100 local time. Go with McDow. -# From the BBC World Service (1998-10-31 11:32 UTC): +# From the BBC World Service in +# http://news.bbc.co.uk/2/hi/asia-pacific/205226.stm (1998-10-31 16:03 UTC): # The Fijiian government says the main reasons for the time change is to -# improve productivity and reduce road accidents. But correspondents say it -# also hopes the move will boost Fiji's ability to compete with other pacific -# islands in the effort to attract tourists to witness the dawning of the new -# millenium. +# improve productivity and reduce road accidents.... [T]he move is also +# intended to boost Fiji's ability to attract tourists to witness the dawning +# of the new millennium. # http://www.fiji.gov.fj/press/2000_09/2000_09_13-05.shtml (2000-09-13) # reports that Fiji has discontinued DST. @@ -1648,7 +1654,7 @@ # Shanks & Pottenger say the transition was on 1968-10-01; go with Mundell. # From Eric Ulevik (1999-05-03): -# Tonga's director of tourism, who is also secretary of the National Millenium +# Tonga's director of tourism, who is also secretary of the National Millennium # Committee, has a plan to get Tonga back in front. # He has proposed a one-off move to tropical daylight saving for Tonga from # October to March, which has won approval in principle from the Tongan
--- a/test/sun/util/calendar/zi/tzdata/backward Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/backward Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/test/sun/util/calendar/zi/tzdata/etcetera Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/etcetera Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/test/sun/util/calendar/zi/tzdata/europe Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/europe Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. @@ -546,7 +546,7 @@ # It seems that Paris, Monaco, Rule France, Rule Belgium all agree on # 2:00 standard time, e.g. 3:00 local time. However there are no # countries that use C-Eur rules in September 1945, so the only items -# affected are apparently these ficticious zones that translates acronyms +# affected are apparently these fictitious zones that translate acronyms # CET and MET: # # Zone CET 1:00 C-Eur CE%sT @@ -2802,9 +2802,9 @@ # Ukraine # -# From Igor Karpov, who works for the Ukranian Ministry of Justice, +# From Igor Karpov, who works for the Ukrainian Ministry of Justice, # via Garrett Wollman (2003-01-27): -# BTW, I've found the official document on this matter. It's goverment +# BTW, I've found the official document on this matter. It's government # regulations number 509, May 13, 1996. In my poor translation it says: # "Time in Ukraine is set to second timezone (Kiev time). Each last Sunday # of March at 3am the time is changing to 4am and each last Sunday of @@ -2838,7 +2838,7 @@ # time this year after all. # # From Udo Schwedt (2011-10-18): -# As far as I understand, the recent change to the Ukranian time zone +# As far as I understand, the recent change to the Ukrainian time zone # (Europe/Kiev) to introduce permanent daylight saving time (similar # to Russia) was reverted today: #
--- a/test/sun/util/calendar/zi/tzdata/factory Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/factory Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/test/sun/util/calendar/zi/tzdata/iso3166.tab Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/iso3166.tab Tue Aug 27 21:46:00 2013 -0700 @@ -1,39 +1,37 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. # -# <pre> +# ISO 3166 alpha-2 country codes +# # This file is in the public domain, so clarified as of # 2009-05-17 by Arthur David Olson. -# ISO 3166 alpha-2 country codes # -# From Paul Eggert (2006-09-27): +# From Paul Eggert (2013-05-27): # # This file contains a table with the following columns: # 1. ISO 3166-1 alpha-2 country code, current as of -# ISO 3166-1 Newsletter VI-1 (2007-09-21). See: -# <a href="http://www.iso.org/iso/en/prods-services/iso3166ma/index.html"> -# ISO 3166 Maintenance agency (ISO 3166/MA) -# </a>. +# ISO 3166-1 Newsletter VI-15 (2013-05-10). See: Updates on ISO 3166 +# http://www.iso.org/iso/home/standards/country_codes/updates_on_iso_3166.htm # 2. The usual English name for the country, # chosen so that alphabetic sorting of subsets produces helpful lists. # This is not the same as the English name in the ISO 3166 tables. @@ -43,8 +41,9 @@ # # Lines beginning with `#' are comments. # -# From Arthur David Olson (2011-08-17): -# Resynchronized today with the ISO 3166 site (adding SS for South Sudan). +# This table is intended as an aid for users, to help them select time +# zone data appropriate for their practical needs. It is not intended +# to take or endorse any position on legal or territorial claims. # #country- #code country name @@ -77,7 +76,7 @@ BM Bermuda BN Brunei BO Bolivia -BQ Bonaire Sint Eustatius & Saba +BQ Bonaire, St Eustatius & Saba BR Brazil BS Bahamas BT Bhutan @@ -258,7 +257,7 @@ SS South Sudan ST Sao Tome & Principe SV El Salvador -SX Sint Maarten +SX St Maarten (Dutch part) SY Syria SZ Swaziland TC Turks & Caicos Is
--- a/test/sun/util/calendar/zi/tzdata/leapseconds Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/leapseconds Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/test/sun/util/calendar/zi/tzdata/northamerica Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/northamerica Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/test/sun/util/calendar/zi/tzdata/pacificnew Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/pacificnew Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/test/sun/util/calendar/zi/tzdata/solar87 Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/solar87 Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/test/sun/util/calendar/zi/tzdata/solar88 Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/solar88 Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/test/sun/util/calendar/zi/tzdata/solar89 Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/solar89 Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/test/sun/util/calendar/zi/tzdata/southamerica Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/southamerica Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. @@ -994,7 +994,7 @@ # adopted by the same states as before. Rule Brazil 2007 only - Oct Sun>=8 0:00 1:00 S # From Frederico A. C. Neves (2008-09-10): -# Acording to this decree +# According to this decree # <a href="http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm"> # http://www.planalto.gov.br/ccivil_03/_Ato2007-2010/2008/Decreto/D6558.htm # </a> @@ -1226,7 +1226,7 @@ # http://www.emol.com/noticias/nacional/detalle/detallenoticias.asp?idnoticia=467651 # </a> # -# This is not yet reflected in the offical "cambio de hora" site, but +# This is not yet reflected in the official "cambio de hora" site, but # probably will be soon: # <a href="http://www.horaoficial.cl/cambio.htm"> # http://www.horaoficial.cl/cambio.htm
--- a/test/sun/util/calendar/zi/tzdata/systemv Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/systemv Tue Aug 27 21:46:00 2013 -0700 @@ -1,22 +1,22 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions.
--- a/test/sun/util/calendar/zi/tzdata/zone.tab Tue Aug 27 13:37:38 2013 +0400 +++ b/test/sun/util/calendar/zi/tzdata/zone.tab Tue Aug 27 21:46:00 2013 -0700 @@ -1,41 +1,44 @@ # # 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. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. # -# <pre> +# TZ zone descriptions +# # This file is in the public domain, so clarified as of # 2009-05-17 by Arthur David Olson. # -# TZ zone descriptions -# -# From Paul Eggert (1996-08-05): +# From Paul Eggert (2013-05-27): # # This file contains a table with the following columns: # 1. ISO 3166 2-character country code. See the file `iso3166.tab'. +# This identifies a country that overlaps the zone. The country may +# overlap other zones and the zone may overlap other countries. # 2. Latitude and longitude of the zone's principal location # in ISO 6709 sign-degrees-minutes-seconds format, # either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS, # first latitude (+ is north), then longitude (+ is east). +# This location need not lie within the column-1 country. # 3. Zone name used in value of TZ environment variable. +# Please see the 'Theory' file for how zone names are chosen. # 4. Comments; present if and only if the country has multiple rows. # # Columns are separated by a single tab. @@ -45,6 +48,10 @@ # # Lines beginning with `#' are comments. # +# This table is intended as an aid for users, to help them select time +# zone data appropriate for their practical needs. It is not intended +# to take or endorse any position on legal or territorial claims. +# #country- #code coordinates TZ comments AD +4230+00131 Europe/Andorra @@ -239,7 +246,7 @@ ID -0507+11924 Asia/Makassar east & south Borneo, Sulawesi (Celebes), Bali, Nusa Tengarra, west Timor ID -0232+14042 Asia/Jayapura west New Guinea (Irian Jaya) & Malukus (Moluccas) IE +5320-00615 Europe/Dublin -IL +3146+03514 Asia/Jerusalem +IL +314650+0351326 Asia/Jerusalem IM +5409-00428 Europe/Isle_of_Man IN +2232+08822 Asia/Kolkata IO -0720+07225 Indian/Chagos
--- a/test/tools/jar/AddAndUpdateProfile.java Tue Aug 27 13:37:38 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. 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. - * - * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* @test - * @bug 8003255 - * @compile -XDignore.symbol.file AddAndUpdateProfile.java - * @run main AddAndUpdateProfile - * @summary Basic test of jar tool "p" option to add or update the Profile - * attribute in the main manifest of a JAR file - */ - -import java.util.jar.*; -import static java.util.jar.Attributes.Name.*; -import java.nio.file.*; -import java.io.IOException; - -import sun.tools.jar.Main; - -public class AddAndUpdateProfile { - static boolean doJar(String... args) { - System.out.print("jar"); - for (String arg: args) - System.out.print(" " + arg); - System.out.println(""); - - Main jartool = new Main(System.out, System.err, "jar"); - return jartool.run(args); - } - - static void jar(String... args) { - if (!doJar(args)) - throw new RuntimeException("jar command failed"); - } - - static void jarExpectingFail(String... args) { - if (doJar(args)) - throw new RuntimeException("jar command not expected to succeed"); - } - - static void checkMainAttribute(String jarfile, Attributes.Name name, - String expectedValue) - throws IOException - { - try (JarFile jf = new JarFile(jarfile)) { - Manifest mf = jf.getManifest(); - if (mf == null && expectedValue != null) - throw new RuntimeException("Manifest not found"); - if (mf != null) { - String actual = mf.getMainAttributes().getValue(name); - if (actual != null) { - if (!actual.equals(expectedValue)) - throw new RuntimeException("Profile attribute has unexpected value"); - } else { - if (expectedValue != null) - throw new RuntimeException("Profile attribute should not be present"); - } - } - } - } - - public static void main(String[] args) throws Exception { - Path entry = Files.createFile(Paths.get("xfoo")); - String jarfile = "xFoo.jar"; - try { - - // create JAR file with Profile attribute - jar("cfp", jarfile, "compact1", entry.toString()); - checkMainAttribute(jarfile, PROFILE, "compact1"); - - // attempt to create JAR file with Profile attribute and bad value - jarExpectingFail("cfp", jarfile, "garbage", entry.toString()); - jarExpectingFail("cfp", jarfile, "Compact1", entry.toString()); - jarExpectingFail("cfp", jarfile, "COMPACT1", entry.toString()); - - // update value of Profile attribute - jar("ufp", jarfile, "compact2"); - checkMainAttribute(jarfile, PROFILE, "compact2"); - - // attempt to update value of Profile attribute to bad value - // (update should not change the JAR file) - jarExpectingFail("ufp", jarfile, "garbage"); - checkMainAttribute(jarfile, PROFILE, "compact2"); - jarExpectingFail("ufp", jarfile, "COMPACT1"); - checkMainAttribute(jarfile, PROFILE, "compact2"); - - // create JAR file with both a Main-Class and Profile attribute - jar("cfep", jarfile, "Foo", "compact1", entry.toString()); - checkMainAttribute(jarfile, MAIN_CLASS, "Foo"); - checkMainAttribute(jarfile, PROFILE, "compact1"); - - // update value of Profile attribute - jar("ufp", jarfile, "compact2"); - checkMainAttribute(jarfile, PROFILE, "compact2"); - - // create JAR file without Profile attribute - jar("cf", jarfile, entry.toString()); - checkMainAttribute(jarfile, PROFILE, null); - - // update value of Profile attribute - jar("ufp", jarfile, "compact3"); - checkMainAttribute(jarfile, PROFILE, "compact3"); - - } finally { - Files.deleteIfExists(Paths.get(jarfile)); - Files.delete(entry); - } - } - -}
--- a/test/tools/launcher/profiles/Basic.java Tue Aug 27 13:37:38 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,231 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. 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. - * - * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8003255 - * @compile -XDignore.symbol.file Basic.java Main.java Logging.java - * @run main Basic - * @summary Test the launcher checks the Profile attribute of executable JAR - * files. Also checks that libraries that specify the Profile attribute - * are not loaded if the runtime does not support the required profile. - */ - -import java.io.*; -import java.util.jar.*; -import static java.util.jar.JarFile.MANIFEST_NAME; -import java.util.zip.*; -import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; - -public class Basic { - - static final String MANIFEST_DIR = "META-INF/"; - - static final String JAVA_HOME = System.getProperty("java.home"); - static final String OS_NAME = System.getProperty("os.name"); - static final String OS_ARCH = System.getProperty("os.arch"); - - static final String JAVA_CMD = - OS_NAME.startsWith("Windows") ? "java.exe" : "java"; - - static final boolean NEED_D64 = - OS_NAME.equals("SunOS") && - (OS_ARCH.equals("sparcv9") || OS_ARCH.equals("amd64")); - - /** - * Creates a JAR file with the given attributes and the given entries. - * Class files are assumed to be in ${test.classes}. Note that this this - * method cannot use the "jar" tool as it may not be present in the image. - */ - static void createJarFile(String jarfile, - String mainAttributes, - String... entries) - throws IOException - { - // create Manifest - Manifest manifest = new Manifest(); - Attributes jarAttrs = manifest.getMainAttributes(); - jarAttrs.put(Attributes.Name.MANIFEST_VERSION, "1.0"); - if (mainAttributes.length() > 0) { - for (String attr: mainAttributes.split(",")) { - String[] s = attr.split("="); - jarAttrs.put(new Attributes.Name(s[0]), s[1]); - } - } - - try (OutputStream out = Files.newOutputStream(Paths.get(jarfile)); - ZipOutputStream zos = new JarOutputStream(out)) - { - // add manifest directory and manifest file - ZipEntry e = new JarEntry(MANIFEST_DIR); - e.setTime(System.currentTimeMillis()); - e.setSize(0); - e.setCrc(0); - zos.putNextEntry(e); - e = new ZipEntry(MANIFEST_NAME); - e.setTime(System.currentTimeMillis()); - zos.putNextEntry(e); - manifest.write(zos); - zos.closeEntry(); - - // entries in JAR file - for (String entry: entries) { - e = new JarEntry(entry); - Path path; - if (entry.endsWith(".class")) { - path = Paths.get(System.getProperty("test.classes"), entry); - } else { - path = Paths.get(entry); - } - BasicFileAttributes attrs = - Files.readAttributes(path, BasicFileAttributes.class); - e.setTime(attrs.lastModifiedTime().toMillis()); - if (attrs.size() == 0) { - e.setMethod(ZipEntry.STORED); - e.setSize(0); - e.setCrc(0); - } - zos.putNextEntry(e); - if (attrs.isRegularFile()) - Files.copy(path, zos); - zos.closeEntry(); - } - } - } - - /** - * Execute the given executable JAR file with the given arguments. This - * method blocks until the launched VM terminates. Any output or error - * message from the launched VM are printed to System.out. Returns the - * exit value. - */ - static int exec(String jf, String... args) throws IOException { - StringBuilder sb = new StringBuilder(); - sb.append(Paths.get(JAVA_HOME, "bin", JAVA_CMD).toString()); - if (NEED_D64) - sb.append(" -d64"); - sb.append(" -jar "); - sb.append(Paths.get(jf).toAbsolutePath()); - for (String arg: args) { - sb.append(' '); - sb.append(arg); - } - String[] cmd = sb.toString().split(" "); - ProcessBuilder pb = new ProcessBuilder(cmd); - pb.redirectErrorStream(true); - Process p = pb.start(); - BufferedReader reader = - new BufferedReader(new InputStreamReader(p.getInputStream())); - String line; - while ((line = reader.readLine()) != null) { - System.out.println(line); - } - try { - return p.waitFor(); - } catch (InterruptedException e) { - throw new RuntimeException("Should not happen"); - } - } - - static void checkRun(String jf, String... args) throws IOException { - if (exec(jf) != 0) - throw new RuntimeException(jf + " failed!!!"); - } - - static void checkRunFail(String jf, String... args) throws IOException { - if (exec(jf) == 0) - throw new RuntimeException(jf + " did not fail!!!"); - System.out.println("Failed as expected"); - } - - public static void main(String[] args) throws IOException { - // ## replace this if there is a standard way to determine the profile - String profile = sun.misc.Version.profileName(); - - int thisProfile = 4; - if ("compact1".equals(profile)) thisProfile = 1; - if ("compact2".equals(profile)) thisProfile = 2; - if ("compact3".equals(profile)) thisProfile = 3; - - // "library" JAR file used by the test - createJarFile("Logging.jar", "", "Logging.class"); - - // Executable JAR file without the Profile attribute - if (thisProfile <= 3) { - createJarFile("Main.jar", - "Main-Class=Main,Class-Path=Logging.jar", - "Main.class"); - checkRunFail("Main.jar"); - } - - // Executable JAR file with Profile attribute, Library JAR file without - for (int p=1; p<=3; p++) { - String attrs = "Main-Class=Main,Class-Path=Logging.jar" + - ",Profile=compact" + p; - createJarFile("Main.jar", attrs, "Main.class"); - if (p <= thisProfile) { - checkRun("Main.jar"); - } else { - checkRunFail("Main.jar"); - } - } - - // Executable JAR file with Profile attribute that has invalid profile - // name, including incorrect case. - createJarFile("Main.jar", - "Main-Class=Main,Class-Path=Logging.jar,Profile=BadName", - "Main.class"); - checkRunFail("Main.jar"); - - createJarFile("Main.jar", - "Main-Class=Main,Class-Path=Logging.jar,Profile=Compact1", - "Main.class"); - checkRunFail("Main.jar"); - - // Executable JAR file and Librrary JAR file with Profile attribute - createJarFile("Main.jar", - "Main-Class=Main,Class-Path=Logging.jar,Profile=compact1", - "Main.class"); - for (int p=1; p<=3; p++) { - String attrs = "Profile=compact" + p; - createJarFile("Logging.jar", attrs, "Logging.class"); - if (p <= thisProfile) { - checkRun("Main.jar"); - } else { - checkRunFail("Main.jar"); - } - } - - // Executable JAR file and Library JAR with Profile attribute, value - // of Profile not recognized - createJarFile("Logging.jar", "Profile=BadName", "Logging.class"); - createJarFile("Main.jar", - "Main-Class=Main,Class-Path=Logging.jar,Profile=compact1", - "Main.class"); - checkRunFail("Main.jar"); - - System.out.println("TEST PASSED."); - } - -}
--- a/test/tools/launcher/profiles/Logging.java Tue Aug 27 13:37:38 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. 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. - * - * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -public class Logging { - private Logging() { } - - public static void log(String msg) { - System.out.println(msg); - } -}
--- a/test/tools/launcher/profiles/Main.java Tue Aug 27 13:37:38 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. 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. - * - * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -public class Main { - private Main() { } - - public static void main(String[] args) { - Logging.log("main running"); - } -}
--- a/test/tools/launcher/profiles/VersionCheck.java Tue Aug 27 13:37:38 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,169 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. 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. - * - * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 8003256 - * @compile -XDignore.symbol.file VersionCheck.java - * @run main VersionCheck - * @summary Tests that "java -version" includes the name of the profile and that - * it matches the name in the release file - */ - -import java.nio.file.*; -import java.io.*; -import java.util.Properties; - -public class VersionCheck { - - static final String JAVA_HOME = System.getProperty("java.home"); - static final String OS_NAME = System.getProperty("os.name"); - static final String OS_ARCH = System.getProperty("os.arch"); - - static final String JAVA_CMD = - OS_NAME.startsWith("Windows") ? "java.exe" : "java"; - - static final boolean NEED_D64 = - OS_NAME.equals("SunOS") && - (OS_ARCH.equals("sparcv9") || OS_ARCH.equals("amd64")); - - /** - * Returns {@code true} if the given class is present. - */ - static boolean isPresent(String cn) { - try { - Class.forName(cn); - return true; - } catch (ClassNotFoundException ignore) { - return false; - } - } - - /** - * Determines the profile by checking whether specific classes are present. - * Returns the empty string if this runtime does not appear to be a profile - * of Java SE. - */ - static String probeProfile() { - if (isPresent("java.awt.Window")) - return ""; - if (isPresent("java.lang.management.ManagementFactory")) - return "compact3"; - if (isPresent("java.sql.DriverManager")) - return "compact2"; - return "compact1"; - } - - /** - * Execs java with the given parameters. The method blocks until the - * process terminates. Returns a {@code ByteArrayOutputStream} with any - * stdout or stderr from the process. - */ - static ByteArrayOutputStream execJava(String... args) - throws IOException - { - StringBuilder sb = new StringBuilder(); - sb.append(Paths.get(JAVA_HOME, "bin", JAVA_CMD).toString()); - if (NEED_D64) - sb.append(" -d64"); - for (String arg: args) { - sb.append(' '); - sb.append(arg); - } - String[] cmd = sb.toString().split(" "); - ProcessBuilder pb = new ProcessBuilder(cmd); - pb.redirectErrorStream(true); - Process p = pb.start(); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte[] buf = new byte[1024]; - int n; - do { - n = p.getInputStream().read(buf); - if (n > 0) - baos.write(buf, 0, n); - } while (n > 0); - try { - int exitCode = p.waitFor(); - if (exitCode != 0) - throw new RuntimeException("Exit code: " + exitCode); - } catch (InterruptedException e) { - throw new RuntimeException("Should not happen"); - } - return baos; - } - - public static void main(String[] args) throws IOException { - String reported = sun.misc.Version.profileName(); - String probed = probeProfile(); - if (!reported.equals(probed)) { - throw new RuntimeException("sun.misc.Version reports: " + reported - + ", but probing reports: " + probed); - } - - String profile = probed; - boolean isFullJre = (profile.length() == 0); - - // check that java -version includes "profile compactN" - String expected = "profile " + profile; - System.out.println("Checking java -version ..."); - ByteArrayOutputStream baos = execJava("-version"); - ByteArrayInputStream bain = new ByteArrayInputStream(baos.toByteArray()); - BufferedReader reader = new BufferedReader(new InputStreamReader(bain)); - boolean found = false; - String line; - while ((line = reader.readLine()) != null) { - if (line.contains(expected)) { - found = true; - break; - } - } - if (found && isFullJre) - throw new RuntimeException(expected + " found in java -version output"); - if (!found && !isFullJre) - throw new RuntimeException("java -version did not include " + expected); - - // check that the profile name matches the release file - System.out.println("Checking release file ..."); - Properties props = new Properties(); - - Path home = Paths.get(JAVA_HOME); - if (home.getFileName().toString().equals("jre")) - home = home.getParent(); - Path release = home.resolve("release"); - try (InputStream in = Files.newInputStream(release)) { - props.load(in); - } - String value = props.getProperty("JAVA_PROFILE"); - if (isFullJre) { - if (value != null) - throw new RuntimeException("JAVA_PROFILE should not be present"); - } else { - if (value == null) - throw new RuntimeException("JAVA_PROFILE not present in release file"); - if (!value.equals("\"" + profile + "\"")) - throw new RuntimeException("Unexpected value of JAVA_PROFILE: " + value); - } - - System.out.println("Test passed."); - } -}
--- a/test/tools/pack200/TimeStamp.java Tue Aug 27 13:37:38 2013 +0400 +++ b/test/tools/pack200/TimeStamp.java Tue Aug 27 21:46:00 2013 -0700 @@ -88,6 +88,7 @@ unpackNative(packFile, pstFile); verifyJar(goldenFile, pstFile); pstFile.delete(); + Utils.cleanup(); } static void unpackNative(File packFile, File outFile) { @@ -149,7 +150,6 @@ Utils.close(jf1); Utils.close(jf2); } - Utils.cleanup(); if (errors > 0) { throw new RuntimeException("FAIL:" + errors + " error(s) encounted"); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/vm/verifier/defaultMethods/DefaultMethodRegressionTests.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2012, 2013, Oracle and/or its affiliates. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8003639 + * @summary defaultMethod resolution and verification + * @run main DefaultMethodRegressionTests + */ + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * This set of classes/interfaces (K/I/C) is specially designed to expose a + * bug in the JVM where it did not find some overloaded methods in some + * specific situations. (fixed by hotspot changeset ffb9316fd9ed). + */ +interface K { + int bbb(Long l); +} + +interface I extends K { + default void aaa() {} + default void aab() {} + default void aac() {} + + default int bbb(Integer i) { return 22; } + default int bbb(Float f) { return 33; } + default int bbb(Long l) { return 44; } + default int bbb(Double d) { return 55; } + default int bbb(String s) { return 66; } + + default void caa() {} + default void cab() {} + default void cac() {} +} + +class C implements I {} + +public class DefaultMethodRegressionTests { + public static void main(String... args) { + new DefaultMethodRegressionTests().run(args); + } + void run(String... args) { + testLostOverloadedMethod(); + System.out.println("testLostOverloadedMethod: OK"); + testInferenceVerifier(); + System.out.println("testInferenceVerifier: OK"); + } + void testLostOverloadedMethod() { + C c = new C(); + assertEquals(c.bbb(new Integer(1)), 22); + assertEquals(c.bbb(new Float(1.1)), 33); + assertEquals(c.bbb(new Long(1L)), 44); + assertEquals(c.bbb(new Double(0.01)), 55); + assertEquals(c.bbb(new String("")), 66); + } + // Test to ensure that the inference verifier accepts older classfiles + // with classes that implement interfaces with defaults. + void testInferenceVerifier() { + // interface I { int m() default { return 99; } } + byte I_bytes[] = { + (byte)0xca, (byte)0xfe, (byte)0xba, (byte)0xbe, 0x00, 0x00, 0x00, 0x34, + 0x00, 0x08, 0x07, 0x00, 0x06, 0x07, 0x00, 0x07, + 0x01, 0x00, 0x03, 0x66, 0x6f, 0x6f, 0x01, 0x00, + 0x03, 0x28, 0x29, 0x49, 0x01, 0x00, 0x04, 0x43, + 0x6f, 0x64, 0x65, 0x01, 0x00, 0x01, 0x49, 0x01, + 0x00, 0x10, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x6c, + 0x61, 0x6e, 0x67, 0x2f, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x06, 0x00, 0x00, 0x01, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, + 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, + 0x00, 0x00, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x03, 0x10, 0x63, (byte)0xac, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 + }; + // public class C implements I {} /* -target 1.5 */ + byte C_bytes[] = { + (byte)0xca, (byte)0xfe, (byte)0xba, (byte)0xbe, 0x00, 0x00, 0x00, 0x31, + 0x00, 0x0c, 0x0a, 0x00, 0x03, 0x00, 0x08, 0x07, + 0x00, 0x09, 0x07, 0x00, 0x0a, 0x07, 0x00, 0x0b, + 0x01, 0x00, 0x06, 0x3c, 0x69, 0x6e, 0x69, 0x74, + 0x3e, 0x01, 0x00, 0x03, 0x28, 0x29, 0x56, 0x01, + 0x00, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x0c, 0x00, + 0x05, 0x00, 0x06, 0x01, 0x00, 0x01, 0x43, 0x01, + 0x00, 0x10, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x6c, + 0x61, 0x6e, 0x67, 0x2f, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x01, 0x00, 0x01, 0x49, 0x00, 0x21, + 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, + 0x00, 0x06, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x05, 0x2a, (byte)0xb7, 0x00, 0x01, (byte)0xb1, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + ClassLoader cl = new ClassLoader() { + protected Class<?> findClass(String name) { + if (name.equals("I")) { + return defineClass("I", I_bytes, 0, I_bytes.length); + } else if (name.equals("C")) { + return defineClass("C", C_bytes, 0, C_bytes.length); + } else { + return null; + } + } + }; + try { + Class.forName("C", true, cl); + } catch (Exception e) { + // unmodified verifier will throw VerifyError + throw new RuntimeException(e); + } + } + void assertEquals(Object o1, Object o2) { + System.out.print("Expected: " + o1); + System.out.println(", Obtained: " + o2); + if (!o1.equals(o2)) { + throw new RuntimeException("got unexpected values"); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/vm/verifier/defaultMethods/DefaultMethodRegressionTestsRun.java Tue Aug 27 21:46:00 2013 -0700 @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2013, Oracle and/or its affiliates. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8003639 + * @summary defaultMethod resolution and verification using an URLClassLoader + * @compile -XDignore.symbol.file=true DefaultMethodRegressionTestsRun.java + * @run main DefaultMethodRegressionTestsRun + */ +import java.io.File; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +/** + * This test is a variant of DefaultMethodRegressionTests, this one creates + * an URLClassLoader to load the support classes. + * + */ +public class DefaultMethodRegressionTestsRun { + public static void main(String... args) throws Exception { + File scratchDir = new File("."); + File testDir = new File(scratchDir, "testdir"); + testDir.mkdirs(); + File srcFile = new File(new File(System.getProperty("test.src")), + "DefaultMethodRegressionTests.java"); + String[] javacargs = { + srcFile.getAbsolutePath(), + "-d", + testDir.getAbsolutePath() + }; + com.sun.tools.javac.Main.compile(javacargs); + runClass(testDir, "DefaultMethodRegressionTests"); + } + static void runClass( + File classPath, + String classname) throws Exception { + URL[] urls = {classPath.toURI().toURL()}; + ClassLoader loader = new URLClassLoader(urls); + Class<?> c = loader.loadClass(classname); + + Class<?>[] argTypes = new Class<?>[]{String[].class}; + Object[] methodArgs = new Object[]{null}; + + Method method = c.getMethod("main", argTypes); + method.invoke(c, methodArgs); + } +}