# HG changeset patch # User lana # Date 1268963422 25200 # Node ID 27cccdaba851d7aa0a15fde302c80f653ad9635f # Parent 85992faf57f55e9a167c10352266c47907681987# Parent c94d9cc81f495d97817eba9d71b84fc45f7661a5 Merge diff -r 85992faf57f5 -r 27cccdaba851 .hgtags --- a/.hgtags Fri Mar 12 17:44:50 2010 -0800 +++ b/.hgtags Thu Mar 18 18:50:22 2010 -0700 @@ -59,3 +59,4 @@ a30062be6d9ca1d48579826f870f85974300004e jdk7-b82 34c8199936a1682aa8587857f44cfaf37c2b6381 jdk7-b83 b1e55627a6980b9508854ed0c0f21d4f981b4494 jdk7-b84 +b6f633a93ae0ec4555ff4bf756f5e2150c9bdede jdk7-b85 diff -r 85992faf57f5 -r 27cccdaba851 .hgtags-top-repo --- a/.hgtags-top-repo Fri Mar 12 17:44:50 2010 -0800 +++ b/.hgtags-top-repo Thu Mar 18 18:50:22 2010 -0700 @@ -59,3 +59,4 @@ e1176f86805fe07fd9fb9da065dc51b47712ce76 jdk7-b82 6880a3af9addb41541e80ebe8cde6f79ec402a58 jdk7-b83 2f3ea057d1ad56cf3b269cdc4de2741411151982 jdk7-b84 +cf26288a114be67c39f2758959ce50b60f5ae330 jdk7-b85 diff -r 85992faf57f5 -r 27cccdaba851 corba/.hgtags --- a/corba/.hgtags Fri Mar 12 17:44:50 2010 -0800 +++ b/corba/.hgtags Thu Mar 18 18:50:22 2010 -0700 @@ -59,3 +59,4 @@ 1e8c1bfad1abb4b81407a0f2645e0fb85764ca48 jdk7-b82 fde0df7a2384f7fe33204a79678989807d9c2b98 jdk7-b83 68c8961a82e4a3ad2a67991e5d834192a81eb4cd jdk7-b84 +c67a9df7bc0ca291f08f9a9cc05cb78ea15d25e6 jdk7-b85 diff -r 85992faf57f5 -r 27cccdaba851 hotspot/.hgtags --- a/hotspot/.hgtags Fri Mar 12 17:44:50 2010 -0800 +++ b/hotspot/.hgtags Thu Mar 18 18:50:22 2010 -0700 @@ -81,3 +81,5 @@ fafab5d5349c7c066d677538db67a1ee0fb33bd2 hs15-b05 3f370a32906eb5ba993fabd7b4279be7f31052b9 jdk7-b83 ffc8d176b84bcfb5ac21302b4feb3b0c0d69b97c jdk7-b84 +6c9796468b91dcbb39e09dfa1baf9779ac45eb66 jdk7-b85 +418bc80ce13995149eadc9eecbba21d7a9fa02ae hs17-b10 diff -r 85992faf57f5 -r 27cccdaba851 jaxp/.hgtags --- a/jaxp/.hgtags Fri Mar 12 17:44:50 2010 -0800 +++ b/jaxp/.hgtags Thu Mar 18 18:50:22 2010 -0700 @@ -59,3 +59,4 @@ c876ad22e4bf9d3c6460080db7ace478e29a3ff9 jdk7-b82 309a0a7fc6ceb1c9fc3a85b3608e97ef8f7b0dfd jdk7-b83 32c0cf01d555747918529a6ff9e06b0090c7a474 jdk7-b84 +6c0ccabb430dacdcd4479f8b197980d5da4eeb66 jdk7-b85 diff -r 85992faf57f5 -r 27cccdaba851 jaxws/.hgtags --- a/jaxws/.hgtags Fri Mar 12 17:44:50 2010 -0800 +++ b/jaxws/.hgtags Thu Mar 18 18:50:22 2010 -0700 @@ -59,3 +59,4 @@ 31573ae8eed15a6c170f3f0d1abd0b9109c0e086 jdk7-b82 371e3ded591d09112a9f231e37cb072781c486ac jdk7-b83 8bc02839eee4ef02cd1b50e87638874368a26535 jdk7-b84 +8424512588ff95362c1f1e5f11c6efd4e7f7db6e jdk7-b85 diff -r 85992faf57f5 -r 27cccdaba851 jdk/.hgtags --- a/jdk/.hgtags Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/.hgtags Thu Mar 18 18:50:22 2010 -0700 @@ -59,3 +59,4 @@ 69ef657320ad5c35cfa12e4d8322d877e778f8b3 jdk7-b82 9027c6b9d7e2c9ca04a1add691b5b50d0f22b1aa jdk7-b83 7cb9388bb1a16365fa5118c5efa38b1cd58be40d jdk7-b84 +b396584a3e64988839cca21ea1f7fbdcc9248783 jdk7-b85 diff -r 85992faf57f5 -r 27cccdaba851 jdk/make/com/sun/Makefile diff -r 85992faf57f5 -r 27cccdaba851 jdk/make/common/shared/Sanity.gmk --- a/jdk/make/common/shared/Sanity.gmk Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/make/common/shared/Sanity.gmk Thu Mar 18 18:50:22 2010 -0700 @@ -687,13 +687,13 @@ ###################################################### sane-alt_outputdir: ifdef ALT_OUTPUTDIR - @if [ `$(ECHO) $(subst \,/,$(ALT_OUTPUTDIR)) | $(EGREP) -ci '^([a-z]:)?/'` -ne 1 ]; then \ + @if [ `$(ECHO) $(subst \,/,$(ALT_OUTPUTDIR)) | $(EGREP) -c '^([A-Za-z]:)?/'` -ne 1 ]; then \ $(ECHO) "ERROR: ALT_OUTPUTDIR must be an Absolute Path Name, \n" \ " not a Relative Path Name. \n" \ "" >> $(ERROR_FILE) ; \ fi ifeq ($(PLATFORM), windows) - @if [ `$(ECHO) $(subst \,/,$(ALT_OUTPUTDIR)) | $(EGREP) -ci '^([a-z]:)'` -ne 1 ]; then \ + @if [ `$(ECHO) $(subst \,/,$(ALT_OUTPUTDIR)) | $(EGREP) -c '^([A-Za-z]:)'` -ne 1 ]; then \ $(ECHO) "ERROR: On windows, ALT_OUTPUTDIR must contain the drive letter. \n" \ "" >> $(ERROR_FILE) ; \ fi @@ -742,7 +742,7 @@ ###################################################### sane-alt_bootdir: ifdef ALT_BOOTDIR - @if [ `$(ECHO) $(subst \,/,$(ALT_BOOTDIR)) | $(EGREP) -ci '^([a-z]:)?/'` -ne 1 ]; then \ + @if [ `$(ECHO) $(subst \,/,$(ALT_BOOTDIR)) | $(EGREP) -c '^([A-Za-z]:)?/'` -ne 1 ]; then \ $(ECHO) "ERROR: ALT_BOOTDIR must be an Absolute Path Name, \n" \ " not a Relative Path Name. \n" \ " The current value of ALT_BOOTDIR is \n" \ @@ -772,7 +772,7 @@ ###################################################### sane-local-bootdir: ifeq ($(PLATFORM), windows) - @if [ `$(ECHO) $(BOOTDIR) | $(EGREP) -ci '^J:'` -ne 0 ]; then \ + @if [ `$(ECHO) $(BOOTDIR) | $(EGREP) -c '^[jJ]:'` -ne 0 ]; then \ $(ECHO) "WARNING: Your BOOTDIR is located on the J: drive. Often the J:\n" \ " drive is mapped over a network. Using a mapped drive for\n" \ " the BOOTDIR may significantly slow down the build process.\n" \ @@ -789,7 +789,7 @@ ###################################################### sane-cacerts: ifdef ALT_CACERTS_FILE - @if [ `$(ECHO) $(subst \,/,$(ALT_CACERTS_FILE)) | $(EGREP) -ci '^([a-z]:)?/'` -ne 1 ]; then \ + @if [ `$(ECHO) $(subst \,/,$(ALT_CACERTS_FILE)) | $(EGREP) -c '^([A-Za-z]:)?/'` -ne 1 ]; then \ $(ECHO) "ERROR: ALT_CACERTS_FILE must be an Absolute Path Name, \n" \ " not a Relative Path Name. \n" \ " The current value of ALT_CACERTS_FILE is \n" \ @@ -1538,7 +1538,7 @@ sane-mozilla: ifeq ($(ARCH_DATA_MODEL), 32) ifdef ALT_MOZILLA_HEADERS_PATH - @if [ `$(ECHO) $(subst \,/,$(ALT_MOZILLA_HEADERS_PATH)) | $(EGREP) -ci '^([a-z]:)?/'` -ne 1 ]; then \ + @if [ `$(ECHO) $(subst \,/,$(ALT_MOZILLA_HEADERS_PATH)) | $(EGREP) -c '^([A-Za-z]:)?/'` -ne 1 ]; then \ $(ECHO) "ERROR: ALT_MOZILLA_HEADERS_PATH must be an Absolute Path Name, \n" \ " not a Relative Path Name. \n" \ " The current value of ALT_MOZILLA_HEADERS_PATH is \n" \ diff -r 85992faf57f5 -r 27cccdaba851 jdk/make/modules/tools/Makefile --- a/jdk/make/modules/tools/Makefile Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/make/modules/tools/Makefile Thu Mar 18 18:50:22 2010 -0700 @@ -135,9 +135,8 @@ $(CLASSANALYZER_JAR_FILE): $(BUILDTOOL_MANIFEST_FILE) $(FILES_class) @$(prep-target) - $(CD) $(BUILDTOOLCLASSDIR) && \ - $(BOOT_JAR_CMD) cfm $@ $(BUILDTOOL_MANIFEST_FILE) \ - $(PKGDIR) $(BOOT_JAR_JFLAGS) || $(RM) $@ + $(BOOT_JAR_CMD) cfm $@ $(BUILDTOOL_MANIFEST_FILE) \ + -C $(BUILDTOOLCLASSDIR) $(PKGDIR) $(BOOT_JAR_JFLAGS) || $(RM) $@ @$(java-vm-cleanup) $(BUILDTOOLJARDIR)/classfile.jar: $(FILES_classfile_class) diff -r 85992faf57f5 -r 27cccdaba851 jdk/make/sun/javazic/tzdata/VERSION --- a/jdk/make/sun/javazic/tzdata/VERSION Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/make/sun/javazic/tzdata/VERSION Thu Mar 18 18:50:22 2010 -0700 @@ -21,4 +21,4 @@ # CA 95054 USA or visit www.sun.com if you need additional information or # have any questions. # -tzdata2009r +tzdata2010b diff -r 85992faf57f5 -r 27cccdaba851 jdk/make/sun/javazic/tzdata/antarctica --- a/jdk/make/sun/javazic/tzdata/antarctica Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/make/sun/javazic/tzdata/antarctica Thu Mar 18 18:50:22 2010 -0700 @@ -128,7 +128,7 @@ Zone Antarctica/Davis 0 - zzz 1957 Jan 13 7:00 - DAVT 1964 Nov # Davis Time 0 - zzz 1969 Feb - 7:00 - DAVT 2009 Oct 18 2:0 + 7:00 - DAVT 2009 Oct 18 2:00 5:00 - DAVT Zone Antarctica/Mawson 0 - zzz 1954 Feb 13 6:00 - MAWT 2009 Oct 18 2:00 diff -r 85992faf57f5 -r 27cccdaba851 jdk/make/sun/javazic/tzdata/asia --- a/jdk/make/sun/javazic/tzdata/asia Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/make/sun/javazic/tzdata/asia Thu Mar 18 18:50:22 2010 -0700 @@ -218,6 +218,41 @@ # http://www.thaindian.com/newsportal/business/bangladesh-to-continue-indefinitely-with-advanced-time_100259987.html # +# From Alexander Krivenyshev (2009-12-24): +# According to Bangladesh newspaper "The Daily Star," +# Bangladesh will change its clock back to Standard Time on Dec 31, 2009. +# +# Clock goes back 1-hr on Dec 31 night. +# +# http://www.thedailystar.net/newDesign/news-details.php?nid=119228 +# +# and +# +# http://www.worldtimezone.com/dst_news/dst_news_bangladesh05.html +# +# +# "...The government yesterday decided to put the clock back by one hour +# on December 31 midnight and the new time will continue until March 31, +# 2010 midnight. The decision came at a cabinet meeting at the Prime +# Minister's Office last night..." + +# From Danvin Ruangchan (2009-12-24): +# ...the news mentions DST will be turned off again 7 months after March +# 31st on Oct 31, 2010. + +# From Arthur David Olson (2009-12-26): +# Indeed, "The government will advance again the Banglasdesh Standard +# Time by one one hour on March 31 next year by enforcing the Daylight +# Saving Time (DST) for seven months. It will continue till October 31 +# until further notice." I take that last sentence as the +# establishment of a rule. + +# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S +Rule Dhaka 2009 only - Jun 19 23:00 1:00 S +Rule Dhaka 2010 only - Jan 1 0:00 0 - +Rule Dhaka 2010 max - Mar 31 23:00 1:00 S +Rule Dhaka 2010 max - Nov 1 0:00 0 - + # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Asia/Dhaka 6:01:40 - LMT 1890 5:53:20 - HMT 1941 Oct # Howrah Mean Time? @@ -225,8 +260,8 @@ 5:30 - IST 1942 Sep 6:30 - BURT 1951 Sep 30 6:00 - DACT 1971 Mar 26 # Dacca Time - 6:00 - BDT 2009 Jun 19 23:00 # Bangladesh Time - 6:00 1:00 BDST + 6:00 - BDT 2009 + 6:00 Dhaka BD%sT # Bhutan # Zone NAME GMTOFF RULES FORMAT [UNTIL] @@ -385,6 +420,69 @@ # West Xinjiang, including Aksu, Atushi, Yining, Hetian, Cele, Luopu, Nileke, # Zhaosu, Tekesi, Gongliu, Chabuchaer, Huocheng, Bole, Pishan, Suiding, # and Yarkand. + +# From Luther Ma (2009-10-17): +# Almost all (>99.9%) ethnic Chinese (properly ethnic Han) living in +# Xinjiang use Chinese Standard Time. Some are aware of Xinjiang time, +# but have no need of it. All planes, trains, and schools function on +# what is called "Beijing time." When Han make an appointment in Chinese +# they implicitly use Beijing time. +# +# On the other hand, ethnic Uyghurs, who make up about half the +# population of Xinjiang, typically use "Xinjiang time" which is two +# hours behind Beijing time, or UTC +0600. The government of the Xinjiang +# Uyghur Autonomous Region, (XAUR, or just Xinjiang for short) as well as +# local governments such as the Urumqi city government use both times in +# publications, referring to what is popularly called Xinjiang time as +# "Urumqi time." When Uyghurs make an appointment in the Uyghur language +# they almost invariably use Xinjiang time. +# +# (Their ethnic Han compatriots would typically have no clue of its +# widespread use, however, because so extremely few of them are fluent in +# Uyghur, comparable to the number of Anglo-Americans fluent in Navajo.) +# +# (...As with the rest of China there was a brief interval ending in 1990 +# or 1991 when summer time was in use. The confusion was severe, with +# the province not having dual times but four times in use at the same +# time. Some areas remained on standard Xinjiang time or Beijing time and +# others moving their clocks ahead.) +# +# ...an example of an official website using of Urumqi time. +# +# The first few lines of the Google translation of +# +# http://www.fjysgl.gov.cn/show.aspx?id=2379&cid=39 +# +# (retrieved 2009-10-13) +# > Urumqi fire seven people are missing the alleged losses of at least +# > 500 million yuan +# > +# > (Reporter Dong Liu) the day before 20:20 or so (Urumqi Time 18:20), +# > Urumqi City Department of International Plaza Luther Qiantang River +# > burst fire. As of yesterday, 18:30, Urumqi City Fire officers and men +# > have worked continuously for 22 hours... + +# From Luther Ma (2009-11-19): +# With the risk of being redundant to previous answers these are the most common +# English "transliterations" (w/o using non-English symbols): +# +# 1. Wulumuqi... +# 2. Kashi... +# 3. Urumqi... +# 4. Kashgar... +# ... +# 5. It seems that Uyghurs in Urumqi has been using Xinjiang since at least the +# 1960's. I know of one Han, now over 50, who grew up in the surrounding +# countryside and used Xinjiang time as a child. +# +# 6. Likewise for Kashgar and the rest of south Xinjiang I don't know of any +# start date for Xinjiang time. +# +# Without having access to local historical records, nor the ability to legally +# publish them, I would go with October 1, 1949, when Xinjiang became the Uyghur +# Autonomous Region under the PRC. (Before that Uyghurs, of course, would also +# not be using Beijing time, but some local time.) + Zone Asia/Kashgar 5:03:56 - LMT 1928 # or Kashi or Kaxgar 5:30 - KAST 1940 # Kashgar Time 5:00 - KAST 1980 May @@ -392,8 +490,8 @@ # From Lee Yiu Chung (2009-10-24): -# I found there are some mistakes for the historial DST rule for Hong -# Kong. Accoring to the DST record from Hong Kong Observatory (actually, +# I found there are some mistakes for the...DST rule for Hong +# Kong. [According] to the DST record from Hong Kong Observatory (actually, # it is not [an] observatory, but the official meteorological agency of HK, # and also serves as the official timing agency), there are some missing # and incorrect rules. Although the exact switch over time is missing, I diff -r 85992faf57f5 -r 27cccdaba851 jdk/make/sun/javazic/tzdata/australasia --- a/jdk/make/sun/javazic/tzdata/australasia Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/make/sun/javazic/tzdata/australasia Thu Mar 18 18:50:22 2010 -0700 @@ -270,9 +270,30 @@ 6:30 - CCT # Cocos Islands Time # Fiji +# From Alexander Krivenyshev (2009-11-10): +# According to Fiji Broadcasting Corporation, Fiji plans to re-introduce DST +# from November 29th 2009 to April 25th 2010. +# +# "Daylight savings to commence this month" +# +# http://www.radiofiji.com.fj/fullstory.php?id=23719 +# +# or +# +# http://www.worldtimezone.com/dst_news/dst_news_fiji01.html +# + +# From Steffen Thorsen (2009-11-10): +# The Fiji Government has posted some more details about the approved +# amendments: +# +# http://www.fiji.gov.fj/publish/page_16198.shtml +# # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Fiji 1998 1999 - Nov Sun>=1 2:00 1:00 S Rule Fiji 1999 2000 - Feb lastSun 3:00 0 - +Rule Fiji 2009 only - Nov 29 2:00 1:00 S +Rule Fiji 2010 only - Apr 25 3:00 0 - # Zone NAME GMTOFF RULES FORMAT [UNTIL] Zone Pacific/Fiji 11:53:40 - LMT 1915 Oct 26 # Suva 12:00 Fiji FJ%sT # Fiji Time diff -r 85992faf57f5 -r 27cccdaba851 jdk/make/sun/javazic/tzdata/europe --- a/jdk/make/sun/javazic/tzdata/europe Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/make/sun/javazic/tzdata/europe Thu Mar 18 18:50:22 2010 -0700 @@ -2152,12 +2152,20 @@ # From Oscar van Vlijmen (2003-10-18): [This region consists of] # Aginskij Buryatskij avtonomnyj okrug, Amurskaya oblast', # [parts of] Respublika Sakha (Yakutiya), Chitinskaya oblast'. + +# From Oscar van Vlijmen (2009-11-29): +# ...some regions of RUssia were merged with others since 2005... +# Some names were changed, no big deal, except for one instance: a new name. +# YAK/YAKST: UTC+9 Zabajkal'skij kraj. + +# From Oscar van Vlijmen (2009-11-29): # The Sakha districts are: Aldanskij, Amginskij, Anabarskij, -# Bulunskij, Verkhnekolymskij, Verkhnevilyujskij, Vilyujskij, Gornyj, +# Verkhnevilyujskij, Vilyujskij, Gornyj, # Zhiganskij, Kobyajskij, Lenskij, Megino-Kangalasskij, Mirninskij, -# Namskij, Nyurbinskij, Olenekskij, Olekminskij, Srednekolymskij, +# Namskij, Nyurbinskij, Olenyokskij, Olyokminskij, # Suntarskij, Tattinskij, Ust'-Aldanskij, Khangalasskij, -# Churapchinskij, Eveno-Bytantajskij. +# Churapchinskij, Eveno-Bytantajskij Natsional'nij. + Zone Asia/Yakutsk 8:38:40 - LMT 1919 Dec 15 8:00 - YAKT 1930 Jun 21 # Yakutsk Time 9:00 Russia YAK%sT 1991 Mar 31 2:00s @@ -2167,7 +2175,9 @@ # From Oscar van Vlijmen (2003-10-18): [This region consists of] # Evrejskaya avtonomnaya oblast', Khabarovskij kraj, Primorskij kraj, # [parts of] Respublika Sakha (Yakutiya). -# The Sakha districts are: Verkhoyanskij, Tomponskij, Ust'-Majskij, + +# From Oscar van Vlijmen (2009-11-29): +# The Sakha districts are: Bulunskij, Verkhoyanskij, Tomponskij, Ust'-Majskij, # Ust'-Yanskij. Zone Asia/Vladivostok 8:47:44 - LMT 1922 Nov 15 9:00 - VLAT 1930 Jun 21 # Vladivostok Time @@ -2188,8 +2198,10 @@ # From Oscar van Vlijmen (2003-10-18): [This region consists of] # Magadanskaya oblast', Respublika Sakha (Yakutiya). # Probably also: Kuril Islands. -# The Sakha districts are: Abyjskij, Allaikhovskij, Momskij, -# Nizhnekolymskij, Ojmyakonskij. + +# From Oscar van Vlijmen (2009-11-29): +# The Sakha districts are: Abyjskij, Allaikhovskij, Verkhhhnekolymskij, Momskij, +# Nizhnekolymskij, Ojmyakonskij, Srednekolymskij. Zone Asia/Magadan 10:03:12 - LMT 1924 May 2 10:00 - MAGT 1930 Jun 21 # Magadan Time 11:00 Russia MAG%sT 1991 Mar 31 2:00s diff -r 85992faf57f5 -r 27cccdaba851 jdk/make/sun/javazic/tzdata/northamerica --- a/jdk/make/sun/javazic/tzdata/northamerica Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/make/sun/javazic/tzdata/northamerica Thu Mar 18 18:50:22 2010 -0700 @@ -1977,6 +1977,58 @@ # http://www.conae.gob.mx/ahorro/horaver2001_m1_2002.html (2002-02-20) # confirms this. Sonora as usual is the only state where DST is not applied. +# From Steffen Thorsen (2009-12-28): +# +# Steffen Thorsen wrote: +# > Mexico's House of Representatives has approved a proposal for northern +# > Mexico's border cities to share the same daylight saving schedule as +# > the United States. +# Now this has passed both the Congress and the Senate, so starting from +# 2010, some border regions will be the same: +# +# http://www.signonsandiego.com/news/2009/dec/28/clocks-will-match-both-sides-border/ +# +# +# http://www.elmananarey.com/diario/noticia/nacional/noticias/empatan_horario_de_frontera_con_eu/621939 +# +# (Spanish) +# +# Could not find the new law text, but the proposed law text changes are here: +# +# http://gaceta.diputados.gob.mx/Gaceta/61/2009/dic/20091210-V.pdf +# +# (Gaceta Parlamentaria) +# +# There is also a list of the votes here: +# +# http://gaceta.diputados.gob.mx/Gaceta/61/2009/dic/V2-101209.html +# +# +# Our page: +# +# http://www.timeanddate.com/news/time/north-mexico-dst-change.html +# + +# From Arthur David Olson (2010-01-20): +# The page +# +# http://dof.gob.mx/nota_detalle.php?codigo=5127480&fecha=06/01/2010 +# +# includes this text: +# En los municipios fronterizos de Tijuana y Mexicali en Baja California; +# Juárez y Ojinaga en Chihuahua; Acuña y Piedras Negras en Coahuila; +# Anáhuac en Nuevo León; y Nuevo Laredo, Reynosa y Matamoros en +# Tamaulipas, la aplicación de este horario estacional surtirá efecto +# desde las dos horas del segundo domingo de marzo y concluirá a las dos +# horas del primer domingo de noviembre. +# En los municipios fronterizos que se encuentren ubicados en la franja +# fronteriza norte en el territorio comprendido entre la línea +# internacional y la línea paralela ubicada a una distancia de veinte +# kilómetros, así como la Ciudad de Ensenada, Baja California, hacia el +# interior del país, la aplicación de este horario estacional surtirá +# efecto desde las dos horas del segundo domingo de marzo y concluirá a +# las dos horas del primer domingo de noviembre. + # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S Rule Mexico 1939 only - Feb 5 0:00 1:00 D Rule Mexico 1939 only - Jun 25 0:00 0 S @@ -2003,13 +2055,19 @@ -6:00 - CST 1981 Dec 23 -5:00 - EST 1982 Dec 2 -6:00 Mexico C%sT -# Coahuila, Durango, Nuevo Leon, Tamaulipas +# Coahuila, Durango, Nuevo Leon, Tamaulipas (near US border) +Zone America/Matamoros -6:40:00 - LMT 1921 Dec 31 23:20:00 + -6:00 - CST 1988 + -6:00 US C%sT 1989 + -6:00 Mexico C%sT 2010 + -6:00 US C%sT +# Coahuila, Durango, Nuevo Leon, Tamaulipas (away from US border) Zone America/Monterrey -6:41:16 - LMT 1921 Dec 31 23:18:44 -6:00 - CST 1988 -6:00 US C%sT 1989 -6:00 Mexico C%sT # Central Mexico -Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 0:23:24 +Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 0:23:24 -7:00 - MST 1927 Jun 10 23:00 -6:00 - CST 1930 Nov 15 -7:00 - MST 1931 May 1 23:00 @@ -2018,7 +2076,19 @@ -6:00 Mexico C%sT 2001 Sep 30 02:00 -6:00 - CST 2002 Feb 20 -6:00 Mexico C%sT -# Chihuahua +# Chihuahua (near US border) +Zone America/Ojinaga -6:57:40 - LMT 1922 Jan 1 0:02:20 + -7:00 - MST 1927 Jun 10 23:00 + -6:00 - CST 1930 Nov 15 + -7:00 - MST 1931 May 1 23:00 + -6:00 - CST 1931 Oct + -7:00 - MST 1932 Apr 1 + -6:00 - CST 1996 + -6:00 Mexico C%sT 1998 + -6:00 - CST 1998 Apr Sun>=1 3:00 + -7:00 Mexico M%sT 2010 + -7:00 US M%sT +# Chihuahua (away from US border) Zone America/Chihuahua -7:04:20 - LMT 1921 Dec 31 23:55:40 -7:00 - MST 1927 Jun 10 23:00 -6:00 - CST 1930 Nov 15 @@ -2052,7 +2122,7 @@ -7:00 - MST 1949 Jan 14 -8:00 - PST 1970 -7:00 Mexico M%sT -# Baja California +# Baja California (near US border) Zone America/Tijuana -7:48:04 - LMT 1922 Jan 1 0:11:56 -7:00 - MST 1924 -8:00 - PST 1927 Jun 10 23:00 @@ -2070,6 +2140,26 @@ -8:00 US P%sT 1996 -8:00 Mexico P%sT 2001 -8:00 US P%sT 2002 Feb 20 + -8:00 Mexico P%sT 2010 + -8:00 US P%sT +# Baja California (away from US border) +Zone America/Santa_Isabel -7:39:28 - LMT 1922 Jan 1 0:20:32 + -7:00 - MST 1924 + -8:00 - PST 1927 Jun 10 23:00 + -7:00 - MST 1930 Nov 15 + -8:00 - PST 1931 Apr 1 + -8:00 1:00 PDT 1931 Sep 30 + -8:00 - PST 1942 Apr 24 + -8:00 1:00 PWT 1945 Aug 14 23:00u + -8:00 1:00 PPT 1945 Nov 12 # Peace + -8:00 - PST 1948 Apr 5 + -8:00 1:00 PDT 1949 Jan 14 + -8:00 - PST 1954 + -8:00 CA P%sT 1961 + -8:00 - PST 1976 + -8:00 US P%sT 1996 + -8:00 Mexico P%sT 2001 + -8:00 US P%sT 2002 Feb 20 -8:00 Mexico P%sT # From Paul Eggert (2006-03-22): # Formerly there was an America/Ensenada zone, which differed from diff -r 85992faf57f5 -r 27cccdaba851 jdk/make/sun/javazic/tzdata/zone.tab --- a/jdk/make/sun/javazic/tzdata/zone.tab Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/make/sun/javazic/tzdata/zone.tab Thu Mar 18 18:50:22 2010 -0700 @@ -301,11 +301,14 @@ MX +1924-09909 America/Mexico_City Central Time - most locations MX +2105-08646 America/Cancun Central Time - Quintana Roo MX +2058-08937 America/Merida Central Time - Campeche, Yucatan -MX +2540-10019 America/Monterrey Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas +MX +2540-10019 America/Monterrey Mexican Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas away from US border +MX +2550-09730 America/Matamoros US Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas near US border MX +2313-10625 America/Mazatlan Mountain Time - S Baja, Nayarit, Sinaloa -MX +2838-10605 America/Chihuahua Mountain Time - Chihuahua +MX +2838-10605 America/Chihuahua Mexican Mountain Time - Chihuahua away from US border +MX +2934-10425 America/Ojinaga US Mountain Time - Chihuahua near US border MX +2904-11058 America/Hermosillo Mountain Standard Time - Sonora -MX +3232-11701 America/Tijuana Pacific Time +MX +3232-11701 America/Tijuana US Pacific Time - Baja California near US border +MX +3018-11452 America/Santa_Isabel Mexican Pacific Time - Baja California away from US border MY +0310+10142 Asia/Kuala_Lumpur peninsular Malaysia MY +0133+11020 Asia/Kuching Sabah & Sarawak MZ -2558+03235 Africa/Maputo diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/com/sun/jndi/ldap/Filter.java --- a/jdk/src/share/classes/com/sun/jndi/ldap/Filter.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/com/sun/jndi/ldap/Filter.java Thu Mar 18 18:50:22 2010 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1999-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1999-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,7 @@ /** * LDAP (RFC-1960) and LDAPv3 (RFC-2254) search filters. * + * @author Xuelei Fan * @author Vincent Ryan * @author Jagane Sundar * @author Rosanna Lee @@ -258,7 +259,7 @@ byte[] answer = new byte[j]; System.arraycopy(tbuf, 0, answer, 0, j); if (dbg) { - Ber.dumpBER(System.err, null, answer, 0, j); + Ber.dumpBER(System.err, "", answer, 0, j); } return answer; } @@ -330,7 +331,7 @@ } - valueStart = eq + 1; // value starts after equal sign + valueStart = eq + 1; // value starts after equal sign valueEnd = filtEnd; typeStart = filtStart; // beginning of string @@ -355,20 +356,199 @@ break; default: typeEnd = eq; + //initializing ftype to make the compiler happy + ftype = 0x00; + break; + } + + if (dbg) { + System.err.println("type: " + typeStart + ", " + typeEnd); + System.err.println("value: " + valueStart + ", " + valueEnd); + } + + // check validity of type + // + // RFC4512 defines the type as the following ABNF: + // attr = attributedescription + // attributedescription = attributetype options + // attributetype = oid + // oid = descr / numericoid + // descr = keystring + // keystring = leadkeychar *keychar + // leadkeychar = ALPHA + // keychar = ALPHA / DIGIT / HYPHEN + // numericoid = number 1*( DOT number ) + // number = DIGIT / ( LDIGIT 1*DIGIT ) + // options = *( SEMI option ) + // option = 1*keychar + // + // And RFC4515 defines the extensible type as the following ABNF: + // attr [dnattrs] [matchingrule] / [dnattrs] matchingrule + int optionsStart = -1; + int extensibleStart = -1; + if ((filter[typeStart] >= '0' && filter[typeStart] <= '9') || + (filter[typeStart] >= 'A' && filter[typeStart] <= 'Z') || + (filter[typeStart] >= 'a' && filter[typeStart] <= 'z')) { + + boolean isNumericOid = + filter[typeStart] >= '0' && filter[typeStart] <= '9'; + for (int i = typeStart + 1; i < typeEnd; i++) { + // ';' is an indicator of attribute options + if (filter[i] == ';') { + if (isNumericOid && filter[i - 1] == '.') { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } + + // attribute options + optionsStart = i; + break; + } + + // ':' is an indicator of extensible rules + if (filter[i] == ':' && ftype == LDAP_FILTER_EXT) { + if (isNumericOid && filter[i - 1] == '.') { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } + + // extensible matching + extensibleStart = i; + break; + } + + if (isNumericOid) { + // numeric object identifier + if ((filter[i] == '.' && filter[i - 1] == '.') || + (filter[i] != '.' && + !(filter[i] >= '0' && filter[i] <= '9'))) { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } + } else { + // descriptor + if (filter[i] != '-' && + !(filter[i] >= '0' && filter[i] <= '9') && + !(filter[i] >= 'A' && filter[i] <= 'Z') && + !(filter[i] >= 'a' && filter[i] <= 'z')) { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } + } + } + } else if (ftype == LDAP_FILTER_EXT && filter[typeStart] == ':') { + // extensible matching + extensibleStart = typeStart; + } else { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } + + // check attribute options + if (optionsStart > 0) { + for (int i = optionsStart + 1; i < typeEnd; i++) { + if (filter[i] == ';') { + if (filter[i - 1] == ';') { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } + continue; + } + + // ':' is an indicator of extensible rules + if (filter[i] == ':' && ftype == LDAP_FILTER_EXT) { + if (filter[i - 1] == ';') { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } + + // extensible matching + extensibleStart = i; + break; + } + + if (filter[i] != '-' && + !(filter[i] >= '0' && filter[i] <= '9') && + !(filter[i] >= 'A' && filter[i] <= 'Z') && + !(filter[i] >= 'a' && filter[i] <= 'z')) { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } + } + } + + // check extensible matching + if (extensibleStart > 0) { + boolean isMatchingRule = false; + for (int i = extensibleStart + 1; i < typeEnd; i++) { + if (filter[i] == ':') { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } else if ((filter[i] >= '0' && filter[i] <= '9') || + (filter[i] >= 'A' && filter[i] <= 'Z') || + (filter[i] >= 'a' && filter[i] <= 'z')) { + boolean isNumericOid = filter[i] >= '0' && filter[i] <= '9'; + i++; + for (int j = i; j < typeEnd; j++, i++) { + // allows no more than two extensible rules + if (filter[j] == ':') { + if (isMatchingRule) { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } + if (isNumericOid && filter[j - 1] == '.') { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } + + isMatchingRule = true; + break; + } + + if (isNumericOid) { + // numeric object identifier + if ((filter[j] == '.' && filter[j - 1] == '.') || + (filter[j] != '.' && + !(filter[j] >= '0' && filter[j] <= '9'))) { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } + } else { + // descriptor + if (filter[j] != '-' && + !(filter[j] >= '0' && filter[j] <= '9') && + !(filter[j] >= 'A' && filter[j] <= 'Z') && + !(filter[j] >= 'a' && filter[j] <= 'z')) { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } + } + } + } else { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } + } + } + + // ensure the latest byte is not isolated + if (filter[typeEnd - 1] == '.' || filter[typeEnd - 1] == ';' || + filter[typeEnd - 1] == ':') { + throw new InvalidSearchFilterException( + "invalid attribute description"); + } + + if (typeEnd == eq) { // filter type is of "equal" if (findUnescaped(filter, '*', valueStart, valueEnd) == -1) { ftype = LDAP_FILTER_EQUALITY; - } else if (filter[valueStart] == '*' && valueStart == (valueEnd - 1)) { + } else if (filter[valueStart] == '*' && + valueStart == (valueEnd - 1)) { ftype = LDAP_FILTER_PRESENT; } else { encodeSubstringFilter(ber, filter, typeStart, typeEnd, valueStart, valueEnd); return; } - break; - } - if (dbg) { - System.err.println("type: " + typeStart + ", " + typeEnd); - System.err.println("value: " + valueStart + ", " + valueEnd); } if (ftype == LDAP_FILTER_PRESENT) { @@ -379,7 +559,7 @@ } else { ber.beginSeq(ftype); ber.encodeOctetString(filter, Ber.ASN_OCTET_STR, - typeStart, typeEnd-typeStart); + typeStart, typeEnd - typeStart); ber.encodeOctetString( unescapeFilterValue(filter, valueStart, valueEnd), Ber.ASN_OCTET_STR); @@ -623,7 +803,8 @@ // //////////////////////////////////////////////////////////////////////////// - private static final boolean dbg = false; + // private static final boolean dbg = false; + private static final boolean dbg = true; private static int dbgIndent = 0; private static void dprint(String msg) { diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/awt/AlphaComposite.java --- a/jdk/src/share/classes/java/awt/AlphaComposite.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/awt/AlphaComposite.java Thu Mar 18 18:50:22 2010 -0700 @@ -614,14 +614,15 @@ } private AlphaComposite(int rule, float alpha) { - if (alpha < 0.0f || alpha > 1.0f) { - throw new IllegalArgumentException("alpha value out of range"); - } if (rule < MIN_RULE || rule > MAX_RULE) { throw new IllegalArgumentException("unknown composite rule"); } - this.rule = rule; - this.extraAlpha = alpha; + if (alpha >= 0.0f && alpha <= 1.0f) { + this.rule = rule; + this.extraAlpha = alpha; + } else { + throw new IllegalArgumentException("alpha value out of range"); + } } /** diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/beans/BeanDescriptor.java --- a/jdk/src/share/classes/java/beans/BeanDescriptor.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/beans/BeanDescriptor.java Thu Mar 18 18:50:22 2010 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1996-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -101,4 +101,9 @@ beanClassRef = old.beanClassRef; customizerClassRef = old.customizerClassRef; } + + void appendTo(StringBuilder sb) { + appendTo(sb, "beanClass", this.beanClassRef); + appendTo(sb, "customizerClass", this.customizerClassRef); + } } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/beans/EventSetDescriptor.java --- a/jdk/src/share/classes/java/beans/EventSetDescriptor.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/beans/EventSetDescriptor.java Thu Mar 18 18:50:22 2010 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,6 @@ package java.beans; import java.lang.ref.Reference; - import java.lang.reflect.Method; /** @@ -357,8 +356,7 @@ * @return The method used to register a listener at the event source. */ public synchronized Method getAddListenerMethod() { - return (addMethodDescriptor != null ? - addMethodDescriptor.getMethod() : null); + return getMethod(this.addMethodDescriptor); } private synchronized void setAddListenerMethod(Method method) { @@ -378,8 +376,7 @@ * @return The method used to remove a listener at the event source. */ public synchronized Method getRemoveListenerMethod() { - return (removeMethodDescriptor != null ? - removeMethodDescriptor.getMethod() : null); + return getMethod(this.removeMethodDescriptor); } private synchronized void setRemoveListenerMethod(Method method) { @@ -401,8 +398,7 @@ * @since 1.4 */ public synchronized Method getGetListenerMethod() { - return (getMethodDescriptor != null ? - getMethodDescriptor.getMethod() : null); + return getMethod(this.getMethodDescriptor); } private synchronized void setGetListenerMethod(Method method) { @@ -522,4 +518,19 @@ unicast = old.unicast; inDefaultEventSet = old.inDefaultEventSet; } + + void appendTo(StringBuilder sb) { + appendTo(sb, "unicast", this.unicast); + appendTo(sb, "inDefaultEventSet", this.inDefaultEventSet); + appendTo(sb, "listenerType", this.listenerTypeRef); + appendTo(sb, "getListenerMethod", getMethod(this.getMethodDescriptor)); + appendTo(sb, "addListenerMethod", getMethod(this.addMethodDescriptor)); + appendTo(sb, "removeListenerMethod", getMethod(this.removeMethodDescriptor)); + } + + private static Method getMethod(MethodDescriptor descriptor) { + return (descriptor != null) + ? descriptor.getMethod() + : null; + } } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/beans/FeatureDescriptor.java --- a/jdk/src/share/classes/java/beans/FeatureDescriptor.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/beans/FeatureDescriptor.java Thu Mar 18 18:50:22 2010 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,7 @@ import java.util.Enumeration; import java.util.Hashtable; +import java.util.Map.Entry; /** * The FeatureDescriptor class is the common baseclass for PropertyDescriptor, @@ -393,4 +394,52 @@ private String name; private String displayName; private Hashtable table; + + /** + * Returns a string representation of the object. + * + * @return a string representation of the object + * + * @since 1.7 + */ + public String toString() { + StringBuilder sb = new StringBuilder(getClass().getName()); + sb.append("[name=").append(this.name); + appendTo(sb, "displayName", this.displayName); + appendTo(sb, "shortDescription", this.shortDescription); + appendTo(sb, "preferred", this.preferred); + appendTo(sb, "hidden", this.hidden); + appendTo(sb, "expert", this.expert); + if ((this.table != null) && !this.table.isEmpty()) { + sb.append("; values={"); + for (Entry entry : this.table.entrySet()) { + sb.append(entry.getKey()).append("=").append(entry.getValue()).append("; "); + } + sb.setLength(sb.length() - 2); + sb.append("}"); + } + appendTo(sb); + return sb.append("]").toString(); + } + + void appendTo(StringBuilder sb) { + } + + static void appendTo(StringBuilder sb, String name, Reference reference) { + if (reference != null) { + appendTo(sb, name, reference.get()); + } + } + + static void appendTo(StringBuilder sb, String name, Object value) { + if (value != null) { + sb.append("; ").append(name).append("=").append(value); + } + } + + static void appendTo(StringBuilder sb, String name, boolean value) { + if (value) { + sb.append("; ").append(name); + } + } } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/beans/IndexedPropertyChangeEvent.java --- a/jdk/src/share/classes/java/beans/IndexedPropertyChangeEvent.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/beans/IndexedPropertyChangeEvent.java Thu Mar 18 18:50:22 2010 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2003-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -62,7 +62,6 @@ this.index = index; } - /** * Gets the index of the property that was changed. * @@ -72,4 +71,8 @@ public int getIndex() { return index; } + + void appendTo(StringBuilder sb) { + sb.append("; index=").append(getIndex()); + } } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java --- a/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/beans/IndexedPropertyDescriptor.java Thu Mar 18 18:50:22 2010 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,6 @@ package java.beans; import java.lang.ref.Reference; - import java.lang.reflect.Method; /** @@ -117,8 +116,7 @@ * This constructor takes the name of a simple property, and Method * objects for reading and writing the property. * - * @param propertyName The programmatic name of the pro -perty. + * @param propertyName The programmatic name of the property. * @param readMethod The method used for reading the property values as an array. * May be null if the property is write-only or must be indexed. * @param writeMethod The method used for writing the property values as an array. @@ -518,20 +516,10 @@ return result; } - /* - public String toString() { - String message = super.toString(); - - message += ", indexedType="; - message += getIndexedPropertyType(); - - message += ", indexedWriteMethod="; - message += indexedWriteMethodName; - - message += ", indexedReadMethod="; - message += indexedReadMethodName; - - return message; + void appendTo(StringBuilder sb) { + super.appendTo(sb); + appendTo(sb, "indexedPropertyType", this.indexedPropertyTypeRef); + appendTo(sb, "indexedReadMethod", this.indexedReadMethodRef); + appendTo(sb, "indexedWriteMethod", this.indexedWriteMethodRef); } - */ } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/beans/MethodDescriptor.java --- a/jdk/src/share/classes/java/beans/MethodDescriptor.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/beans/MethodDescriptor.java Thu Mar 18 18:50:22 2010 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1996-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,9 +27,7 @@ import java.lang.ref.Reference; import java.lang.ref.WeakReference; - import java.lang.reflect.Method; - import java.util.List; import java.util.ArrayList; @@ -167,23 +165,6 @@ } /* - public String toString() { - String message = "name=" + getName(); - Class cls = getClass0(); - if (cls != null) { - message += ", class="; - message += cls.getName(); - } - String[] names = getParamNames(); - if (names != null) { - for (int i = 0; i < names.length; i++) { - message += ", param=" + names[i]; - } - } - return message; - } */ - - /* * Package-private constructor * Merge two method descriptors. Where they conflict, give the * second argument (y) priority over the first argument (x). @@ -233,4 +214,15 @@ } } + void appendTo(StringBuilder sb) { + appendTo(sb, "method", this.methodRef); + if (this.parameterDescriptors != null) { + sb.append("; parameterDescriptors={"); + for (ParameterDescriptor pd : this.parameterDescriptors) { + sb.append(pd).append(", "); + } + sb.setLength(sb.length() - 2); + sb.append("}"); + } + } } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/beans/PropertyChangeEvent.java --- a/jdk/src/share/classes/java/beans/PropertyChangeEvent.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/beans/PropertyChangeEvent.java Thu Mar 18 18:50:22 2010 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -140,4 +140,25 @@ * @see #getPropagationId */ private Object propagationId; + + /** + * Returns a string representation of the object. + * + * @return a string representation of the object + * + * @since 1.7 + */ + public String toString() { + StringBuilder sb = new StringBuilder(getClass().getName()); + sb.append("[propertyName=").append(getPropertyName()); + appendTo(sb); + sb.append("; oldValue=").append(getOldValue()); + sb.append("; newValue=").append(getNewValue()); + sb.append("; propagationId=").append(getPropagationId()); + sb.append("; source=").append(getSource()); + return sb.append("]").toString(); + } + + void appendTo(StringBuilder sb) { + } } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/beans/PropertyDescriptor.java --- a/jdk/src/share/classes/java/beans/PropertyDescriptor.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/beans/PropertyDescriptor.java Thu Mar 18 18:50:22 2010 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,6 @@ package java.beans; import java.lang.ref.Reference; - import java.lang.reflect.Method; import java.lang.reflect.Constructor; @@ -710,22 +709,12 @@ return baseName; } - /* - public String toString() { - String message = "name=" + getName(); - message += ", class=" + getClass0(); - message += ", type=" + getPropertyType(); - - message += ", writeMethod="; - message += writeMethodName; - - message += ", readMethod="; - message += readMethodName; - - message += ", bound=" + bound; - message += ", constrained=" + constrained; - - return message; + void appendTo(StringBuilder sb) { + appendTo(sb, "bound", this.bound); + appendTo(sb, "constrained", this.constrained); + appendTo(sb, "propertyEditorClass", this.propertyEditorClassRef); + appendTo(sb, "propertyType", this.propertyTypeRef); + appendTo(sb, "readMethod", this.readMethodRef); + appendTo(sb, "writeMethod", this.writeMethodRef); } - */ } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/beans/XMLEncoder.java --- a/jdk/src/share/classes/java/beans/XMLEncoder.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/beans/XMLEncoder.java Thu Mar 18 18:50:22 2010 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2000-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -214,8 +214,8 @@ private Object owner; private int indentation = 0; private boolean internal = false; - private Map valueToExpression; - private Map targetToStatementList; + private Map valueToExpression; + private Map> targetToStatementList; private boolean preambleWritten = false; private NameGenerator nameGenerator; @@ -287,8 +287,8 @@ this.declaration = declaration; this.indentation = indentation; this.out = new OutputStreamWriter(out, cs.newEncoder()); - valueToExpression = new IdentityHashMap(); - targetToStatementList = new IdentityHashMap(); + valueToExpression = new IdentityHashMap(); + targetToStatementList = new IdentityHashMap>(); nameGenerator = new NameGenerator(); } @@ -331,13 +331,12 @@ } } - private Vector statementList(Object target) { - Vector list = (Vector)targetToStatementList.get(target); - if (list != null) { - return list; + private List statementList(Object target) { + List list = targetToStatementList.get(target); + if (list == null) { + list = new ArrayList(); + targetToStatementList.put(target, list); } - list = new Vector(); - targetToStatementList.put(target, list); return list; } @@ -363,13 +362,13 @@ } d.marked = true; Object target = exp.getTarget(); + mark(exp); if (!(target instanceof Class)) { statementList(target).add(exp); // Pending: Why does the reference count need to // be incremented here? d.refs++; } - mark(exp); } private void mark(Statement stm) { @@ -463,9 +462,9 @@ preambleWritten = true; } indentation++; - Vector roots = statementList(this); - for(int i = 0; i < roots.size(); i++) { - Statement s = (Statement)roots.get(i); + List statements = statementList(this); + while (!statements.isEmpty()) { + Statement s = statements.remove(0); if ("writeObject".equals(s.getMethodName())) { outputValue(s.getArguments()[0], this, true); } @@ -513,7 +512,7 @@ } private ValueData getValueData(Object o) { - ValueData d = (ValueData)valueToExpression.get(o); + ValueData d = valueToExpression.get(o); if (d == null) { d = new ValueData(); valueToExpression.put(o, d); @@ -619,11 +618,11 @@ } if (d.name != null) { - writeln(""); - return; + outputXML(isArgument ? "object" : "void", " idref=" + quote(d.name), value); } - - outputStatement(d.exp, outer, isArgument); + else if (d.exp != null) { + outputStatement(d.exp, outer, isArgument); + } } private static String quoteCharCode(int code) { @@ -683,13 +682,6 @@ String tag = (expression && isArgument) ? "object" : "void"; String attributes = ""; ValueData d = getValueData(value); - if (expression) { - if (d.refs > 1) { - String instanceName = nameGenerator.instanceName(value); - d.name = instanceName; - attributes = attributes + " id=" + quote(instanceName); - } - } // Special cases for targets. if (target == outer) { @@ -706,13 +698,19 @@ else { d.refs = 2; getValueData(target).refs++; + List statements = statementList(target); + if (!statements.contains(exp)) { + statements.add(exp); + } outputValue(target, outer, false); - if (isArgument) { - outputValue(value, outer, false); - } + outputValue(value, outer, isArgument); return; } - + if (expression && (d.refs > 1)) { + String instanceName = nameGenerator.instanceName(value); + d.name = instanceName; + attributes = attributes + " id=" + quote(instanceName); + } // Special cases for methods. if ((!expression && methodName.equals("set") && args.length == 2 && @@ -730,8 +728,11 @@ else if (!methodName.equals("new") && !methodName.equals("newInstance")) { attributes = attributes + " method=" + quote(methodName); } + outputXML(tag, attributes, value, args); + } - Vector statements = statementList(value); + private void outputXML(String tag, String attributes, Object value, Object... args) { + List statements = statementList(value); // Use XML's short form when there is no body. if (args.length == 0 && statements.size() == 0) { writeln("<" + tag + attributes + "/>"); @@ -745,8 +746,8 @@ outputValue(args[i], null, true); } - for(int i = 0; i < statements.size(); i++) { - Statement s = (Statement)statements.get(i); + while (!statements.isEmpty()) { + Statement s = statements.remove(0); outputStatement(s, value, false); } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/lang/Iterable.java --- a/jdk/src/share/classes/java/lang/Iterable.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/lang/Iterable.java Thu Mar 18 18:50:22 2010 -0700 @@ -27,8 +27,12 @@ import java.util.Iterator; -/** Implementing this interface allows an object to be the target of - * the "foreach" statement. +/** + * Implementing this interface allows an object to be the target of + * the "foreach" statement. + * + * @param the type of elements returned by the iterator + * * @since 1.5 */ public interface Iterable { diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/lang/String.java --- a/jdk/src/share/classes/java/lang/String.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/lang/String.java Thu Mar 18 18:50:22 2010 -0700 @@ -1492,7 +1492,7 @@ */ public int hashCode() { int h = hash; - if (h == 0) { + if (h == 0 && count > 0) { int off = offset; char val[] = value; int len = count; diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/security/IdentityScope.java --- a/jdk/src/share/classes/java/security/IdentityScope.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/security/IdentityScope.java Thu Mar 18 18:50:22 2010 -0700 @@ -129,7 +129,8 @@ /** * Returns the system's identity scope. * - * @return the system's identity scope. + * @return the system's identity scope, or {@code null} if none has been + * set. * * @see #setSystemScope */ diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/util/Collection.java --- a/jdk/src/share/classes/java/util/Collection.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/util/Collection.java Thu Mar 18 18:50:22 2010 -0700 @@ -103,6 +103,8 @@ * * Java Collections Framework. * + * @param the type of elements in this collection + * * @author Josh Bloch * @author Neal Gafter * @see Set diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/util/DualPivotQuicksort.java --- a/jdk/src/share/classes/java/util/DualPivotQuicksort.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/util/DualPivotQuicksort.java Thu Mar 18 18:50:22 2010 -0700 @@ -253,7 +253,7 @@ a[less] = ak; } less++; - } else { // (a[k] > pivot1) - Move a[k] to right part + } else { // (a[k] > pivot1) - Move a[k] to right part /* * We know that pivot1 == a[e3] == pivot2. Thus, we know * that great will still be >= k when the following loop @@ -531,7 +531,7 @@ a[less] = ak; } less++; - } else { // (a[k] > pivot1) - Move a[k] to right part + } else { // (a[k] > pivot1) - Move a[k] to right part /* * We know that pivot1 == a[e3] == pivot2. Thus, we know * that great will still be >= k when the following loop @@ -826,7 +826,7 @@ a[less] = ak; } less++; - } else { // (a[k] > pivot1) - Move a[k] to right part + } else { // (a[k] > pivot1) - Move a[k] to right part /* * We know that pivot1 == a[e3] == pivot2. Thus, we know * that great will still be >= k when the following loop @@ -1119,7 +1119,7 @@ a[less] = ak; } less++; - } else { // (a[k] > pivot1) - Move a[k] to right part + } else { // (a[k] > pivot1) - Move a[k] to right part /* * We know that pivot1 == a[e3] == pivot2. Thus, we know * that great will still be >= k when the following loop @@ -1414,7 +1414,7 @@ a[less] = ak; } less++; - } else { // (a[k] > pivot1) - Move a[k] to right part + } else { // (a[k] > pivot1) - Move a[k] to right part /* * We know that pivot1 == a[e3] == pivot2. Thus, we know * that great will still be >= k when the following loop @@ -1531,7 +1531,7 @@ * Sorts the specified range of the array into ascending order. The range * to be sorted extends from the index {@code fromIndex}, inclusive, to * the index {@code toIndex}, exclusive. If {@code fromIndex == toIndex}, - * the range to be sorted is empty and the call is a no-op). + * the range to be sorted is empty and the call is a no-op). * *

The {@code <} relation does not provide a total order on all float * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN} @@ -1787,7 +1787,7 @@ a[less] = ak; } less++; - } else { // (a[k] > pivot1) - Move a[k] to right part + } else { // (a[k] > pivot1) - Move a[k] to right part /* * We know that pivot1 == a[e3] == pivot2. Thus, we know * that great will still be >= k when the following loop @@ -2160,7 +2160,7 @@ a[less] = ak; } less++; - } else { // (a[k] > pivot1) - Move a[k] to right part + } else { // (a[k] > pivot1) - Move a[k] to right part /* * We know that pivot1 == a[e3] == pivot2. Thus, we know * that great will still be >= k when the following loop diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/util/Iterator.java --- a/jdk/src/share/classes/java/util/Iterator.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/util/Iterator.java Thu Mar 18 18:50:22 2010 -0700 @@ -41,6 +41,8 @@ * * Java Collections Framework. * + * @param the type of elements returned by this iterator + * * @author Josh Bloch * @see Collection * @see ListIterator diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/java/util/List.java --- a/jdk/src/share/classes/java/util/List.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/java/util/List.java Thu Mar 18 18:50:22 2010 -0700 @@ -89,6 +89,8 @@ * * Java Collections Framework. * + * @param the type of elements in this list + * * @author Josh Bloch * @author Neal Gafter * @see Collection diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/javax/swing/JTable.java --- a/jdk/src/share/classes/javax/swing/JTable.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/javax/swing/JTable.java Thu Mar 18 18:50:22 2010 -0700 @@ -2506,10 +2506,7 @@ Color old = this.selectionForeground; this.selectionForeground = selectionForeground; firePropertyChange("selectionForeground", old, selectionForeground); - if ( !selectionForeground.equals(old) ) - { - repaint(); - } + repaint(); } /** @@ -2547,10 +2544,7 @@ Color old = this.selectionBackground; this.selectionBackground = selectionBackground; firePropertyChange("selectionBackground", old, selectionBackground); - if ( !selectionBackground.equals(old) ) - { - repaint(); - } + repaint(); } /** diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java --- a/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/basic/BasicSliderUI.java Thu Mar 18 18:50:22 2010 -0700 @@ -169,15 +169,13 @@ + c + " when it only knows about " + slider + "."); - LookAndFeel.uninstallBorder(slider); - scrollTimer.stop(); scrollTimer = null; + uninstallDefaults(slider); uninstallListeners( slider ); uninstallKeyboardActions(slider); - focusInsets = null; insetCache = null; leftToRightCache = true; focusRect = null; @@ -210,6 +208,12 @@ if (focusInsets == null) focusInsets = new InsetsUIResource(2,2,2,2); } + protected void uninstallDefaults(JSlider slider) { + LookAndFeel.uninstallBorder(slider); + + focusInsets = null; + } + protected TrackListener createTrackListener(JSlider slider) { return new TrackListener(); } @@ -1571,20 +1575,8 @@ offset = 0; scrollTimer.stop(); - // This is the way we have to determine snap-to-ticks. It's - // hard to explain but since ChangeEvents don't give us any - // idea what has changed we don't have a way to stop the thumb - // bounds from being recalculated. Recalculating the thumb - // bounds moves the thumb over the current value (i.e., snapping - // to the ticks). - if (slider.getSnapToTicks() /*|| slider.getSnapToValue()*/ ) { - isDragging = false; - slider.setValueIsAdjusting(false); - } - else { - slider.setValueIsAdjusting(false); - isDragging = false; - } + isDragging = false; + slider.setValueIsAdjusting(false); slider.repaint(); } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthScrollBarUI.java Thu Mar 18 18:50:22 2010 -0700 @@ -62,6 +62,7 @@ (scrollbar.getLayout() instanceof UIResource)) { scrollbar.setLayout(this); } + configureScrollBarColors(); updateStyle(scrollbar); } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthSliderUI.java Thu Mar 18 18:50:22 2010 -0700 @@ -43,7 +43,7 @@ /** * Provides the Synth L&F UI delegate for - * {@link javax.swing.JSlider}. + * {@link JSlider}. * * @author Joshua Outwater * @since 1.7 @@ -65,7 +65,7 @@ * the slider has not changed sizes since being last layed out. If necessary * we recompute the layout. */ - private Dimension lastSize = null; + private Dimension lastSize; private int trackHeight; private int trackBorder; @@ -109,7 +109,7 @@ * Uninstalls default setting. This method is called when a * {@code LookAndFeel} is uninstalled. */ - protected void uninstallDefaults() { + protected void uninstallDefaults(JSlider slider) { SynthContext context = getContext(slider, ENABLED); style.uninstallDefaults(context); context.dispose(); @@ -339,6 +339,7 @@ */ @Override protected void calculateGeometry() { + calculateThumbSize(); layout(); calculateThumbLocation(); } @@ -350,10 +351,6 @@ SynthContext context = getContext(slider); SynthGraphicsUtils synthGraphics = style.getGraphicsUtils(context); - // Set the thumb size. - Dimension size = getThumbSize(); - thumbRect.setSize(size.width, size.height); - // Get the insets for the track. Insets trackInsets = new Insets(0, 0, 0, 0); SynthContext trackContext = getContext(slider, Region.SLIDER_TRACK); @@ -557,39 +554,6 @@ * @inheritDoc */ @Override - protected void calculateTickRect() { - if (slider.getOrientation() == JSlider.HORIZONTAL) { - tickRect.x = trackRect.x; - tickRect.y = trackRect.y + trackRect.height + 2 + getTickLength(); - tickRect.width = trackRect.width; - tickRect.height = getTickLength(); - - if (!slider.getPaintTicks()) { - --tickRect.y; - tickRect.height = 0; - } - } else { - if (SynthLookAndFeel.isLeftToRight(slider)) { - tickRect.x = trackRect.x + trackRect.width; - tickRect.width = getTickLength(); - } else { - tickRect.width = getTickLength(); - tickRect.x = trackRect.x - tickRect.width; - } - tickRect.y = trackRect.y; - tickRect.height = trackRect.height; - - if (!slider.getPaintTicks()) { - --tickRect.x; - tickRect.width = 0; - } - } - } - - /** - * @inheritDoc - */ - @Override public void setThumbLocation(int x, int y) { super.setThumbLocation(x, y); // Value rect is tied to the thumb location. We need to repaint when @@ -865,13 +829,17 @@ valueRect.y, -1); } - SynthContext subcontext = getContext(slider, Region.SLIDER_TRACK); - paintTrack(subcontext, g, trackRect); - subcontext.dispose(); + if (slider.getPaintTrack() && clip.intersects(trackRect)) { + SynthContext subcontext = getContext(slider, Region.SLIDER_TRACK); + paintTrack(subcontext, g, trackRect); + subcontext.dispose(); + } - subcontext = getContext(slider, Region.SLIDER_THUMB); - paintThumb(subcontext, g, thumbRect); - subcontext.dispose(); + if (clip.intersects(thumbRect)) { + SynthContext subcontext = getContext(slider, Region.SLIDER_THUMB); + paintThumb(subcontext, g, thumbRect); + subcontext.dispose(); + } if (slider.getPaintTicks() && clip.intersects(tickRect)) { paintTicks(g); diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthTableUI.java Thu Mar 18 18:50:22 2010 -0700 @@ -45,8 +45,7 @@ import javax.swing.JTable; import javax.swing.LookAndFeel; import javax.swing.border.Border; -import javax.swing.plaf.ComponentUI; -import javax.swing.plaf.UIResource; +import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicTableUI; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.JTableHeader; @@ -158,7 +157,7 @@ if (gridColor == null) { gridColor = style.getColor(context, ColorType.FOREGROUND); } - table.setGridColor(gridColor); + table.setGridColor(gridColor == null ? new ColorUIResource(Color.GRAY) : gridColor); } useTableColors = style.getBoolean(context, diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthToolBarUI.java Thu Mar 18 18:50:22 2010 -0700 @@ -248,23 +248,26 @@ toolBar.getOrientation()); } - // Overloaded to do nothing so we can share listeners. /** - * @inheritDoc + * This implementation does nothing, because the {@code rollover} + * property of the {@code JToolBar} class is not used + * in the Synth Look and Feel. */ @Override protected void setBorderToNonRollover(Component c) {} - // Overloaded to do nothing so we can share listeners. /** - * @inheritDoc + * This implementation does nothing, because the {@code rollover} + * property of the {@code JToolBar} class is not used + * in the Synth Look and Feel. */ @Override protected void setBorderToRollover(Component c) {} - // Overloaded to do nothing so we can share listeners. /** - * @inheritDoc + * This implementation does nothing, because the {@code rollover} + * property of the {@code JToolBar} class is not used + * in the Synth Look and Feel. */ @Override protected void setBorderToNormal(Component c) {} diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthViewportUI.java Thu Mar 18 18:50:22 2010 -0700 @@ -173,13 +173,20 @@ } /** - * @inheritDoc + * Paints the border. The method is never called, + * because the {@code JViewport} class does not support a border. + * This implementation does nothing. + * + * @param context a component context + * @param g the {@code Graphics} to paint on + * @param x the X coordinate + * @param y the Y coordinate + * @param w width of the border + * @param h height of the border */ @Override public void paintBorder(SynthContext context, Graphics g, int x, int y, int w, int h) { - // This does nothing on purpose, JViewport doesn't allow a border - // and therefor this will NEVER be called. } /** diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/javax/swing/text/DefaultEditorKit.java --- a/jdk/src/share/classes/javax/swing/text/DefaultEditorKit.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/javax/swing/text/DefaultEditorKit.java Thu Mar 18 18:50:22 2010 -0700 @@ -1461,13 +1461,17 @@ // Make sure the new visible location contains // the location of dot, otherwise Caret will // cause an additional scroll. - adjustScrollIfNecessary(target, newVis, initialY, - newIndex); - if (select) { - target.moveCaretPosition(newIndex); - } - else { - target.setCaretPosition(newIndex); + int newY = getAdjustedY(target, newVis, newIndex); + + if (direction == -1 && newY <= initialY || direction == 1 && newY >= initialY) { + // Change index and correct newVis.y only if won't cause scrolling upward + newVis.y = newY; + + if (select) { + target.moveCaretPosition(newIndex); + } else { + target.setCaretPosition(newIndex); + } } } } catch (BadLocationException ble) { } @@ -1513,34 +1517,27 @@ } /** - * Adjusts the rectangle that indicates the location to scroll to + * Returns adjustsed {@code y} position that indicates the location to scroll to * after selecting index. */ - private void adjustScrollIfNecessary(JTextComponent text, - Rectangle visible, int initialY, - int index) { + private int getAdjustedY(JTextComponent text, Rectangle visible, int index) { + int result = visible.y; + try { Rectangle dotBounds = text.modelToView(index); - if (dotBounds.y < visible.y || - (dotBounds.y > (visible.y + visible.height)) || - (dotBounds.y + dotBounds.height) > - (visible.y + visible.height)) { - int y; - - if (dotBounds.y < visible.y) { - y = dotBounds.y; - } - else { - y = dotBounds.y + dotBounds.height - visible.height; - } - if ((direction == -1 && y < initialY) || - (direction == 1 && y > initialY)) { - // Only adjust if won't cause scrolling upward. - visible.y = y; + if (dotBounds.y < visible.y) { + result = dotBounds.y; + } else { + if ((dotBounds.y > visible.y + visible.height) || + (dotBounds.y + dotBounds.height > visible.y + visible.height)) { + result = dotBounds.y + dotBounds.height - visible.height; } } - } catch (BadLocationException ble) {} + } catch (BadLocationException ble) { + } + + return result; } /** diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/font/SunFontManager.java --- a/jdk/src/share/classes/sun/font/SunFontManager.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/font/SunFontManager.java Thu Mar 18 18:50:22 2010 -0700 @@ -3058,7 +3058,7 @@ return; } /* Use lock specific to the font system */ - synchronized (lucidaFontName) { + synchronized (this) { if (FontUtilities.debugFonts()) { Thread.dumpStack(); FontUtilities.getLogger() @@ -3194,7 +3194,7 @@ return; } /* Use lock specific to the font system */ - synchronized (lucidaFontName) { + synchronized (this) { if (FontUtilities.debugFonts()) { Thread.dumpStack(); FontUtilities.getLogger().info("loadAllFontFiles() called"); diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/nio/fs/AbstractWatchKey.java --- a/jdk/src/share/classes/sun/nio/fs/AbstractWatchKey.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/nio/fs/AbstractWatchKey.java Thu Mar 18 18:50:22 2010 -0700 @@ -59,10 +59,15 @@ // pending events private List> events; + // maps a context to the last event for the context (iff the last queued + // event for the context is an ENTRY_MODIFY event). + private Map> lastModifyEvents; + protected AbstractWatchKey(AbstractWatchService watcher) { this.watcher = watcher; this.state = State.READY; this.events = new ArrayList>(); + this.lastModifyEvents = new HashMap>(); } final AbstractWatchService watcher() { @@ -86,6 +91,7 @@ */ @SuppressWarnings("unchecked") final void signalEvent(WatchEvent.Kind kind, Object context) { + boolean isModify = (kind == StandardWatchEventKind.ENTRY_MODIFY); synchronized (this) { int size = events.size(); if (size > 0) { @@ -100,17 +106,43 @@ return; } + // if this is a modify event and the last entry for the context + // is a modify event then we simply increment the count + if (!lastModifyEvents.isEmpty()) { + if (isModify) { + WatchEvent ev = lastModifyEvents.get(context); + if (ev != null) { + assert ev.kind() == StandardWatchEventKind.ENTRY_MODIFY; + ((Event)ev).increment(); + return; + } + } else { + // not a modify event so remove from the map as the + // last event will no longer be a modify event. + lastModifyEvents.remove(context); + } + } + // if the list has reached the limit then drop pending events // and queue an OVERFLOW event if (size >= MAX_EVENT_LIST_SIZE) { - events.clear(); kind = StandardWatchEventKind.OVERFLOW; + isModify = false; context = null; } } // non-repeated event - events.add(new Event((WatchEvent.Kind)kind, context)); + Event ev = + new Event((WatchEvent.Kind)kind, context); + if (isModify) { + lastModifyEvents.put(context, ev); + } else if (kind == StandardWatchEventKind.OVERFLOW) { + // drop all pending events + events.clear(); + lastModifyEvents.clear(); + } + events.add(ev); signal(); } } @@ -120,6 +152,7 @@ synchronized (this) { List> result = events; events = new ArrayList>(); + lastModifyEvents.clear(); return result; } } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/security/krb5/internal/crypto/EType.java --- a/jdk/src/share/classes/sun/security/krb5/internal/crypto/EType.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/security/krb5/internal/crypto/EType.java Thu Mar 18 18:50:22 2010 -0700 @@ -1,5 +1,5 @@ /* - * Portions Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved. + * Portions Copyright 2000-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,9 +36,9 @@ import sun.security.krb5.EncryptedData; import sun.security.krb5.EncryptionKey; import sun.security.krb5.KrbException; -import sun.security.krb5.Asn1Exception; import sun.security.krb5.KrbCryptoException; import javax.crypto.*; +import java.util.Arrays; import java.util.List; import java.util.ArrayList; @@ -48,6 +48,23 @@ public abstract class EType { private static final boolean DEBUG = Krb5.DEBUG; + private static final boolean ALLOW_WEAK_CRYPTO; + + static { + boolean allowed = true; + try { + Config cfg = Config.getInstance(); + String temp = cfg.getDefault("allow_weak_crypto", "libdefaults"); + if (temp != null && temp.equals("false")) allowed = false; + } catch (Exception exc) { + if (DEBUG) { + System.out.println ("Exception in getting allow_weak_crypto, " + + "using default value " + + exc.getMessage()); + } + } + ALLOW_WEAK_CRYPTO = allowed; + } public static EType getInstance (int eTypeConst) throws KdcErrException { @@ -163,6 +180,10 @@ return result; } + // Note: the first 2 entries of BUILTIN_ETYPES and BUILTIN_ETYPES_NOAES256 + // should be kept DES-related. They will be removed when allow_weak_crypto + // is set to false. + private static final int[] BUILTIN_ETYPES = new int[] { EncryptedData.ETYPE_DES_CBC_MD5, EncryptedData.ETYPE_DES_CBC_CRC, @@ -189,10 +210,17 @@ } catch (Exception e) { // should not happen } + int[] result; if (allowed < 256) { - return BUILTIN_ETYPES_NOAES256; + result = BUILTIN_ETYPES_NOAES256; + } else { + result = BUILTIN_ETYPES; } - return BUILTIN_ETYPES; + if (!ALLOW_WEAK_CRYPTO) { + // The first 2 etypes are now weak ones + return Arrays.copyOfRange(result, 2, result.length); + } + return result; } /** @@ -207,9 +235,7 @@ if (DEBUG) { System.out.println("Exception while getting " + configName + exc.getMessage()); - System.out.println("Using defaults " + - "des-cbc-md5, des-cbc-crc, des3-cbc-sha1," + - " aes128cts, aes256cts, rc4-hmac"); + System.out.println("Using default builtin etypes"); } return getBuiltInDefaults(); } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/security/provider/JavaKeyStore.java --- a/jdk/src/share/classes/sun/security/provider/JavaKeyStore.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/security/provider/JavaKeyStore.java Thu Mar 18 18:50:22 2010 -0700 @@ -29,9 +29,9 @@ import java.security.*; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; import java.security.cert.CertificateException; import java.util.*; +import sun.misc.IOUtils; import sun.security.pkcs.EncryptedPrivateKeyInfo; @@ -677,50 +677,39 @@ entry.date = new Date(dis.readLong()); // Read the private key - try { - entry.protectedPrivKey = new byte[dis.readInt()]; - } catch (OutOfMemoryError e) { - throw new IOException("Keysize too big"); - } - dis.readFully(entry.protectedPrivKey); + entry.protectedPrivKey = + IOUtils.readFully(dis, dis.readInt(), true); // Read the certificate chain int numOfCerts = dis.readInt(); - try { - if (numOfCerts > 0) { - entry.chain = new Certificate[numOfCerts]; + if (numOfCerts > 0) { + List certs = new ArrayList<>( + numOfCerts > 10 ? 10 : numOfCerts); + for (int j = 0; j < numOfCerts; j++) { + if (xVersion == 2) { + // read the certificate type, and instantiate a + // certificate factory of that type (reuse + // existing factory if possible) + String certType = dis.readUTF(); + if (cfs.containsKey(certType)) { + // reuse certificate factory + cf = cfs.get(certType); + } else { + // create new certificate factory + cf = CertificateFactory.getInstance(certType); + // store the certificate factory so we can + // reuse it later + cfs.put(certType, cf); + } + } + // instantiate the certificate + encoded = IOUtils.readFully(dis, dis.readInt(), true); + bais = new ByteArrayInputStream(encoded); + certs.add(cf.generateCertificate(bais)); + bais.close(); } - } catch (OutOfMemoryError e) { - throw new IOException - ("Too many certificates in chain"); - } - for (int j = 0; j < numOfCerts; j++) { - if (xVersion == 2) { - // read the certificate type, and instantiate a - // certificate factory of that type (reuse - // existing factory if possible) - String certType = dis.readUTF(); - if (cfs.containsKey(certType)) { - // reuse certificate factory - cf = cfs.get(certType); - } else { - // create new certificate factory - cf = CertificateFactory.getInstance(certType); - // store the certificate factory so we can - // reuse it later - cfs.put(certType, cf); - } - } - // instantiate the certificate - try { - encoded = new byte[dis.readInt()]; - } catch (OutOfMemoryError e) { - throw new IOException("Certificate too big"); - } - dis.readFully(encoded); - bais = new ByteArrayInputStream(encoded); - entry.chain[j] = cf.generateCertificate(bais); - bais.close(); + // We can be sure now that numOfCerts of certs are read + entry.chain = certs.toArray(new Certificate[numOfCerts]); } // Add the entry to the list @@ -753,12 +742,7 @@ cfs.put(certType, cf); } } - try { - encoded = new byte[dis.readInt()]; - } catch (OutOfMemoryError e) { - throw new IOException("Certificate too big"); - } - dis.readFully(encoded); + encoded = IOUtils.readFully(dis, dis.readInt(), true); bais = new ByteArrayInputStream(encoded); entry.cert = cf.generateCertificate(bais); bais.close(); diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/security/tools/TimestampedSigner.java --- a/jdk/src/share/classes/sun/security/tools/TimestampedSigner.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/security/tools/TimestampedSigner.java Thu Mar 18 18:50:22 2010 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007-2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright (c) 2007-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -375,7 +375,8 @@ } if (!isSigner) { keyPurposes = cert.getExtendedKeyUsage(); - if (! keyPurposes.contains(KP_TIMESTAMPING_OID)) { + if (keyPurposes == null || + ! keyPurposes.contains(KP_TIMESTAMPING_OID)) { throw new CertificateException( "Certificate is not valid for timestamping"); } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/util/resources/TimeZoneNames.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java Thu Mar 18 18:50:22 2010 -0700 @@ -384,6 +384,7 @@ {"America/Manaus", AMT}, {"America/Marigot", AST}, {"America/Martinique", AST}, + {"America/Matamoros", CST}, {"America/Mazatlan", MST}, {"America/Mendoza", AGT}, {"America/Menominee", CST}, @@ -403,6 +404,7 @@ {"America/Noronha", NORONHA}, {"America/North_Dakota/Center", CST}, {"America/North_Dakota/New_Salem", CST}, + {"America/Ojinaga", MST}, {"America/Panama", EST}, {"America/Pangnirtung", EST}, {"America/Paramaribo", new String[] {"Suriname Time", "SRT", @@ -419,6 +421,7 @@ {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, + {"America/Santa_Isabel", PST}, {"America/Santarem", BRT}, {"America/Santiago", CLT}, {"America/Santo_Domingo", AST}, diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_de.java Thu Mar 18 18:50:22 2010 -0700 @@ -384,6 +384,7 @@ {"America/Manaus", AMT}, {"America/Marigot", AST}, {"America/Martinique", AST}, + {"America/Matamoros", CST}, {"America/Mazatlan", MST}, {"America/Mendoza", AGT}, {"America/Menominee", CST}, @@ -403,6 +404,7 @@ {"America/Noronha", NORONHA}, {"America/North_Dakota/Center", CST}, {"America/North_Dakota/New_Salem", CST}, + {"America/Ojinaga", MST}, {"America/Panama", EST}, {"America/Pangnirtung", EST}, {"America/Paramaribo", new String[] {"Suriname Zeit", "SRT", @@ -419,6 +421,7 @@ {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, + {"America/Santa_Isabel", PST}, {"America/Santarem", BRT}, {"America/Santiago", CLT}, {"America/Santo_Domingo", AST}, diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_es.java Thu Mar 18 18:50:22 2010 -0700 @@ -384,6 +384,7 @@ {"America/Manaus", AMT}, {"America/Marigot", AST}, {"America/Martinique", AST}, + {"America/Matamoros", CST}, {"America/Mazatlan", MST}, {"America/Mendoza", AGT}, {"America/Menominee", CST}, @@ -403,6 +404,7 @@ {"America/Noronha", NORONHA}, {"America/North_Dakota/Center", CST}, {"America/North_Dakota/New_Salem", CST}, + {"America/Ojinaga", MST}, {"America/Panama", EST}, {"America/Pangnirtung", EST}, {"America/Paramaribo", new String[] {"Hora de Surinam", "SRT", @@ -419,6 +421,7 @@ {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, + {"America/Santa_Isabel", PST}, {"America/Santarem", BRT}, {"America/Santiago", CLT}, {"America/Santo_Domingo", AST}, diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_fr.java Thu Mar 18 18:50:22 2010 -0700 @@ -384,6 +384,7 @@ {"America/Manaus", AMT}, {"America/Marigot", AST}, {"America/Martinique", AST}, + {"America/Matamoros", CST}, {"America/Mazatlan", MST}, {"America/Mendoza", AGT}, {"America/Menominee", CST}, @@ -403,6 +404,7 @@ {"America/Noronha", NORONHA}, {"America/North_Dakota/Center", CST}, {"America/North_Dakota/New_Salem", CST}, + {"America/Ojinaga", MST}, {"America/Panama", EST}, {"America/Pangnirtung", EST}, {"America/Paramaribo", new String[] {"Heure du Surinam", "SRT", @@ -419,6 +421,7 @@ {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, + {"America/Santa_Isabel", PST}, {"America/Santarem", BRT}, {"America/Santiago", CLT}, {"America/Santo_Domingo", AST}, diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_it.java Thu Mar 18 18:50:22 2010 -0700 @@ -384,6 +384,7 @@ {"America/Manaus", AMT}, {"America/Marigot", AST}, {"America/Martinique", AST}, + {"America/Matamoros", CST}, {"America/Mazatlan", MST}, {"America/Mendoza", AGT}, {"America/Menominee", CST}, @@ -403,6 +404,7 @@ {"America/Noronha", NORONHA}, {"America/North_Dakota/Center", CST}, {"America/North_Dakota/New_Salem", CST}, + {"America/Ojinaga", MST}, {"America/Panama", EST}, {"America/Pangnirtung", EST}, {"America/Paramaribo", new String[] {"Ora di Suriname", "SRT", @@ -419,6 +421,7 @@ {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, + {"America/Santa_Isabel", PST}, {"America/Santarem", BRT}, {"America/Santiago", CLT}, {"America/Santo_Domingo", AST}, diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ja.java Thu Mar 18 18:50:22 2010 -0700 @@ -384,6 +384,7 @@ {"America/Manaus", AMT}, {"America/Marigot", AST}, {"America/Martinique", AST}, + {"America/Matamoros", CST}, {"America/Mazatlan", MST}, {"America/Mendoza", AGT}, {"America/Menominee", CST}, @@ -403,6 +404,7 @@ {"America/Noronha", NORONHA}, {"America/North_Dakota/Center", CST}, {"America/North_Dakota/New_Salem", CST}, + {"America/Ojinaga", MST}, {"America/Panama", EST}, {"America/Pangnirtung", EST}, {"America/Paramaribo", new String[] {"\u30b9\u30ea\u30ca\u30e0\u6642\u9593", "SRT", @@ -419,6 +421,7 @@ {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, + {"America/Santa_Isabel", PST}, {"America/Santarem", BRT}, {"America/Santiago", CLT}, {"America/Santo_Domingo", AST}, diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_ko.java Thu Mar 18 18:50:22 2010 -0700 @@ -384,6 +384,7 @@ {"America/Manaus", AMT}, {"America/Marigot", AST}, {"America/Martinique", AST}, + {"America/Matamoros", CST}, {"America/Mazatlan", MST}, {"America/Mendoza", AGT}, {"America/Menominee", CST}, @@ -403,6 +404,7 @@ {"America/Noronha", NORONHA}, {"America/North_Dakota/Center", CST}, {"America/North_Dakota/New_Salem", CST}, + {"America/Ojinaga", MST}, {"America/Panama", EST}, {"America/Pangnirtung", EST}, {"America/Paramaribo", new String[] {"\uc218\ub9ac\ub0a8 \uc2dc\uac04", "SRT", @@ -419,6 +421,7 @@ {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, + {"America/Santa_Isabel", PST}, {"America/Santarem", BRT}, {"America/Santiago", CLT}, {"America/Santo_Domingo", AST}, diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_sv.java Thu Mar 18 18:50:22 2010 -0700 @@ -384,6 +384,7 @@ {"America/Manaus", AMT}, {"America/Marigot", AST}, {"America/Martinique", AST}, + {"America/Matamoros", CST}, {"America/Mazatlan", MST}, {"America/Mendoza", AGT}, {"America/Menominee", CST}, @@ -403,6 +404,7 @@ {"America/Noronha", NORONHA}, {"America/North_Dakota/Center", CST}, {"America/North_Dakota/New_Salem", CST}, + {"America/Ojinaga", MST}, {"America/Panama", EST}, {"America/Pangnirtung", EST}, {"America/Paramaribo", new String[] {"Surinam, normaltid", "SRT", @@ -419,6 +421,7 @@ {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, + {"America/Santa_Isabel", PST}, {"America/Santarem", BRT}, {"America/Santiago", CLT}, {"America/Santo_Domingo", AST}, diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_CN.java Thu Mar 18 18:50:22 2010 -0700 @@ -384,6 +384,7 @@ {"America/Manaus", AMT}, {"America/Marigot", AST}, {"America/Martinique", AST}, + {"America/Matamoros", CST}, {"America/Mazatlan", MST}, {"America/Mendoza", AGT}, {"America/Menominee", CST}, @@ -403,6 +404,7 @@ {"America/Noronha", NORONHA}, {"America/North_Dakota/Center", CST}, {"America/North_Dakota/New_Salem", CST}, + {"America/Ojinaga", MST}, {"America/Panama", EST}, {"America/Pangnirtung", EST}, {"America/Paramaribo", new String[] {"\u82cf\u5229\u5357\u65f6\u95f4", "SRT", @@ -419,6 +421,7 @@ {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, + {"America/Santa_Isabel", PST}, {"America/Santarem", BRT}, {"America/Santiago", CLT}, {"America/Santo_Domingo", AST}, diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames_zh_TW.java Thu Mar 18 18:50:22 2010 -0700 @@ -384,6 +384,7 @@ {"America/Manaus", AMT}, {"America/Marigot", AST}, {"America/Martinique", AST}, + {"America/Matamoros", CST}, {"America/Mazatlan", MST}, {"America/Mendoza", AGT}, {"America/Menominee", CST}, @@ -403,6 +404,7 @@ {"America/Noronha", NORONHA}, {"America/North_Dakota/Center", CST}, {"America/North_Dakota/New_Salem", CST}, + {"America/Ojinaga", MST}, {"America/Panama", EST}, {"America/Pangnirtung", EST}, {"America/Paramaribo", new String[] {"\u8607\u5229\u5357\u6642\u9593", "SRT", @@ -419,6 +421,7 @@ {"America/Resolute", RST}, {"America/Rio_Branco", AMT}, {"America/Rosario", AGT}, + {"America/Santa_Isabel", PST}, {"America/Santarem", BRT}, {"America/Santiago", CLT}, {"America/Santo_Domingo", AST}, diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/share/lib/security/java.security --- a/jdk/src/share/lib/security/java.security Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/share/lib/security/java.security Thu Mar 18 18:50:22 2010 -0700 @@ -118,11 +118,6 @@ keystore.type=jks # -# Class to instantiate as the system scope: -# -system.scope=sun.security.provider.IdentityDatabase - -# # List of comma-separated packages that start with or equal this string # will cause a security exception to be thrown when # passed to checkPackageAccess unless the diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/solaris/classes/sun/nio/fs/UnixPath.java --- a/jdk/src/solaris/classes/sun/nio/fs/UnixPath.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/solaris/classes/sun/nio/fs/UnixPath.java Thu Mar 18 18:50:22 2010 -0700 @@ -624,8 +624,11 @@ public boolean endsWith(Path other) { UnixPath that = checkPath(other); + int thisLen = path.length; + int thatLen = that.path.length; + // other path is longer - if (that.path.length > path.length) + if (thatLen > thisLen) return false; // other path is absolute so this path must be absolute @@ -643,10 +646,10 @@ if (thatOffsetCount == thisOffsetCount) { if (thisOffsetCount == 0) return true; - int expectedLen = path.length; + int expectedLen = thisLen; if (this.isAbsolute() && !that.isAbsolute()) expectedLen--; - if (that.path.length != expectedLen) + if (thatLen != expectedLen) return false; } else { // this path has more elements so given path must be relative @@ -658,7 +661,9 @@ // compare bytes int thisPos = offsets[thisOffsetCount - thatOffsetCount]; int thatPos = that.offsets[0]; - while (thatPos < that.path.length) { + if ((thatLen - thatPos) != (thisLen - thisPos)) + return false; + while (thatPos < thatLen) { if (this.path[thisPos++] != that.path[thatPos++]) return false; } diff -r 85992faf57f5 -r 27cccdaba851 jdk/src/solaris/native/java/io/UnixFileSystem_md.c --- a/jdk/src/solaris/native/java/io/UnixFileSystem_md.c Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/src/solaris/native/java/io/UnixFileSystem_md.c Thu Mar 18 18:50:22 2010 -0700 @@ -414,9 +414,9 @@ jlong rv = 0L; WITH_FIELD_PLATFORM_STRING(env, file, ids.path, path) { - struct statvfs fsstat; - memset(&fsstat, 0, sizeof(struct statvfs)); - if (statvfs(path, &fsstat) == 0) { + struct statvfs64 fsstat; + memset(&fsstat, 0, sizeof(fsstat)); + if (statvfs64(path, &fsstat) == 0) { switch(t) { case java_io_FileSystem_SPACE_TOTAL: rv = jlong_mul(long_to_jlong(fsstat.f_frsize), diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/Makefile --- a/jdk/test/Makefile Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/test/Makefile Thu Mar 18 18:50:22 2010 -0700 @@ -1,5 +1,5 @@ # -# Copyright 1995-2009 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 1995-2010 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -37,25 +37,19 @@ AWK = awk CAT = cat CD = cd -CHMOD = chmod CP = cp CUT = cut ECHO = echo EGREP = egrep EXPAND = expand -EXPR = expr -KILL = /usr/bin/kill MKDIR = mkdir -NOHUP = nohup PWD = pwd SED = sed -SLEEP = sleep SORT = sort TEE = tee UNAME = uname UNIQ = uniq WC = wc -XHOST = xhost ZIP = zip # Get OS name from uname @@ -211,66 +205,6 @@ ARCHIVE_BUNDLE = $(JPRT_ARCHIVE_BUNDLE) endif -# DISPLAY settings for virtual frame buffer -START_XVFB = start-Xvfb.sh -NOHUP_OUTPUT = $(ABS_TEST_OUTPUT_DIR)/start-Xvfb.nohup-output.txt -DISPLAY_PID_FILE=$(ABS_TEST_OUTPUT_DIR)/xvfb-display-number.txt -DISPLAY_SLEEP_TIME=10 -DISPLAY_MAX_SLEEPS=10 -ifeq ($(OS_NAME),solaris) - VIRTUAL_FRAME_BUFFER = true -endif -ifeq ($(OS_NAME),linux) - VIRTUAL_FRAME_BUFFER = true -endif - -# Does not work yet, display dies as soon as it gets used. :^( -VIRTUAL_FRAME_BUFFER = false - -# Are we using a VIRTUAL_FRAME_BUFFER (Xvfb) -ifeq ($(VIRTUAL_FRAME_BUFFER),true) - - PREP_DISPLAY = \ - $(CP) $(START_XVFB) $(ABS_TEST_OUTPUT_DIR); \ - $(CHMOD) a+x $(ABS_TEST_OUTPUT_DIR)/$(START_XVFB); \ - ( $(CD) $(ABS_TEST_OUTPUT_DIR) && \ - $(NOHUP) $(ABS_TEST_OUTPUT_DIR)/$(START_XVFB) $(DISPLAY_PID_FILE) > $(NOHUP_OUTPUT) 2>&1 && \ - $(SLEEP) $(DISPLAY_SLEEP_TIME) ) & \ - count=1; \ - while [ ! -s $(DISPLAY_PID_FILE) ] ; do \ - $(ECHO) "Sleeping $(DISPLAY_SLEEP_TIME) more seconds, DISPLAY not ready"; \ - $(SLEEP) $(DISPLAY_SLEEP_TIME); \ - count=`$(EXPR) $${count} '+' 1`; \ - if [ $${count} -gt $(DISPLAY_MAX_SLEEPS) ] ; then \ - $(ECHO) "ERROR: DISPLAY not ready, giving up on DISPLAY"; \ - exit 9; \ - fi; \ - done ; \ - DISPLAY=":`$(CAT) $(DISPLAY_PID_FILE)`"; \ - export DISPLAY; \ - $(CAT) $(NOHUP_OUTPUT); \ - $(ECHO) "Prepared DISPLAY=$${DISPLAY}"; \ - $(XHOST) || \ - ( $(ECHO) "ERROR: No display" ; exit 8) - - KILL_DISPLAY = \ - ( \ - DISPLAY=":`$(CAT) $(DISPLAY_PID_FILE)`"; \ - export DISPLAY; \ - if [ -s "$(DISPLAY_PID_FILE)" ] ; then \ - $(KILL) `$(CAT) $(DISPLAY_PID_FILE)` > /dev/null 2>&1; \ - $(KILL) -9 `$(CAT) $(DISPLAY_PID_FILE)` > /dev/null 2>&1; \ - fi; \ - $(ECHO) "Killed DISPLAY=$${DISPLAY}"; \ - ) - -else - - PREP_DISPLAY = $(ECHO) "VIRTUAL_FRAME_BUFFER=$(VIRTUAL_FRAME_BUFFER)" - KILL_DISPLAY = $(ECHO) "VIRTUAL_FRAME_BUFFER=$(VIRTUAL_FRAME_BUFFER)" - -endif - # How to create the test bundle (pass or fail, we want to create this) # Follow command with ";$(BUNDLE_UP_AND_EXIT)", so it always gets executed. ZIP_UP_RESULTS = ( $(MKDIR) -p `dirname $(ARCHIVE_BUNDLE)` \ @@ -327,7 +261,7 @@ $(ECHO) "Missing file: $${_summary}" >> $(STATS_TXT); \ fi; \ $(CAT) $(STATS_TXT); \ - $(ZIP_UP_RESULTS) && $(KILL_DISPLAY) ; \ + $(ZIP_UP_RESULTS) ; \ $(TESTEXIT) \ ) @@ -629,7 +563,6 @@ ( \ ( JT_HOME=$(shell $(GETMIXEDPATH) "$(JT_HOME)"); \ export JT_HOME; \ - $(PREP_DISPLAY) && \ $(shell $(GETMIXEDPATH) "$(JTREG)") \ $(JTREG_BASIC_OPTIONS) \ -r:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)")/JTreport \ diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/ProblemList.txt --- a/jdk/test/ProblemList.txt Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/test/ProblemList.txt Thu Mar 18 18:50:22 2010 -0700 @@ -1,6 +1,6 @@ ########################################################################### # -# Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. +# Copyright 2009-2010 Sun Microsystems, Inc. All Rights Reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -431,6 +431,12 @@ # jdk_management +# Fails on linux: KO: StringMonitor notification missed or not emitted +javax/management/monitor/NonComparableAttributeValueTest.java generic-all + +# Port conflict? Fails with communication error +sun/management/jmxremote/bootstrap/PasswordFilePermissionTest.sh generic-all + # Fails on Windows 2000, Test failed for iiop java.lang.NullPointerException # at org.omg.stub.javax.management.remote.rmi._RMIConnectionImpl_Tie._invoke(Unknown Source) # at com.sun.corba.se.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:653) @@ -583,6 +589,9 @@ # Suspect many of these tests auffer from using fixed ports, no concrete # evidence. +# Times out on Windows X64 +sun/net/www/http/KeepAliveStream/KeepAliveStreamCloseWithWrongContentLength.java generic-all + # Dies on Solaris 10 sparc and sparcv9, Linux -ea -esa with # Interrupted or IO exception, maybe writing to non-unique named file? com/sun/net/httpserver/bugs/B6373555.java generic-all @@ -736,6 +745,13 @@ # Suspect many of these tests auffer from using fixed ports, no concrete # evidence. +# Occasionally Failing with java.lang.AssertionError on Windows X64 +# at sun.nio.ch.PendingIoCache.clearPendingIoMap(PendingIoCache.java:144) +#java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java windows-all + +# Some kind of sleep/wake problem on Windows X64 +java/nio/channels/Selector/Wakeup.java windows-all + # Fails with -ea -esa, Assertion error, but only on Solaris 10 machines? com/sun/nio/sctp/SctpChannel/Send.java generic-all com/sun/nio/sctp/SctpChannel/Shutdown.java generic-all @@ -932,6 +948,18 @@ # jdk_security +# Unknown problem, could be a jtreg -samevm issue? +# Error while cleaning up threads after test +java/security/Security/SynchronizedAccess.java generic-all + +# Failing on Solaris X64 (-d64 -server) with: +# GSSException: Failure unspecified at GSS-API level +# (Mechanism level: Specified version of key is not available (44)) +sun/security/krb5/auto/BasicKrb5Test.java generic-all + +# Solaris X86 failures, readjar.jks: No such file or directory +sun/security/tools/keytool/readjar.sh generic-all + # Fails with -ea -esa, but only on Solaris sparc? Suspect it is timing out sun/security/tools/keytool/standard.sh generic-all @@ -1256,6 +1284,13 @@ # jdk_util +# Fails with assertion error on windows +# 11 separate stacktraces created... file reuse problem? +java/util/zip/ZipFile/ReadLongZipFileName.java generic-all + +# Recent failure on all platforms +sun/util/resources/TimeZone/Bug6317929.java generic-all + # Fails with -ea -esa on all platforms with Assertion error java/util/ResourceBundle/Test4300693.java generic-all diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/com/sun/jndi/ldap/InvalidLdapFilters.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/com/sun/jndi/ldap/InvalidLdapFilters.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,311 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 6916202 + * @summary More cases of invalid ldap filters accepted and processed + * @run main/othervm InvalidLdapFilters valid (cn=Babs) + * @run main/othervm InvalidLdapFilters valid (&(cn=Bob)) + * @run main/othervm InvalidLdapFilters valid (&(objectClass=*)(uid=*)) + * @run main/othervm InvalidLdapFilters valid (|(cn=Bob)) + * @run main/othervm InvalidLdapFilters valid (|(objectClass=*)(uid=*)) + * @run main/othervm InvalidLdapFilters valid (!(cn=Tim)) + * @run main/othervm InvalidLdapFilters valid (!(!(cn=Tim))) + * @run main/othervm InvalidLdapFilters valid (!(&(objectClass=*)(uid=*))) + * @run main/othervm InvalidLdapFilters valid (!(|(objectClass=*)(uid=*))) + * @run main/othervm InvalidLdapFilters valid (o=univ*of*mich*) + * @run main/othervm InvalidLdapFilters valid (seeAlso=) + * @run main/othervm InvalidLdapFilters valid (cn:caseExactMatch:=Flintstone) + * @run main/othervm InvalidLdapFilters valid (cn:=Betty) + * @run main/othervm InvalidLdapFilters valid (sn:dn:2.4.6.8.10:=Barney) + * @run main/othervm InvalidLdapFilters valid (o:dn:=Ace) + * @run main/othervm InvalidLdapFilters valid (:1.2.3:=Wilma) + * @run main/othervm InvalidLdapFilters valid (:DN:2.4.6.8.10:=Dino) + * @run main/othervm InvalidLdapFilters valid (1.2.3=abc) + * @run main/othervm InvalidLdapFilters valid (cn;lang-de;lang-en=abc) + * @run main/othervm InvalidLdapFilters valid (owner=abc) + * @run main/othervm InvalidLdapFilters valid (sn;lang-en:dn:2.4.6.8.10:=Barney) + * @run main/othervm InvalidLdapFilters valid + (&(objectClass=Person)(|(sn=Jensen)(cn=Bab*))) + * @run main/othervm InvalidLdapFilters invalid "(&(cn=Robert Dean)))" + * @run main/othervm InvalidLdapFilters invalid (&|(cn=Bob)) + * @run main/othervm InvalidLdapFilters invalid (&&(cn=Bob)) + * @run main/othervm InvalidLdapFilters invalid (|&(cn=Bob)) + * @run main/othervm InvalidLdapFilters invalid (||(cn=Bob)) + * @run main/othervm InvalidLdapFilters invalid (:1.2.:=Wilma) + * @run main/othervm InvalidLdapFilters invalid (::DN:2.4.6.8.10:=Dino) + * @run main/othervm InvalidLdapFilters invalid (:DN::2.4.6.8.10:=Dino) + * @run main/othervm InvalidLdapFilters invalid (:DN:2.4.6.8.10::=Dino) + * @run main/othervm InvalidLdapFilters invalid (:DN:2.4.6..8.10:=Dino) + * @run main/othervm InvalidLdapFilters invalid (:DN:2.4.6.8.:=Dino) + * @run main/othervm InvalidLdapFilters invalid (1.2.;::=abc) + * @run main/othervm InvalidLdapFilters invalid (1.2.3;::=abc) + * @run main/othervm InvalidLdapFilters invalid (1.2.3;x;=abc) + * @run main/othervm InvalidLdapFilters invalid (1.2.3:x::=abc) + * @run main/othervm InvalidLdapFilters invalid (1.2.3:x=abc) + * @run main/othervm InvalidLdapFilters invalid (sn;:dn:2.4.6.8.10:=Barney) + * @run main/othervm InvalidLdapFilters invalid "\"((objectClass=*)&(uid=*))\"" + * @run main/othervm InvalidLdapFilters invalid "&(objectClass=*)(uid=*)" + * @run main/othervm InvalidLdapFilters invalid "(:DN:2.4.6.8.10:cn:=Dino)" + * @run main/othervm InvalidLdapFilters invalid "(:DN:2.4.6.8.10:cn=Dino)" + * @run main/othervm InvalidLdapFilters invalid + "((objectCategory=person)(cn=u)(!(cn=u2*)))" + * @run main/othervm InvalidLdapFilters invalid + "((&(objectClass=user)(cn=andy*)(cn=steve*)(cn=bob*)))" + * + * @author Xuelei Fan + */ + +import java.io.*; +import javax.naming.*; +import javax.naming.directory.*; +import java.util.Properties; +import java.util.Hashtable; + +import java.net.Socket; +import java.net.ServerSocket; + +public class InvalidLdapFilters { + // Should we run the client or server in a separate thread? + // + // Both sides can throw exceptions, but do you have a preference + // as to which side should be the main thread. + static boolean separateServerThread = true; + + // use any free port by default + volatile int serverPort = 0; + + // Is the server ready to serve? + volatile static boolean serverReady = false; + + // Define the server side of the test. + // + // If the server prematurely exits, serverReady will be set to true + // to avoid infinite hangs. + void doServerSide() throws Exception { + ServerSocket serverSock = new ServerSocket(serverPort); + + // signal client, it's ready to accecpt connection + serverPort = serverSock.getLocalPort(); + serverReady = true; + + // accept a connection + Socket socket = serverSock.accept(); + System.out.println("Server: Connection accepted"); + + InputStream is = socket.getInputStream(); + OutputStream os = socket.getOutputStream(); + + // read the bindRequest + while (is.read() != -1) { + // ignore + is.skip(is.available()); + break; + } + + byte[] bindResponse = {0x30, 0x0C, 0x02, 0x01, 0x01, 0x61, 0x07, 0x0A, + 0x01, 0x00, 0x04, 0x00, 0x04, 0x00}; + // write bindResponse + os.write(bindResponse); + os.flush(); + + // ignore any more request. + while (is.read() != -1) { + // ignore + is.skip(is.available()); + } + + is.close(); + os.close(); + socket.close(); + serverSock.close(); + } + + // Define the client side of the test. + // + // If the server prematurely exits, serverReady will be set to true + // to avoid infinite hangs. + void doClientSide() throws Exception { + // Wait for server to get started. + while (!serverReady) { + Thread.sleep(50); + } + + // set up the environment for creating the initial context + Hashtable env = new Hashtable(); + env.put(Context.INITIAL_CONTEXT_FACTORY, + "com.sun.jndi.ldap.LdapCtxFactory"); + env.put(Context.PROVIDER_URL, "ldap://localhost:" + serverPort); + env.put("com.sun.jndi.ldap.read.timeout", "1000"); + + // env.put(Context.SECURITY_AUTHENTICATION, "simple"); + // env.put(Context.SECURITY_PRINCIPAL,"cn=root"); + // env.put(Context.SECURITY_CREDENTIALS,"root"); + + // create initial context + DirContext context = new InitialDirContext(env); + + // searching + SearchControls scs = new SearchControls(); + scs.setSearchScope(SearchControls.SUBTREE_SCOPE); + + try { + NamingEnumeration answer = + context.search("o=sun,c=us", searchFilter, scs); + } catch (InvalidSearchFilterException isfe) { + if (filterIsValid) { + // unexpected filter exception. + throw new Exception("Unexpected ISFE", isfe); + } else { + // ignore, it is the expected filter exception. + System.out.println("Expected exception: " + isfe.getMessage()); + } + } catch (NamingException ne) { + // maybe a read timeout exception, as the server does not response. + if (filterIsValid) { + System.out.println("Expected exception: " + ne.getMessage()); + } else { + throw new Exception("Not an InvalidSearchFilterException", ne); + } + } + + context.close(); + } + + private static boolean filterIsValid; + private static String searchFilter; + + private static void parseArguments(String[] args) { + System.out.println("arguments length: " + args.length); + if (args[0].equals("valid")) { + filterIsValid = true; + } + + searchFilter = args[1]; + } + + /* + * ============================================================ + * The remainder is just support stuff + */ + + // client and server thread + Thread clientThread = null; + Thread serverThread = null; + + // client and server exceptions + volatile Exception serverException = null; + volatile Exception clientException = null; + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + System.err.println(e); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + doServerSide(); + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + doClientSide(); + } + } + + // Primary constructor, used to drive remainder of the test. + InvalidLdapFilters() throws Exception { + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * + * If the main thread excepted, that propagates back + * immediately. If the other thread threw an exception, we + * should report back. + */ + if (serverException != null) { + System.out.print("Server Exception:"); + throw serverException; + } + if (clientException != null) { + System.out.print("Client Exception:"); + throw clientException; + } + } + + public static void main(String[] args) throws Exception { + // parse the customized arguments + parseArguments(args); + + // start the test + new InvalidLdapFilters(); + } + +} diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/java/awt/AlphaComposite/TestAlphaCompositeForNaN.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/AlphaComposite/TestAlphaCompositeForNaN.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,22 @@ +/* + * @test + * @bug 6918065 + * @summary Test for passing NaN as alpha + * should throw IllegalArgumentException + */ + +import java.awt.*; + +public class TestAlphaCompositeForNaN { + public static void main(String[] args) { + try { + AlphaComposite a = AlphaComposite.getInstance(AlphaComposite.DST, Float.NaN); + System.out.println("Failed"); + throw new RuntimeException(a + " failed to throw IllegalArgumentException for alpha = " + Float.NaN); + } + catch (IllegalArgumentException ie) { + System.out.println("Passed"); + System.out.println("Caught " + ie); + } + } +} diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/java/beans/Introspector/Test4498236.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/Introspector/Test4498236.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,188 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 4498236 + * @summary Tests toString methods + * @author Sergey Malenkov + */ + +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.beans.BeanDescriptor; +import java.beans.EventSetDescriptor; +import java.beans.FeatureDescriptor; +import java.beans.IndexedPropertyChangeEvent; +import java.beans.IndexedPropertyDescriptor; +import java.beans.MethodDescriptor; +import java.beans.ParameterDescriptor; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Method; + +public class Test4498236 { + + public static void main(String[] args) throws Exception { + PropertyChangeEvent event = new PropertyChangeEvent("source", null, null, null); + event.setPropagationId("id"); + test("[propertyName=null; oldValue=null; newValue=null; propagationId=id; source=source]", event); + test("[propertyName=name; oldValue=old; newValue=new; propagationId=null; source=source]", + new PropertyChangeEvent("source", "name", "old", "new") + ); + test("[propertyName=array; index=5; oldValue=old; newValue=new; propagationId=null; source=source]", + new IndexedPropertyChangeEvent("source", "array", "old", "new", 5) + ); + FeatureDescriptor fd = new FeatureDescriptor(); + fd.setName("n"); + fd.setDisplayName("dn"); + fd.setShortDescription("sd"); + fd.setPreferred(true); + fd.setHidden(true); + fd.setExpert(true); + fd.setValue("first", "value"); + test("[name=n; displayName=dn; shortDescription=sd; preferred; hidden; expert; values={first=value}]", fd); + test("[name=String; beanClass=class java.lang.String]", + new BeanDescriptor(String.class) + ); + test("[name=Object; beanClass=class java.lang.Object; customizerClass=class java.lang.String]", + new BeanDescriptor(Object.class, String.class) + ); + test("[name=Object; beanClass=class java.lang.Object; customizerClass=class java.lang.String]", + new BeanDescriptor(Object.class, String.class) + ); + test("[name=equals; method=public boolean java.lang.Object.equals(java.lang.Object)]", + new MethodDescriptor(Object.class.getMethod("equals", Object.class)) + ); + test("[name=equals; method=public boolean java.lang.Object.equals(java.lang.Object); parameterDescriptors={java.beans.ParameterDescriptor[name=null]}]", + new MethodDescriptor(Object.class.getMethod("equals", Object.class), new ParameterDescriptor[] { + new ParameterDescriptor() + }) + ); + Class type = KeyListener.class; + String[] names = { "keyTyped", "keyPressed", "keyReleased" }; + Method[] methods = new Method[names.length]; + for (int i = 0; i < names.length; i++) { + methods[i] = type.getMethod(names[i], KeyEvent.class); + } + test("[name=key; inDefaultEventSet; listenerType=interface java.awt.event.KeyListener; getListenerMethod=public java.awt.event.KeyListener Test4498236.getKeyListeners(); addListenerMethod=public void Test4498236.addKeyListener(java.awt.event.KeyListener); removeListenerMethod=public void Test4498236.removeKeyListener(java.awt.event.KeyListener)]", + new EventSetDescriptor(Test4498236.class, "key", type, names[0]) + ); + test("[name=$$$; inDefaultEventSet; listenerType=interface java.awt.event.KeyListener; addListenerMethod=public void Test4498236.add(java.awt.event.KeyListener); removeListenerMethod=public void Test4498236.remove(java.awt.event.KeyListener)]", + new EventSetDescriptor(Test4498236.class, "$$$", type, names, "add", "remove") + ); + test("[name=$$$; inDefaultEventSet; listenerType=interface java.awt.event.KeyListener; getListenerMethod=public java.awt.event.KeyListener Test4498236.get(); addListenerMethod=public void Test4498236.add(java.awt.event.KeyListener); removeListenerMethod=public void Test4498236.remove(java.awt.event.KeyListener)]", + new EventSetDescriptor(Test4498236.class, "$$$", type, names, "add", "remove", "get") + ); + test("[name=$$$; inDefaultEventSet; listenerType=interface java.awt.event.KeyListener; addListenerMethod=public void Test4498236.add(java.awt.event.KeyListener); removeListenerMethod=public void Test4498236.remove(java.awt.event.KeyListener)]", + new EventSetDescriptor("$$$", type, methods, Test4498236.class.getMethod("add", type), Test4498236.class.getMethod("remove", type)) + ); + test("[name=$$$; inDefaultEventSet; listenerType=interface java.awt.event.KeyListener; getListenerMethod=public java.awt.event.KeyListener Test4498236.get(); addListenerMethod=public void Test4498236.add(java.awt.event.KeyListener); removeListenerMethod=public void Test4498236.remove(java.awt.event.KeyListener)]", + new EventSetDescriptor("$$$", type, methods, Test4498236.class.getMethod("add", type), Test4498236.class.getMethod("remove", type), Test4498236.class.getMethod("get")) + ); + test("[name=value; propertyType=boolean; readMethod=public boolean Test4498236.isValue(); writeMethod=public void Test4498236.setValue(boolean)]", + new PropertyDescriptor("value", Test4498236.class) + ); + test("[name=$$$]", + new PropertyDescriptor("$$$", Test4498236.class, null, null) + ); + test("[name=$$$; propertyType=boolean; readMethod=public boolean Test4498236.getValue()]", + new PropertyDescriptor("$$$", Test4498236.class, "getValue", null) + ); + test("[name=$$$; propertyType=boolean; readMethod=public boolean Test4498236.getValue(); writeMethod=public void Test4498236.setValue(boolean)]", + new PropertyDescriptor("$$$", Test4498236.class, "getValue", "setValue") + ); + test("[name=$$$]", + new PropertyDescriptor("$$$", null, null) + ); + test("[name=$$$; propertyType=boolean; readMethod=public boolean Test4498236.getValue()]", + new PropertyDescriptor("$$$", Test4498236.class.getMethod("getValue"), null) + ); + test("[name=$$$; propertyType=boolean; readMethod=public boolean Test4498236.getValue(); writeMethod=public void Test4498236.setValue(boolean)]", + new PropertyDescriptor("$$$", Test4498236.class.getMethod("getValue"), Test4498236.class.getMethod("setValue", boolean.class)) + ); + test("[name=index; propertyType=class [I; readMethod=public int[] Test4498236.getIndex(); writeMethod=public void Test4498236.setIndex(int[]); indexedPropertyType=int; indexedReadMethod=public int Test4498236.getIndex(int); indexedWriteMethod=public void Test4498236.setIndex(int,int)]", + new IndexedPropertyDescriptor("index", Test4498236.class) + ); + test("[name=$$$; propertyType=class [I; readMethod=public int[] Test4498236.getIndex(); writeMethod=public void Test4498236.setIndex(int[]); indexedPropertyType=int; indexedReadMethod=public int Test4498236.getIndex(int); indexedWriteMethod=public void Test4498236.setIndex(int,int)]", + new IndexedPropertyDescriptor("$$$", Test4498236.class, "getIndex", "setIndex", "getIndex", "setIndex") + ); + test("[name=$$$; propertyType=class [I; readMethod=public int[] Test4498236.getIndex(); writeMethod=public void Test4498236.setIndex(int[]); indexedPropertyType=int; indexedReadMethod=public int Test4498236.getIndex(int); indexedWriteMethod=public void Test4498236.setIndex(int,int)]", + new IndexedPropertyDescriptor("$$$", Test4498236.class.getMethod("getIndex"), Test4498236.class.getMethod("setIndex", new int[0].getClass()), Test4498236.class.getMethod("getIndex", int.class), Test4498236.class.getMethod("setIndex", int.class, int.class) ) + ); + } + + public void addKeyListener(KeyListener listener) { + add(listener); + } + + public void removeKeyListener(KeyListener listener) { + remove(listener); + } + + public KeyListener getKeyListeners() { + return null; + } + + public void add(KeyListener listener) { + } + + public void remove(KeyListener listener) { + } + + public KeyListener get() { + return null; + } + + public boolean isValue() { + return true; + } + + public boolean getValue() { + return true; + } + + public void setValue(boolean value) { + } + + public int[] getIndex() { + return null; + } + + public int getIndex(int index) { + return 0; + } + + public void setIndex(int index, int value) { + } + + public void setIndex(int[] value) { + } + + private static void test(String expected, Object object) { + String actual = object.toString(); + if (!actual.equals(object.getClass().getName() + expected)) { + throw new Error(actual); + } + } +} diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/java/beans/XMLEncoder/Test5023550.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLEncoder/Test5023550.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,122 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 5023550 + * @summary Tests complex references to owner + * @author Sergey Malenkov + */ + +import java.beans.DefaultPersistenceDelegate; +import java.beans.Encoder; +import java.beans.Expression; +import java.beans.XMLDecoder; +import java.beans.XMLEncoder; + +public class Test5023550 extends AbstractTest { + public static void main(String[] args) { + new Test5023550().test(true); + } + + private final Owner owner = new Owner(); + + @Override + protected void initialize(XMLEncoder encoder) { + encoder.setOwner(this.owner); + encoder.setPersistenceDelegate(A.class, new ADelegate()); + encoder.setPersistenceDelegate(B.class, new BDelegate()); + encoder.setPersistenceDelegate(C.class, new CDelegate()); + } + + @Override + protected void initialize(XMLDecoder decoder) { + decoder.setOwner(this.owner); + } + + protected Object getObject() { + return this.owner.newA(this.owner.newB().newC()); + } + + public static class Owner { + public A newA(C c) { + return new A(c); + } + + public B newB() { + return new B(); + } + } + + public static class A { + private final C c; + + private A(C c) { + this.c = c; + } + + public C getC() { + return this.c; + } + } + + public static class B { + public C newC() { + return new C(this); + } + } + + public static class C { + private final B b; + + private C(B b) { + this.b = b; + } + + public B getB() { + return this.b; + } + } + + public static class ADelegate extends DefaultPersistenceDelegate { + protected Expression instantiate(Object old, Encoder out) { + XMLEncoder encoder = (XMLEncoder) out; + A a = (A) old; + return new Expression(old, encoder.getOwner(), "newA", new Object[] { a.getC() }); + } + } + + public static class BDelegate extends DefaultPersistenceDelegate { + protected Expression instantiate(Object old, Encoder out) { + XMLEncoder encoder = (XMLEncoder) out; + return new Expression(old, encoder.getOwner(), "newB", new Object[0]); + } + } + + public static class CDelegate extends DefaultPersistenceDelegate { + protected Expression instantiate(Object old, Encoder out) { + C c = (C) old; + return new Expression(c, c.getB(), "newC", new Object[0]); + } + } +} diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/java/beans/XMLEncoder/Test5023557.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLEncoder/Test5023557.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,99 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 5023557 + * @summary Tests complex references + * @author Sergey Malenkov + */ + +import java.beans.DefaultPersistenceDelegate; +import java.beans.Encoder; +import java.beans.Expression; +import java.beans.XMLEncoder; + +public class Test5023557 extends AbstractTest { + public static void main(String[] args) { + new Test5023557().test(true); + } + + @Override + protected void initialize(XMLEncoder encoder) { + encoder.setPersistenceDelegate(B.class, new BDelegate()); + encoder.setPersistenceDelegate(C.class, new CDelegate()); + } + + protected Object getObject() { + A a = new A(); + return a.newC(a.newB()); + } + + public static class A { + public B newB() { + return new B(this); + } + + public C newC(B b) { + return new C(b); + } + } + + public static class B { + private final A a; + + private B(A a) { + this.a = a; + } + + public A getA() { + return this.a; + } + } + + public static class C { + private final B b; + + private C(B b) { + this.b = b; + } + + public B getB() { + return this.b; + } + } + + public static class BDelegate extends DefaultPersistenceDelegate { + protected Expression instantiate(Object old, Encoder out) { + B b = (B) old; + return new Expression(b, b.getA(), "newB", new Object[0]); + } + } + + public static class CDelegate extends DefaultPersistenceDelegate { + protected Expression instantiate(Object old, Encoder out) { + C c = (C) old; + return new Expression(c, c.getB().getA(), "newC", new Object[] { c.getB() }); + } + } +} diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/java/beans/XMLEncoder/Test6921644.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/beans/XMLEncoder/Test6921644.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,197 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6921644 + * @summary Tests references to cached integer + * @author Sergey Malenkov + */ + +import java.beans.ConstructorProperties; +import java.util.ArrayList; +import java.util.List; + +public final class Test6921644 extends AbstractTest { + public static void main(String[] args) { + new Test6921644().test(true); + } + + protected Object getObject() { + Owner o = new Owner(100); // it works if ID >= 128 + + Category c = new Category(o); + + Document d1 = new Document(o); + Document d2 = new Document(o); + Document d3 = new Document(o); + + Author a1 = new Author(o); + Author a2 = new Author(o); + Author a3 = new Author(o); + + o.getList().add(a1); + o.getList().add(a2); + o.getList().add(a3); + + a3.setRef(o.getId()); + + d2.setCategory(c); + d3.setCategory(c); + + a1.addDocument(d1); + a1.addDocument(d2); + a3.addDocument(d3); + + c.addDocument(d2); + c.addDocument(d3); + + return o; + } + + public static class Owner { + private int id; + private List list = new ArrayList(); + + @ConstructorProperties("id") + public Owner(int id) { + this.id = id; + } + + public int getId() { + return this.id; + } + + public List getList() { + return this.list; + } + + public void setList(List list) { + this.list = list; + } + } + + public static class Author { + private int id; + private int ref; + private Owner owner; + private List list = new ArrayList(); + + @ConstructorProperties("owner") + public Author(Owner owner) { + this.owner = owner; + this.id = owner.getId(); + } + + public Owner getOwner() { + return this.owner; + } + + public Integer getId() { + return this.id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Integer getRef() { + return this.ref; + } + + public void setRef(Integer ref) { + this.ref = ref; + } + + public List getList() { + return this.list; + } + + public void setList(List list) { + this.list = list; + } + + public void addDocument(Document document) { + this.list.add(document); + document.setAuthor(this); + } + } + + public static class Category { + private Owner owner; + private List list = new ArrayList(); + + @ConstructorProperties("owner") + public Category(Owner owner) { + this.owner = owner; + } + + public Owner getOwner() { + return this.owner; + } + + public List getList() { + return this.list; + } + + public void setList(List list) { + this.list = list; + } + + public void addDocument(Document document) { + this.list.add(document); + document.setCategory(this); + } + } + + public static class Document { + private Owner owner; + private Author author; + private Category category; + + @ConstructorProperties("owner") + public Document(Owner owner) { + this.owner = owner; + } + + public Owner getOwner() { + return this.owner; + } + + public Author getAuthor() { + return this.author; + } + + public void setAuthor(Author author) { + this.author = author; + } + + public Category getCategory() { + return this.category; + } + + public void setCategory(Category category) { + this.category = category; + } + } +} diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/java/nio/file/Files/PrintFileTree.java --- a/jdk/test/java/nio/file/Files/PrintFileTree.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/test/java/nio/file/Files/PrintFileTree.java Thu Mar 18 18:50:22 2010 -0700 @@ -28,27 +28,33 @@ /** * Invokes Files.walkFileTree to traverse a file tree and prints - * each of the directories and files. The -L option causes symbolic - * links to be followed. + * each of the directories and files. The -follow option causes symbolic + * links to be followed and the -printCycles option will print links + * where the target of the link is an ancestor directory. */ public class PrintFileTree { public static void main(String[] args) throws Exception { boolean followLinks = false; - Path dir; - - if (args[0].equals("-L")) { - followLinks = true; - dir = Paths.get(args[1]); - } else { - dir = Paths.get(args[0]); + boolean printCycles = false; + int i = 0; + while (i < (args.length-1)) { + switch (args[i]) { + case "-follow" : followLinks = true; break; + case "-printCycles" : printCycles = true; break; + default: + throw new RuntimeException(args[i] + " not recognized"); + } + i++; } + Path dir = Paths.get(args[i]); Set options = new HashSet(); if (followLinks) options.add(FileVisitOption.FOLLOW_LINKS); + final boolean reportCycles = printCycles; Files.walkFileTree(dir, options, Integer.MAX_VALUE, new FileVisitor() { public FileVisitResult preVisitDirectory(FileRef dir) { System.out.println(dir); @@ -59,7 +65,8 @@ return FileVisitResult.CONTINUE; } public FileVisitResult visitFile(FileRef file, BasicFileAttributes attrs) { - System.out.println(file); + if (!attrs.isDirectory() || reportCycles) + System.out.println(file); return FileVisitResult.CONTINUE; } public FileVisitResult postVisitDirectory(FileRef dir, IOException exc) { diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/java/nio/file/Files/walk_file_tree.sh --- a/jdk/test/java/nio/file/Files/walk_file_tree.sh Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/test/java/nio/file/Files/walk_file_tree.sh Thu Mar 18 18:50:22 2010 -0700 @@ -61,12 +61,20 @@ diff out1 out2 if [ $? != 0 ]; then failures=`expr $failures + 1`; fi -# repeat test following links (use -follow instead of -L -# to allow running on older systems) -$JAVA PrintFileTree -L "$ROOT" > out1 -find "$ROOT" -follow > out2 +# repeat test following links. Some versions of find(1) output +# cycles (sym links to ancestor directories), other versions do +# not. For that reason we run PrintFileTree with the -printCycles +# option when the output without this option differs to find(1). +find "$ROOT" -follow > out1 +$JAVA PrintFileTree -follow "$ROOT" > out2 diff out1 out2 -if [ $? != 0 ]; then failures=`expr $failures + 1`; fi +if [ $? != 0 ]; + then + # re-run printing cycles to stdout + $JAVA PrintFileTree -follow -printCycles "$ROOT" > out2 + diff out1 out2 + if [ $? != 0 ]; then failures=`expr $failures + 1`; fi + fi # test SKIP_SIBLINGS $JAVA SkipSiblings "$ROOT" diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/java/nio/file/Path/CheckPermissions.java --- a/jdk/test/java/nio/file/Path/CheckPermissions.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/test/java/nio/file/Path/CheckPermissions.java Thu Mar 18 18:50:22 2010 -0700 @@ -197,7 +197,7 @@ } public static void main(String[] args) throws IOException { - Path dir = Paths.get(System.getProperty("test.src", ".")); + Path dir = Paths.get(System.getProperty("test.dir", ".")); Path file = dir.resolve("file1234").createFile(); try { LoggingSecurityManager.install(); diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/java/nio/file/Path/PathOps.java --- a/jdk/test/java/nio/file/Path/PathOps.java Fri Mar 12 17:44:50 2010 -0800 +++ b/jdk/test/java/nio/file/Path/PathOps.java Thu Mar 18 18:50:22 2010 -0700 @@ -22,7 +22,7 @@ */ /* @test - * @bug 4313887 6838333 + * @bug 4313887 6838333 6925932 * @summary Unit test for java.nio.file.Path path operations */ @@ -614,17 +614,34 @@ test("/foo") .ends("foo") .ends("/foo") - .notEnds("/"); + .notEnds("fool"); test("/foo/bar") .ends("bar") .ends("foo/bar") .ends("/foo/bar") - .notEnds("/bar"); + .notEnds("ar") + .notEnds("barack") + .notEnds("/bar") + .notEnds("o/bar"); test("foo") - .ends("foo"); + .ends("foo") + .notEnds("oo") + .notEnds("oola"); test("foo/bar") .ends("bar") - .ends("foo/bar"); + .ends("foo/bar") + .notEnds("r") + .notEnds("barmaid") + .notEnds("/bar"); + test("foo/bar/gus") + .ends("gus") + .ends("bar/gus") + .ends("foo/bar/gus") + .notEnds("g") + .notEnds("/gus") + .notEnds("r/gus") + .notEnds("barack/gus") + .notEnds("bar/gust"); // elements test("a/b/c") diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/java/nio/file/WatchService/LotsOfEvents.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/nio/file/WatchService/LotsOfEvents.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,222 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + * @bug 6907760 6929532 + * @summary Tests WatchService behavior when lots of events are pending + * @library .. + * @run main/timeout=180 LotsOfEvents + */ + +import java.nio.file.*; +import static java.nio.file.StandardWatchEventKind.*; +import java.io.IOException; +import java.io.OutputStream; +import java.util.*; +import java.util.concurrent.TimeUnit; + +public class LotsOfEvents { + + static final Random rand = new Random(); + + public static void main(String[] args) throws Exception { + Path dir = TestUtil.createTemporaryDirectory(); + try { + testOverflowEvent(dir); + testModifyEventsQueuing(dir); + } finally { + TestUtil.removeAll(dir); + } + } + + /** + * Tests that OVERFLOW events are not retreived with other events. + */ + static void testOverflowEvent(Path dir) + throws IOException, InterruptedException + { + WatchService watcher = dir.getFileSystem().newWatchService(); + try { + dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE); + + // create a lot of files + int n = 1024; + Path[] files = new Path[n]; + for (int i=0; i expectedKind, + int count) + throws IOException, InterruptedException + { + // wait for key to be signalled - the timeout is long to allow for + // polling implementations + WatchKey key = watcher.poll(15, TimeUnit.SECONDS); + if (key != null && count == 0) + throw new RuntimeException("Key was signalled (unexpected)"); + if (key == null && count > 0) + throw new RuntimeException("Key not signalled (unexpected)"); + + int nread = 0; + boolean gotOverflow = false; + while (key != null) { + List> events = key.pollEvents(); + for (WatchEvent event: events) { + WatchEvent.Kind kind = event.kind(); + if (kind == expectedKind) { + // expected event kind + if (++nread > count) + throw new RuntimeException("More events than expected!!"); + } else if (kind == OVERFLOW) { + // overflow event should not be retrieved with other events + if (events.size() > 1) + throw new RuntimeException("Overflow retrieved with other events"); + gotOverflow = true; + } else { + throw new RuntimeException("Unexpected event '" + kind + "'"); + } + } + if (!key.reset()) + throw new RuntimeException("Key is no longer valid"); + key = watcher.poll(2, TimeUnit.SECONDS); + } + + // check that all expected events were received or there was an overflow + if (nread < count && !gotOverflow) + throw new RuntimeException("Insufficient events"); + } + + /** + * Tests that check that ENTRY_MODIFY events are queued efficiently + */ + static void testModifyEventsQueuing(Path dir) + throws IOException, InterruptedException + { + // this test uses a random number of files + final int nfiles = 5 + rand.nextInt(10); + DirectoryEntry[] entries = new DirectoryEntry[nfiles]; + for (int i=0; i modified = new HashSet(); + for (WatchEvent event: key.pollEvents()) { + WatchEvent.Kind kind = event.kind(); + Path file = (kind == OVERFLOW) ? null : (Path)event.context(); + if (kind == ENTRY_MODIFY) { + boolean added = modified.add(file); + if (!added) { + throw new RuntimeException( + "ENTRY_MODIFY events not queued efficiently"); + } + } else { + if (file != null) modified.remove(file); + } + } + if (!key.reset()) + throw new RuntimeException("Key is no longer valid"); + key = watcher.poll(2, TimeUnit.SECONDS); + } + } + + } finally { + watcher.close(); + } + } + + static class DirectoryEntry { + private final Path file; + DirectoryEntry(Path file) { + this.file = file; + } + void create() throws IOException { + if (file.notExists()) + file.createFile(); + + } + void deleteIfExists() throws IOException { + file.deleteIfExists(); + } + void modifyIfExists() throws IOException { + if (file.exists()) { + OutputStream out = file.newOutputStream(StandardOpenOption.APPEND); + try { + out.write("message".getBytes()); + } finally { + out.close(); + } + } + } + } + +} diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/java/nio/file/WatchService/OverflowEventIsLoner.java --- a/jdk/test/java/nio/file/WatchService/OverflowEventIsLoner.java Fri Mar 12 17:44:50 2010 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,122 +0,0 @@ -/* - * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -/* @test - * @bug 6907760 - * @summary Check that the OVERFLOW event is not retrieved with other events - * @library .. - */ - -import java.nio.file.*; -import static java.nio.file.StandardWatchEventKind.*; -import java.io.IOException; -import java.util.List; -import java.util.concurrent.TimeUnit; - -public class OverflowEventIsLoner { - - static void drainEvents(WatchService watcher, - WatchEvent.Kind expectedKind, - int count) - throws IOException, InterruptedException - { - // wait for key to be signalled - the timeout is long to allow for - // polling implementations - WatchKey key = watcher.poll(15, TimeUnit.SECONDS); - if (key != null && count == 0) - throw new RuntimeException("Key was signalled (unexpected)"); - if (key == null && count > 0) - throw new RuntimeException("Key not signalled (unexpected)"); - - int nread = 0; - boolean gotOverflow = false; - do { - List> events = key.pollEvents(); - for (WatchEvent event: events) { - WatchEvent.Kind kind = event.kind(); - if (kind == expectedKind) { - // expected event kind - if (++nread > count) - throw new RuntimeException("More events than expected!!"); - } else if (kind == OVERFLOW) { - // overflow event should not be retrieved with other events - if (events.size() > 1) - throw new RuntimeException("Overflow retrieved with other events"); - gotOverflow = true; - } else { - throw new RuntimeException("Unexpected event '" + kind + "'"); - } - } - if (!key.reset()) - throw new RuntimeException("Key is no longer valid"); - key = watcher.poll(2, TimeUnit.SECONDS); - } while (key != null); - - // check that all expected events were received or there was an overflow - if (nread < count && !gotOverflow) - throw new RuntimeException("Insufficient events"); - } - - - static void test(Path dir) throws IOException, InterruptedException { - WatchService watcher = dir.getFileSystem().newWatchService(); - try { - WatchKey key = dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE); - - // create a lot of files - int n = 1024; - Path[] files = new Path[n]; - for (int i=0; i + + + + + + + +
  + + + TEST FOR JScrollPane BUG
+
+ +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+This is a test html file. +
+ + END OF TEST FOR JScrollPane BUG
+
+
+
 
+ + diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/javax/swing/JScrollBar/6924059/bug6924059.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JScrollBar/6924059/bug6924059.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,56 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + * @bug 6924059 + * @summary SynthScrollBarUI.configureScrollBarColors() should have spec different from the overridden method + * @author Pavel Porvatov + * @run main bug6924059 + */ + +import javax.swing.*; +import javax.swing.plaf.synth.SynthLookAndFeel; +import javax.swing.plaf.synth.SynthScrollBarUI; + +public class bug6924059 { + private static boolean isMethodCalled; + + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel(new SynthLookAndFeel()); + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + new JScrollBar().setUI(new SynthScrollBarUI() { + protected void configureScrollBarColors() { + super.configureScrollBarColors(); + isMethodCalled = true; + } + }); + + if (!isMethodCalled) { + throw new RuntimeException("The configureScrollBarColors was not called"); + } + } + }); + } +} diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/javax/swing/JSlider/6848475/bug6848475.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JSlider/6848475/bug6848475.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,126 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + * @bug 6848475 + * @summary JSlider does not display the correct value of its BoundedRangeModel + * @author Pavel Porvatov + * @run main bug6848475 + */ + +import sun.awt.SunToolkit; + +import javax.swing.*; +import javax.swing.plaf.SliderUI; +import javax.swing.plaf.basic.BasicSliderUI; +import java.awt.*; +import java.awt.event.InputEvent; +import java.lang.reflect.Field; + +public class bug6848475 { + private static JFrame frame; + + private static JSlider slider; + + private static Robot robot; + + private static int thumbRectX; + + public static void main(String[] args) throws Exception { + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + + robot = new Robot(); + robot.setAutoDelay(100); + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + frame = new JFrame(); + + DefaultBoundedRangeModel sliderModel = new DefaultBoundedRangeModel() { + public void setValue(int n) { + // Don't allow value to be changed + } + }; + + slider = new JSlider(sliderModel); + + frame.getContentPane().add(slider); + frame.pack(); + frame.setVisible(true); + } + }); + + toolkit.realSync(); + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + Point p = slider.getLocationOnScreen(); + + robot.mouseMove(p.x, p.y); + } + }); + + toolkit.realSync(); + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + thumbRectX = getThumbRectField().x; + + Point p = slider.getLocationOnScreen(); + + robot.mouseMove(p.x, p.y); + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseMove(p.x + 20, p.y); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + } + }); + + toolkit.realSync(); + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + Rectangle newThumbRect = getThumbRectField(); + + if (newThumbRect.x != thumbRectX) { + throw new RuntimeException("Test failed: the thumb was moved"); + } + + frame.dispose(); + } + }); + } + + private static Rectangle getThumbRectField() { + try { + SliderUI ui = slider.getUI(); + + Field field = BasicSliderUI.class.getDeclaredField("thumbRect"); + + field.setAccessible(true); + + return (Rectangle) field.get(ui); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/javax/swing/JSlider/6918861/bug6918861.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JSlider/6918861/bug6918861.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,103 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + * @bug 6918861 + * @summary SynthSliderUI.uninstallDefaults() is not called when UI is uninstalled + * @author Pavel Porvatov + * @run main bug6918861 + */ + +import javax.swing.*; +import javax.swing.plaf.synth.SynthLookAndFeel; +import javax.swing.plaf.synth.SynthSliderUI; + +public class bug6918861 { + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel(new SynthLookAndFeel()); + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + JSlider slider = new JSlider(); + + HackedSynthSliderUI ui = new HackedSynthSliderUI(slider); + + slider.setUI(ui); + + if (ui.counter != 111) { + throw new RuntimeException("Some installers of SynthSliderUI weren't invoked"); + } + + slider.setUI(null); + + if (ui.counter != 0) { + throw new RuntimeException("Some uninstallers of SynthSliderUI weren't invoked"); + } + } + }); + } + + private static class HackedSynthSliderUI extends SynthSliderUI { + private int counter; + + protected HackedSynthSliderUI(JSlider c) { + super(c); + } + + protected void installDefaults(JSlider slider) { + super.installDefaults(slider); + + counter += 1; + } + + protected void uninstallDefaults(JSlider slider) { + super.uninstallDefaults(slider); + + counter -= 1; + } + + protected void installListeners(JSlider slider) { + super.installListeners(slider); + + counter += 10; + } + + protected void uninstallListeners(JSlider slider) { + super.uninstallListeners(slider); + + counter -= 10; + } + + protected void installKeyboardActions(JSlider slider) { + super.installKeyboardActions(slider); + + counter += 100; + } + + protected void uninstallKeyboardActions(JSlider slider) { + super.uninstallKeyboardActions(slider); + + counter -= 100; + } + } +} diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/javax/swing/JSlider/6923305/bug6923305.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JSlider/6923305/bug6923305.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,63 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + * @bug 6923305 + * @summary SynthSliderUI paints the slider track when the slider's "paintTrack" property is set to false + * @author Pavel Porvatov + * @run main bug6923305 + */ + +import javax.swing.*; +import javax.swing.plaf.synth.SynthContext; +import javax.swing.plaf.synth.SynthLookAndFeel; +import javax.swing.plaf.synth.SynthSliderUI; +import java.awt.*; +import java.awt.image.BufferedImage; + +public class bug6923305 { + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel(new SynthLookAndFeel()); + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + JSlider slider = new JSlider(); + + slider.setUI(new SynthSliderUI(slider) { + @Override + protected void paintTrack(SynthContext context, Graphics g, Rectangle trackBounds) { + throw new RuntimeException("Test failed: the SynthSliderUI.paintTrack was invoked"); + } + }); + + slider.setPaintTrack(false); + slider.setSize(slider.getPreferredSize()); + + BufferedImage bufferedImage = new BufferedImage(slider.getWidth(), slider.getHeight(), + BufferedImage.TYPE_INT_ARGB); + + slider.paint(bufferedImage.getGraphics()); + } + }); + } +} diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/javax/swing/JTable/6913768/bug6913768.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JTable/6913768/bug6913768.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,53 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* @test + * @bug 6913768 + * @summary With default SynthLookAndFeel instance installed new JTable creation leads to throwing NPE + * @author Pavel Porvatov + * @run main bug6913768 + */ + +import javax.swing.*; +import javax.swing.plaf.synth.SynthLookAndFeel; + +public class bug6913768 { + public static void main(String[] args) throws Exception { + UIManager.setLookAndFeel(new SynthLookAndFeel()); + + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + JFrame frame = new JFrame(); + + JTable table = new JTable(new Object[][]{{"1", "2"}, {"3", "4"}}, + new Object[]{"col1", "col2"}); + + frame.getContentPane().add(new JScrollPane(table)); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(300, 200); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + } + }); + } +} diff -r 85992faf57f5 -r 27cccdaba851 jdk/test/sun/security/krb5/etype/WeakCrypto.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/krb5/etype/WeakCrypto.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,50 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ +/* + * @test + * @bug 6844909 + * @run main/othervm WeakCrypto + * @summary support allow_weak_crypto in krb5.conf + */ + +import java.io.File; +import sun.security.krb5.internal.crypto.EType; +import sun.security.krb5.EncryptedData; + +public class WeakCrypto { + public static void main(String[] args) throws Exception { + System.setProperty("java.security.krb5.conf", + System.getProperty("test.src", ".") + + File.separator + + "weakcrypto.conf"); + int[] etypes = EType.getBuiltInDefaults(); + + for (int i=0, length = etypes.length; i> entry : + factoryToAnnotation.entrySet()) { + AnnotationProcessorFactory apFactory = entry.getKey(); + AnnotationProcessor processor = apFactory.getProcessorFor(entry.getValue(), trivAPE); if (processor != null) processors.add(processor); diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/apt/main/CommandLine.java --- a/langtools/src/share/classes/com/sun/tools/apt/main/CommandLine.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/apt/main/CommandLine.java Thu Mar 18 18:50:22 2010 -0700 @@ -82,7 +82,7 @@ st.commentChar('#'); st.quoteChar('"'); st.quoteChar('\''); - while (st.nextToken() != st.TT_EOF) { + while (st.nextToken() != StreamTokenizer.TT_EOF) { args.append(st.sval); } r.close(); diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/apt/mirror/declaration/AnnotationProxyMaker.java --- a/langtools/src/share/classes/com/sun/tools/apt/mirror/declaration/AnnotationProxyMaker.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/apt/mirror/declaration/AnnotationProxyMaker.java Thu Mar 18 18:50:22 2010 -0700 @@ -270,7 +270,7 @@ * The toString, hashCode, and equals methods foward to the underlying * type. */ - private static class MirroredTypeExceptionProxy extends ExceptionProxy { + private static final class MirroredTypeExceptionProxy extends ExceptionProxy { private static final long serialVersionUID = 6662035281599933545L; private MirroredTypeException ex; @@ -312,7 +312,7 @@ * The toString, hashCode, and equals methods foward to the underlying * types. */ - private static class MirroredTypesExceptionProxy extends ExceptionProxy { + private static final class MirroredTypesExceptionProxy extends ExceptionProxy { private static final long serialVersionUID = -6670822532616693951L; private MirroredTypesException ex; diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/apt/mirror/declaration/DeclarationImpl.java --- a/langtools/src/share/classes/com/sun/tools/apt/mirror/declaration/DeclarationImpl.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/apt/mirror/declaration/DeclarationImpl.java Thu Mar 18 18:50:22 2010 -0700 @@ -58,7 +58,7 @@ protected final AptEnv env; public final Symbol sym; - protected static DeclarationFilter identityFilter = + protected static final DeclarationFilter identityFilter = new DeclarationFilter(); diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/apt/mirror/type/TypeMirrorImpl.java --- a/langtools/src/share/classes/com/sun/tools/apt/mirror/type/TypeMirrorImpl.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/apt/mirror/type/TypeMirrorImpl.java Thu Mar 18 18:50:22 2010 -0700 @@ -71,6 +71,6 @@ * {@inheritDoc} */ public int hashCode() { - return env.jctypes.hashCode(type); + return Types.hashCode(type); } } diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/classfile/ConstantPool.java --- a/langtools/src/share/classes/com/sun/tools/classfile/ConstantPool.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/classfile/ConstantPool.java Thu Mar 18 18:50:22 2010 -0700 @@ -40,7 +40,7 @@ */ public class ConstantPool { - public class InvalidIndex extends ConstantPoolException { + public static class InvalidIndex extends ConstantPoolException { private static final long serialVersionUID = -4350294289300939730L; InvalidIndex(int index) { super(index); @@ -53,7 +53,7 @@ } } - public class UnexpectedEntry extends ConstantPoolException { + public static class UnexpectedEntry extends ConstantPoolException { private static final long serialVersionUID = 6986335935377933211L; UnexpectedEntry(int index, int expected_tag, int found_tag) { super(index); @@ -71,7 +71,7 @@ public final int found_tag; } - public class InvalidEntry extends ConstantPoolException { + public static class InvalidEntry extends ConstantPoolException { private static final long serialVersionUID = 1000087545585204447L; InvalidEntry(int index, int tag) { super(index); @@ -87,7 +87,7 @@ public final int tag; } - public class EntryNotFound extends ConstantPoolException { + public static class EntryNotFound extends ConstantPoolException { private static final long serialVersionUID = 2885537606468581850L; EntryNotFound(Object value) { super(-1); @@ -694,7 +694,7 @@ public int byteLength() { class SizeOutputStream extends OutputStream { @Override - public void write(int b) throws IOException { + public void write(int b) { size++; } int size; diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/doclets/standard/Standard.java --- a/langtools/src/share/classes/com/sun/tools/doclets/standard/Standard.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/doclets/standard/Standard.java Thu Mar 18 18:50:22 2010 -0700 @@ -31,23 +31,21 @@ public class Standard { - public static final HtmlDoclet htmlDoclet = new HtmlDoclet(); - public static int optionLength(String option) { - return htmlDoclet.optionLength(option); + return HtmlDoclet.optionLength(option); } public static boolean start(RootDoc root) { - return htmlDoclet.start(root); + return HtmlDoclet.start(root); } public static boolean validOptions(String[][] options, DocErrorReporter reporter) { - return htmlDoclet.validOptions(options, reporter); + return HtmlDoclet.validOptions(options, reporter); } public static LanguageVersion languageVersion() { - return htmlDoclet.languageVersion(); + return HtmlDoclet.languageVersion(); } } diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/Launcher.java --- a/langtools/src/share/classes/com/sun/tools/javac/Launcher.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/Launcher.java Thu Mar 18 18:50:22 2010 -0700 @@ -64,7 +64,7 @@ fileChooser.setSelectedFile(new File(fileName)); } } - if (fileChooser.showOpenDialog(null) == fileChooser.APPROVE_OPTION) { + if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { String fileName = fileChooser.getSelectedFile().getPath(); prefs.put("recent.file", fileName); javac.run(System.in, null, null, "-d", "/tmp", fileName); diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java --- a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java Thu Mar 18 18:50:22 2010 -0700 @@ -137,7 +137,7 @@ } private static boolean match(OptionKind clientKind, OptionKind optionKind) { - return (clientKind == (optionKind == OptionKind.HIDDEN ? optionKind.EXTENDED : optionKind)); + return (clientKind == (optionKind == OptionKind.HIDDEN ? OptionKind.EXTENDED : optionKind)); } public JavacFileManager getStandardFileManager( diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/code/Lint.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Lint.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Lint.java Thu Mar 18 18:50:22 2010 -0700 @@ -198,7 +198,12 @@ /** * Warn about Sun proprietary API that may be removed in a future release. */ - SUNAPI("sunapi", true); + SUNAPI("sunapi", true), + + /** + * Warn about issues relating to use of statics + */ + STATIC("static"); LintCategory(String option) { this(option, false); diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java Thu Mar 18 18:50:22 2010 -0700 @@ -162,7 +162,7 @@ * the default package; otherwise, the owner symbol is returned */ public Symbol location() { - if (owner.name == null || (owner.name.isEmpty() && owner.kind != PCK)) { + if (owner.name == null || (owner.name.isEmpty() && owner.kind != PCK && owner.kind != TYP)) { return null; } return owner; diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/code/Types.java --- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java Thu Mar 18 18:50:22 2010 -0700 @@ -2504,7 +2504,7 @@ } @Override public int hashCode() { - return 127 * Types.this.hashCode(t1) + Types.this.hashCode(t2); + return 127 * Types.hashCode(t1) + Types.hashCode(t2); } @Override public boolean equals(Object obj) { @@ -3375,7 +3375,7 @@ this.t = t; } public int hashCode() { - return Types.this.hashCode(t); + return Types.hashCode(t); } public boolean equals(Object obj) { return (obj instanceof SingletonType) && diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java Thu Mar 18 18:50:22 2010 -0700 @@ -2020,6 +2020,10 @@ tree.pos(), site, sym.name, true); } } + } else if (sym.kind != ERR && (sym.flags() & STATIC) != 0 && sym.name != names._class) { + // If the qualified item is not a type and the selected item is static, report + // a warning. Make allowance for the class of an array type e.g. Object[].class) + chk.warnStatic(tree, "static.not.qualified.by.type", Kinds.kindName(sym.kind), sym.owner); } // If we are selecting an instance member via a `super', ... @@ -2636,6 +2640,7 @@ if (tree.bounds.tail.nonEmpty()) { log.error(tree.bounds.tail.head.pos(), "type.var.may.not.be.followed.by.other.bounds"); + log.unrecoverableError = true; tree.bounds = List.of(tree.bounds.head); a.bound = bs.head; } diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/comp/Check.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java Thu Mar 18 18:50:22 2010 -0700 @@ -189,6 +189,11 @@ sunApiHandler.report(pos, msg, args); } + public void warnStatic(DiagnosticPosition pos, String msg, Object... args) { + if (lint.isEnabled(LintCategory.STATIC)) + log.warning(pos, msg, args); + } + /** * Report any deferred diagnostics. */ diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java Thu Mar 18 18:50:22 2010 -0700 @@ -270,6 +270,7 @@ return ts.toList(); } + @Override public void visitTopLevel(JCCompilationUnit tree) { JavaFileObject prev = log.useSource(tree.sourcefile); boolean addEnv = false; @@ -289,13 +290,13 @@ tree.packge = syms.unnamedPackage; } tree.packge.complete(); // Find all classes in package. - Env env = topLevelEnv(tree); + Env topEnv = topLevelEnv(tree); // Save environment of package-info.java file. if (isPkgInfo) { Env env0 = typeEnvs.get(tree.packge); if (env0 == null) { - typeEnvs.put(tree.packge, env); + typeEnvs.put(tree.packge, topEnv); } else { JCCompilationUnit tree0 = env0.toplevel; if (!fileManager.isSameFile(tree.sourcefile, tree0.sourcefile)) { @@ -306,7 +307,7 @@ if (addEnv || (tree0.packageAnnotations.isEmpty() && tree.docComments != null && tree.docComments.get(tree) != null)) { - typeEnvs.put(tree.packge, env); + typeEnvs.put(tree.packge, topEnv); } } } @@ -322,14 +323,15 @@ c.members_field = new Scope(c); tree.packge.package_info = c; } - classEnter(tree.defs, env); + classEnter(tree.defs, topEnv); if (addEnv) { - todo.append(env); + todo.append(topEnv); } log.useSource(prev); result = null; } + @Override public void visitClassDef(JCClassDecl tree) { Symbol owner = env.info.scope.owner; Scope enclScope = enterScope(env); @@ -435,6 +437,7 @@ * Enter a symbol for type parameter in local scope, after checking that it * is unique. */ + @Override public void visitTypeParameter(JCTypeParameter tree) { TypeVar a = (tree.type != null) ? (TypeVar)tree.type @@ -448,6 +451,7 @@ /** Default class enter visitor method: do nothing. */ + @Override public void visitTree(JCTree tree) { result = null; } @@ -489,10 +493,8 @@ for (JCCompilationUnit tree : trees) { if (tree.starImportScope.elems == null) { JavaFileObject prev = log.useSource(tree.sourcefile); - Env env = typeEnvs.get(tree); - if (env == null) - env = topLevelEnv(tree); - memberEnter.memberEnter(tree, env); + Env topEnv = topLevelEnv(tree); + memberEnter.memberEnter(tree, topEnv); log.useSource(prev); } } diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java Thu Mar 18 18:50:22 2010 -0700 @@ -607,10 +607,12 @@ public void visitNewArray(JCNewArray tree) { tree.elemtype = translate(tree.elemtype, null); translate(tree.dims, syms.intType); - tree.elems = translate(tree.elems, - (tree.type == null) ? null - : erasure(types.elemtype(tree.type))); - tree.type = erasure(tree.type); + if (tree.type != null) { + tree.elems = translate(tree.elems, erasure(types.elemtype(tree.type))); + tree.type = erasure(tree.type); + } else { + tree.elems = translate(tree.elems, null); + } result = tree; } diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java --- a/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java Thu Mar 18 18:50:22 2010 -0700 @@ -260,7 +260,7 @@ archive = openArchive(directory); } catch (IOException ex) { log.error("error.reading.file", - directory, ex.getLocalizedMessage()); + directory, getMessage(ex)); return; } } @@ -489,7 +489,7 @@ archive = new MissingArchive(zipFileName); } catch (IOException ex) { if (zipFileName.exists()) - log.error("error.reading.file", zipFileName, ex.getLocalizedMessage()); + log.error("error.reading.file", zipFileName, getMessage(ex)); archive = new MissingArchive(zipFileName); } @@ -838,4 +838,23 @@ } throw new IllegalArgumentException("Invalid relative path: " + file); } + + /** + * Get a detail message from an IOException. + * Most, but not all, instances of IOException provide a non-null result + * for getLocalizedMessage(). But some instances return null: in these + * cases, fallover to getMessage(), and if even that is null, return the + * name of the exception itself. + * @param e an IOException + * @return a string to include in a compiler diagnostic + */ + public static String getMessage(IOException e) { + String s = e.getLocalizedMessage(); + if (s != null) + return s; + s = e.getMessage(); + if (s != null) + return s; + return e.toString(); + } } diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/file/Paths.java --- a/langtools/src/share/classes/com/sun/tools/javac/file/Paths.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/file/Paths.java Thu Mar 18 18:50:22 2010 -0700 @@ -320,7 +320,7 @@ addFile(f, warn); } } catch (IOException e) { - log.error("error.reading.file", jarFile, e.getLocalizedMessage()); + log.error("error.reading.file", jarFile, JavacFileManager.getMessage(e)); } } } diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Thu Mar 18 18:50:22 2010 -0700 @@ -1135,7 +1135,7 @@ self.name = simpleBinaryName(self.flatname, c.flatname) ; self.owner = m != null ? m : c; if (self.name.isEmpty()) - self.fullname = null; + self.fullname = names.empty; else self.fullname = ClassSymbol.formFullName(self.name, self.owner); diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java Thu Mar 18 18:50:22 2010 -0700 @@ -808,8 +808,8 @@ code.resolve(secondJumps); CondItem second = genCond(tree.falsepart, CRT_FLOW_TARGET); CondItem result = items.makeCondItem(second.opcode, - code.mergeChains(trueJumps, second.trueJumps), - code.mergeChains(falseJumps, second.falseJumps)); + Code.mergeChains(trueJumps, second.trueJumps), + Code.mergeChains(falseJumps, second.falseJumps)); if (markBranches) result.tree = tree.falsepart; return result; } else { @@ -1322,7 +1322,7 @@ if (useJsrLocally) { if (tree.finalizer != null) { Code.State jsrState = code.state.dup(); - jsrState.push(code.jsrReturnValue); + jsrState.push(Code.jsrReturnValue); tryEnv.info.cont = new Chain(code.emitJump(jsr), tryEnv.info.cont, @@ -1375,7 +1375,7 @@ genFinalizer(env); if (hasFinalizer || l.tail.nonEmpty()) { code.statBegin(TreeInfo.endPos(env.tree)); - exitChain = code.mergeChains(exitChain, + exitChain = Code.mergeChains(exitChain, code.branch(goto_)); } endFinalizerGap(env); @@ -1963,7 +1963,7 @@ result = items. makeCondItem(rcond.opcode, rcond.trueJumps, - code.mergeChains(falseJumps, + Code.mergeChains(falseJumps, rcond.falseJumps)); } else { result = lcond; @@ -1976,7 +1976,7 @@ CondItem rcond = genCond(tree.rhs, CRT_FLOW_TARGET); result = items. makeCondItem(rcond.opcode, - code.mergeChains(trueJumps, rcond.trueJumps), + Code.mergeChains(trueJumps, rcond.trueJumps), rcond.falseJumps); } else { result = lcond; diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/jvm/Items.java --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Items.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Items.java Thu Mar 18 18:50:22 2010 -0700 @@ -792,25 +792,25 @@ } Chain jumpTrue() { - if (tree == null) return code.mergeChains(trueJumps, code.branch(opcode)); + if (tree == null) return Code.mergeChains(trueJumps, code.branch(opcode)); // we should proceed further in -Xjcov mode only int startpc = code.curPc(); - Chain c = code.mergeChains(trueJumps, code.branch(opcode)); + Chain c = Code.mergeChains(trueJumps, code.branch(opcode)); code.crt.put(tree, CRTable.CRT_BRANCH_TRUE, startpc, code.curPc()); return c; } Chain jumpFalse() { - if (tree == null) return code.mergeChains(falseJumps, code.branch(code.negate(opcode))); + if (tree == null) return Code.mergeChains(falseJumps, code.branch(Code.negate(opcode))); // we should proceed further in -Xjcov mode only int startpc = code.curPc(); - Chain c = code.mergeChains(falseJumps, code.branch(code.negate(opcode))); + Chain c = Code.mergeChains(falseJumps, code.branch(Code.negate(opcode))); code.crt.put(tree, CRTable.CRT_BRANCH_FALSE, startpc, code.curPc()); return c; } CondItem negate() { - CondItem c = new CondItem(code.negate(opcode), falseJumps, trueJumps); + CondItem c = new CondItem(Code.negate(opcode), falseJumps, trueJumps); c.tree = tree; return c; } diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/main/CommandLine.java --- a/langtools/src/share/classes/com/sun/tools/javac/main/CommandLine.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/main/CommandLine.java Thu Mar 18 18:50:22 2010 -0700 @@ -82,7 +82,7 @@ st.commentChar('#'); st.quoteChar('"'); st.quoteChar('\''); - while (st.nextToken() != st.TT_EOF) { + while (st.nextToken() != StreamTokenizer.TT_EOF) { args.append(st.sval); } r.close(); diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java --- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java Thu Mar 18 18:50:22 2010 -0700 @@ -549,12 +549,6 @@ return log.nwarnings; } - /** Whether or not any parse errors have occurred. - */ - public boolean parseErrors() { - return parseErrors; - } - /** Try to open input stream with given name. * Report an error if this fails. * @param filename The file name of the input stream to be opened. @@ -564,7 +558,7 @@ inputFiles.add(filename); return filename.getCharContent(false); } catch (IOException e) { - log.error("error.reading.file", filename, e.getLocalizedMessage()); + log.error("error.reading.file", filename, JavacFileManager.getMessage(e)); return null; } } @@ -588,7 +582,7 @@ int initialErrorCount = log.nerrors; Parser parser = parserFactory.newParser(content, keepComments(), genEndPos, lineDebugInfo); tree = parser.parseCompilationUnit(); - parseErrors |= (log.nerrors > initialErrorCount); + log.unrecoverableError |= (log.nerrors > initialErrorCount); if (verbose) { printVerbose("parsing.done", Long.toString(elapsed(msec))); } @@ -723,7 +717,7 @@ try { tree = parse(filename, filename.getCharContent(false)); } catch (IOException e) { - log.error("error.reading.file", filename, e); + log.error("error.reading.file", filename, JavacFileManager.getMessage(e)); tree = make.TopLevel(List.nil(), null, List.nil()); } finally { log.useSource(prev); @@ -768,9 +762,6 @@ private long start_msec = 0; public long elapsed_msec = 0; - /** Track whether any errors occurred while parsing source text. */ - private boolean parseErrors = false; - public void compile(List sourceFileObject) throws Throwable { compile(sourceFileObject, List.nil(), null); @@ -1114,7 +1105,7 @@ return env; if (verboseCompilePolicy) - log.printLines(log.noticeWriter, "[attribute " + env.enclClass.sym + "]"); + Log.printLines(log.noticeWriter, "[attribute " + env.enclClass.sym + "]"); if (verbose) printVerbose("checking.attribution", env.enclClass.sym); diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/model/AnnotationProxyMaker.java --- a/langtools/src/share/classes/com/sun/tools/javac/model/AnnotationProxyMaker.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/model/AnnotationProxyMaker.java Thu Mar 18 18:50:22 2010 -0700 @@ -26,6 +26,8 @@ package com.sun.tools.javac.model; import com.sun.tools.javac.util.*; +import java.io.ObjectInputStream; +import java.io.IOException; import java.lang.annotation.*; import java.lang.reflect.Array; import java.lang.reflect.Method; @@ -268,10 +270,10 @@ * The toString, hashCode, and equals methods foward to the underlying * type. */ - private static class MirroredTypeExceptionProxy extends ExceptionProxy { + private static final class MirroredTypeExceptionProxy extends ExceptionProxy { static final long serialVersionUID = 269; - private transient final TypeMirror type; + private transient TypeMirror type; private final String typeString; MirroredTypeExceptionProxy(TypeMirror t) { @@ -296,6 +298,13 @@ protected RuntimeException generateException() { return new MirroredTypeException(type); } + + // Explicitly set all transient fields. + private void readObject(ObjectInputStream s) + throws IOException, ClassNotFoundException { + s.defaultReadObject(); + type = null; + } } @@ -304,10 +313,10 @@ * The toString, hashCode, and equals methods foward to the underlying * types. */ - private static class MirroredTypesExceptionProxy extends ExceptionProxy { + private static final class MirroredTypesExceptionProxy extends ExceptionProxy { static final long serialVersionUID = 269; - private transient final List types; + private transient List types; private final String typeStrings; MirroredTypesExceptionProxy(List ts) { @@ -333,5 +342,12 @@ protected RuntimeException generateException() { return new MirroredTypesException(types); } + + // Explicitly set all transient fields. + private void readObject(ObjectInputStream s) + throws IOException, ClassNotFoundException { + s.defaultReadObject(); + types = null; + } } } diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java --- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Thu Mar 18 18:50:22 2010 -0700 @@ -1561,7 +1561,10 @@ JCNewClass newClass = classCreatorRest(newpos, null, typeArgs, t); if (newClass.def != null) { assert newClass.def.mods.annotations.isEmpty(); - newClass.def.mods.annotations = List.convert(JCAnnotation.class, newAnnotations); + if (newAnnotations.nonEmpty()) { + newClass.def.mods.pos = earlier(newClass.def.mods.pos, newAnnotations.head.pos); + newClass.def.mods.annotations = List.convert(JCAnnotation.class, newAnnotations); + } } return newClass; } else { @@ -3016,6 +3019,18 @@ return (oc >= 0) ? TreeInfo.opPrec(oc) : -1; } + /** + * Return the lesser of two positions, making allowance for either one + * being unset. + */ + static int earlier(int pos1, int pos2) { + if (pos1 == Position.NOPOS) + return pos2; + if (pos2 == Position.NOPOS) + return pos1; + return (pos1 < pos2 ? pos1 : pos2); + } + /** Return operation tag of binary operator represented by token, * -1 if token is not a binary operator. */ diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java --- a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Thu Mar 18 18:50:22 2010 -0700 @@ -690,10 +690,12 @@ ProcessorState ps = psi.next(); Set matchedNames = new HashSet(); Set typeElements = new LinkedHashSet(); - for (String unmatchedAnnotationName : unmatchedAnnotations.keySet()) { + + for (Map.Entry entry: unmatchedAnnotations.entrySet()) { + String unmatchedAnnotationName = entry.getKey(); if (ps.annotationSupported(unmatchedAnnotationName) ) { matchedNames.add(unmatchedAnnotationName); - TypeElement te = unmatchedAnnotations.get(unmatchedAnnotationName); + TypeElement te = entry.getValue(); if (te != null) typeElements.add(te); } @@ -790,16 +792,13 @@ List roots, List classSymbols, Iterable pckSymbols) - throws IOException { + throws IOException { log = Log.instance(context); // Writer for -XprintRounds and -XprintProcessorInfo data PrintWriter xout = context.get(Log.outKey); TaskListener taskListener = context.get(TaskListener.class); - - AnnotationCollector collector = new AnnotationCollector(); - JavaCompiler compiler = JavaCompiler.instance(context); compiler.todo.clear(); // free the compiler's resources @@ -878,7 +877,7 @@ roots = cleanTrees(roots).appendList(parsedFiles); // Check for errors after parsing - if (compiler.parseErrors()) { + if (log.unrecoverableError) { errorStatus = true; break runAround; } else { @@ -912,7 +911,7 @@ roots = runLastRound(xout, roundNumber, errorStatus, compiler, roots, taskListener); // Set error status for any files compiled and generated in // the last round - if (compiler.parseErrors()) + if (log.unrecoverableError) errorStatus = true; compiler.close(false); @@ -1218,45 +1217,6 @@ return false; } - private class AnnotationCollector extends TreeScanner { - List path = List.nil(); - static final boolean verbose = false; - List annotations = List.nil(); - - public List findAnnotations(List nodes) { - annotations = List.nil(); - scan(nodes); - List found = annotations; - annotations = List.nil(); - return found.reverse(); - } - - public void scan(JCTree node) { - if (node == null) - return; - Symbol sym = TreeInfo.symbolFor(node); - if (sym != null) - path = path.prepend(node); - super.scan(node); - if (sym != null) - path = path.tail; - } - - public void visitAnnotation(JCAnnotation node) { - annotations = annotations.prepend(node); - if (verbose) { - StringBuilder sb = new StringBuilder(); - for (JCTree tree : path.reverse()) { - System.err.print(sb); - System.err.println(TreeInfo.symbolFor(tree)); - sb.append(" "); - } - System.err.print(sb); - System.err.println(node); - } - } - } - private static List cleanTrees(List nodes) { for (T node : nodes) treeCleaner.scan(node); diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties --- a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties Thu Mar 18 18:50:22 2010 -0700 @@ -720,6 +720,9 @@ {0}: major version {1} is newer than {2}, the highest major version supported by this compiler.\n\ It is recommended that the compiler be upgraded. +compiler.warn.static.not.qualified.by.type=\ + [static] static {0} should be qualified by type name, {1}, instead of by an expression + # Warnings related to annotation processing compiler.warn.proc.package.does.not.exist=\ package {0} does not exist diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java --- a/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java Thu Mar 18 18:50:22 2010 -0700 @@ -201,7 +201,7 @@ private String selectFormat(JCDiagnostic d) { DiagnosticSource source = d.getDiagnosticSource(); String format = getConfiguration().getFormat(BasicFormatKind.DEFAULT_NO_POS_FORMAT); - if (source != null) { + if (source != null && source != DiagnosticSource.NO_SOURCE) { if (d.getIntPosition() != Position.NOPOS) { format = getConfiguration().getFormat(BasicFormatKind.DEFAULT_POS_FORMAT); } else if (source.getFile() != null && diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javac/util/Log.java --- a/langtools/src/share/classes/com/sun/tools/javac/util/Log.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javac/util/Log.java Thu Mar 18 18:50:22 2010 -0700 @@ -192,6 +192,12 @@ */ public int nwarnings = 0; + /** + * Whether or not an unrecoverable error has been seen. + * Unrecoverable errors prevent subsequent annotation processing. + */ + public boolean unrecoverableError; + /** A set of all errors generated so far. This is used to avoid printing an * error message more than once. For each error, a pair consisting of the * source file name and source code position of the error is added to the set. diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java Thu Mar 18 18:50:22 2010 -0700 @@ -34,7 +34,6 @@ import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.ClassType; -import com.sun.tools.javac.comp.Attr; import com.sun.tools.javac.comp.Check; import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.util.Context; @@ -73,10 +72,6 @@ /** Referenced directly in RootDocImpl. */ JavadocClassReader reader; - /** The compiler's attribution phase (needed to evaluate - * constant initializers). */ - Attr attr; - /** Javadoc's own version of the compiler's enter phase. */ JavadocEnter enter; @@ -91,8 +86,6 @@ /** Access filter (public, protected, ...). */ ModifierFilter showAccess; - private ClassDocImpl runtimeException; - /** True if we are using a sentence BreakIterator. */ boolean breakiterator; @@ -129,7 +122,6 @@ syms = Symtab.instance(context); reader = JavadocClassReader.instance0(context); enter = JavadocEnter.instance0(context); - attr = Attr.instance(context); names = Names.instance(context); externalizableSym = reader.enterClass(names.fromString("java.io.Externalizable")); chk = Check.instance(context); diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java --- a/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java Thu Mar 18 18:50:22 2010 -0700 @@ -349,12 +349,12 @@ // (int i, String s) ==> [0] = "int", [1] = String // (int[][], String[]) ==> [0] = "int[][]" // [1] = "String[]" class ParameterParseMachine { - final int START = 0; - final int TYPE = 1; - final int NAME = 2; - final int TNSPACE = 3; // space between type and name - final int ARRAYDECORATION = 4; - final int ARRAYSPACE = 5; + static final int START = 0; + static final int TYPE = 1; + static final int NAME = 2; + static final int TNSPACE = 3; // space between type and name + static final int ARRAYDECORATION = 4; + static final int ARRAYSPACE = 5; String parameters; diff -r 85992faf57f5 -r 27cccdaba851 langtools/src/share/classes/com/sun/tools/javah/JavahTask.java --- a/langtools/src/share/classes/com/sun/tools/javah/JavahTask.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/src/share/classes/com/sun/tools/javah/JavahTask.java Thu Mar 18 18:50:22 2010 -0700 @@ -255,9 +255,11 @@ } this.classes = new ArrayList(); - for (String classname: classes) { - classname.getClass(); // null-check - this.classes.add(classname); + if (classes != null) { + for (String classname: classes) { + classname.getClass(); // null-check + this.classes.add(classname); + } } } @@ -316,6 +318,12 @@ int run(String[] args) { try { handleOptions(args); + if (classes == null || classes.size() == 0) { + if (help || version || fullVersion) + return 0; + else + return 1; + } boolean ok = run(); return ok ? 0 : 1; } catch (BadArgs e) { @@ -347,8 +355,7 @@ fileManager = getDefaultFileManager(diagnosticListener, log); Iterator iter = args.iterator(); - if (!iter.hasNext()) - help = true; + boolean noArgs = !iter.hasNext(); while (iter.hasNext()) { String arg = iter.next(); @@ -365,7 +372,7 @@ } if ((classes == null || classes.size() == 0) && - !(help || version || fullVersion)) { + !(noArgs || help || version || fullVersion)) { throw new BadArgs("err.no.classes.specified"); } diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/4880220/T4880220.empty.out diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/4880220/T4880220.error.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/4880220/T4880220.error.out Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,9 @@ +T4880220.java:20:27: compiler.warn.static.not.qualified.by.type: kindname.method, T4880220.C +T4880220.java:21:27: compiler.warn.static.not.qualified.by.type: kindname.variable, T4880220.C +T4880220.java:22:27: compiler.warn.static.not.qualified.by.type: kindname.variable, T4880220.C +T4880220.java:24:29: compiler.warn.static.not.qualified.by.type: kindname.method, T4880220.C +T4880220.java:25:29: compiler.warn.static.not.qualified.by.type: kindname.variable, T4880220.C +T4880220.java:26:29: compiler.warn.static.not.qualified.by.type: kindname.variable, T4880220.C +- compiler.err.warnings.and.werror +1 error +6 warnings diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/4880220/T4880220.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/4880220/T4880220.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,43 @@ +/* + * @test /nodynamiccopyright/ + * @bug 4880220 + * @summary Add a warning when accessing a static method via an reference + * + * @compile/ref=T4880220.empty.out T4880220.java + * @compile/ref=T4880220.warn.out -XDrawDiagnostics -Xlint:static T4880220.java + * @compile/ref=T4880220.warn.out -XDrawDiagnostics -Xlint:all T4880220.java + * @compile/ref=T4880220.empty.out -XDrawDiagnostics -Xlint:all,-static T4880220.java + * @compile/ref=T4880220.error.out/fail -XDrawDiagnostics -Werror -Xlint:all T4880220.java + */ + +public class T4880220 { + void m1() { + int good_1 = C.m(); + int good_2 = C.f; + int good_3 = C.x; + + C c = new C(); + int bad_inst_1 = c.m(); + int bad_inst_2 = c.f; + int bad_inst_3 = c.x; + + int bad_expr_1 = c().m(); + int bad_expr_2 = c().f; + int bad_expr_3 = c().x; + } + + void m2() { + Class good_1 = C.class; + Class good_2 = C[].class; + } + + C c() { + return new C(); + } + + static class C { + static int m() { return 0; } + static int f; + static final int x = 3; + } +} diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/4880220/T4880220.warn.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/4880220/T4880220.warn.out Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,7 @@ +T4880220.java:20:27: compiler.warn.static.not.qualified.by.type: kindname.method, T4880220.C +T4880220.java:21:27: compiler.warn.static.not.qualified.by.type: kindname.variable, T4880220.C +T4880220.java:22:27: compiler.warn.static.not.qualified.by.type: kindname.variable, T4880220.C +T4880220.java:24:29: compiler.warn.static.not.qualified.by.type: kindname.method, T4880220.C +T4880220.java:25:29: compiler.warn.static.not.qualified.by.type: kindname.variable, T4880220.C +T4880220.java:26:29: compiler.warn.static.not.qualified.by.type: kindname.variable, T4880220.C +6 warnings diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/T6881645.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/T6881645.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,38 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @summary Unchecked method call on a method declared inside anonymous inner causes javac to crash + * @compile -Xlint:unchecked T6881645.java + */ + +class T6881645 { + Object o = new Object() { + void m (Class x) {} + void test() { + m((Class)null); + } + }; +} + diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/ThrowsIntersection_1.java --- a/langtools/test/tools/javac/ThrowsIntersection_1.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/ThrowsIntersection_1.java Thu Mar 18 18:50:22 2010 -0700 @@ -30,6 +30,8 @@ * @compile ThrowsIntersection_1.java */ +package ThrowsIntersection_1; + class Ex1 extends Exception {} class Ex2 extends Exception {} diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/ThrowsIntersection_2.java --- a/langtools/test/tools/javac/ThrowsIntersection_2.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/ThrowsIntersection_2.java Thu Mar 18 18:50:22 2010 -0700 @@ -30,6 +30,8 @@ * @compile ThrowsIntersection_2.java */ +package ThrowsIntersection_2; + class Ex1 extends Exception {} class Ex2 extends Exception {} class Ex3 extends Exception {} diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/ThrowsIntersection_3.java --- a/langtools/test/tools/javac/ThrowsIntersection_3.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/ThrowsIntersection_3.java Thu Mar 18 18:50:22 2010 -0700 @@ -30,6 +30,8 @@ * @run compile/fail ThrowsIntersection_3.java */ +package ThrowsIntersection_3; + class Ex1 extends Exception {} class Ex2 extends Exception {} diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/ThrowsIntersection_4.java --- a/langtools/test/tools/javac/ThrowsIntersection_4.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/ThrowsIntersection_4.java Thu Mar 18 18:50:22 2010 -0700 @@ -30,6 +30,8 @@ * @run compile/fail ThrowsIntersection_4.java */ +package ThrowsIntersection_4; + // Note: This is the test that actually failed for 4042259. The others are for completeness. class Ex1 extends Exception {} diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/annotations/neg/Constant.java --- a/langtools/test/tools/javac/annotations/neg/Constant.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/annotations/neg/Constant.java Thu Mar 18 18:50:22 2010 -0700 @@ -30,7 +30,7 @@ * @compile/fail Constant.java */ -package test.tools.javac.annotation.Constant; +package Constant; @T(a = X.x) @interface T { diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/api/TestJavacTaskScanner.java --- a/langtools/test/tools/javac/api/TestJavacTaskScanner.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/api/TestJavacTaskScanner.java Thu Mar 18 18:50:22 2010 -0700 @@ -34,7 +34,10 @@ import com.sun.tools.javac.parser.*; // XXX import com.sun.tools.javac.util.*; // XXX import java.io.*; +import java.net.*; import java.nio.*; +import java.nio.charset.Charset; +import java.util.Arrays; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.lang.model.type.DeclaredType; @@ -43,6 +46,10 @@ import javax.lang.model.util.Types; import javax.tools.*; +import static javax.tools.StandardLocation.CLASS_PATH; +import static javax.tools.StandardLocation.SOURCE_PATH; +import static javax.tools.StandardLocation.CLASS_OUTPUT; + public class TestJavacTaskScanner extends ToolTester { final JavacTaskImpl task; @@ -56,6 +63,7 @@ TestJavacTaskScanner(File file) { final Iterable compilationUnits = fm.getJavaFileObjects(new File[] {file}); + StandardJavaFileManager fm = getLocalFileManager(tool, null, null); task = (JavacTaskImpl)tool.getTask(null, fm, null, null, null, compilationUnits); task.getContext().put(Scanner.Factory.scannerFactoryKey, new MyScanner.Factory(task.getContext(), this)); @@ -83,7 +91,7 @@ System.out.println("#parseTypeElements: " + numParseTypeElements); System.out.println("#allMembers: " + numAllMembers); - check(numTokens, "#Tokens", 891); + check(numTokens, "#Tokens", 1222); check(numParseTypeElements, "#parseTypeElements", 136); check(numAllMembers, "#allMembers", 67); } @@ -117,6 +125,47 @@ numAllMembers++; } } + + /* Similar to ToolTester.getFileManager, except that this version also ensures + * javac classes will be available on the classpath. The javac classes are assumed + * to be on the classpath used to run this test (this is true when using jtreg). + * The classes are found by obtaining the URL for a sample javac class, using + * getClassLoader().getResource(), and then deconstructing the URL to find the + * underlying directory or jar file to place on the classpath. + */ + public StandardJavaFileManager getLocalFileManager(JavaCompiler tool, + DiagnosticListener dl, + Charset encoding) { + File javac_classes; + try { + final String javacMainClass = "com/sun/tools/javac/Main.class"; + URL url = getClass().getClassLoader().getResource(javacMainClass); + if (url == null) + throw new Error("can't locate javac classes"); + URI uri = url.toURI(); + String scheme = uri.getScheme(); + String ssp = uri.getSchemeSpecificPart(); + if (scheme.equals("jar")) { + javac_classes = new File(new URI(ssp.substring(0, ssp.indexOf("!/")))); + } else if (scheme.equals("file")) { + javac_classes = new File(ssp.substring(0, ssp.indexOf(javacMainClass))); + } else + throw new Error("unknown URL: " + url); + } catch (URISyntaxException e) { + throw new Error(e); + } + System.err.println("javac_classes: " + javac_classes); + + StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, encoding); + try { + fm.setLocation(SOURCE_PATH, Arrays.asList(test_src)); + fm.setLocation(CLASS_PATH, Arrays.asList(test_classes, javac_classes)); + fm.setLocation(CLASS_OUTPUT, Arrays.asList(test_classes)); + } catch (IOException e) { + throw new AssertionError(e); + } + return fm; + } } class MyScanner extends Scanner { diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/api/TestResolveError.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/api/TestResolveError.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,101 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/** + * @test + * @bug 6930108 + * @summary IllegalArgumentException in AbstractDiagnosticFormatter for tools/javac/api/TestJavacTaskScanner.java + * @library ./lib + * @build ToolTester + * @run main TestResolveError + */ + +import java.io.*; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; +import javax.tools.*; + +import com.sun.tools.javac.api.JavacTaskImpl; + +/* + * This is a cut down version of TestJavacTaskScanner, which as originally written + * caused an IllegalArgumentException in AbstractDiagnosticFormatter as a result + * of calling task.parseType with a name whose resolution depended on the setting + * of the bootclasspath. + * This test has the same call, task.parseType("List", clazz), but checks + * that the error is handled in a reasonable way by javac. + */ +public class TestResolveError extends ToolTester { + public static void main(String... args) throws Exception { + new TestResolveError().run(); + } + + void run() throws Exception { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + File file = new File(test_src, "TestResolveError.java"); + final Iterable compilationUnits = + fm.getJavaFileObjects(new File[] {file}); + task = (JavacTaskImpl)tool.getTask(pw, fm, null, null, null, compilationUnits); + elements = task.getElements(); + types = task.getTypes(); + + Iterable toplevels; + try { + toplevels = task.enter(task.parse()); + } catch (IOException ex) { + throw new AssertionError(ex); + } + + for (TypeElement clazz : toplevels) { + System.out.format("Testing %s:%n%n", clazz.getSimpleName()); + // this should not cause any exception from the compiler, + // such as IllegalArgumentException + testParseType(clazz); + } + + pw.close(); + + String out = sw.toString(); + System.out.println(out); + + if (out.contains("com.sun.tools.javac.util")) + throw new Exception("Unexpected output from compiler"); + } + + void testParseType(TypeElement clazz) { + DeclaredType type = (DeclaredType)task.parseType("List", clazz); + for (Element member : elements.getAllMembers((TypeElement)type.asElement())) { + TypeMirror mt = types.asMemberOf(type, member); + System.out.format("%s : %s -> %s%n", member.getSimpleName(), member.asType(), mt); + } + } + + JavacTaskImpl task; + Elements elements; + Types types; +} diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/generics/Casting.java --- a/langtools/test/tools/javac/generics/Casting.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/generics/Casting.java Thu Mar 18 18:50:22 2010 -0700 @@ -30,7 +30,7 @@ * @compile Casting.java */ -package test.tools.javac.generics.Casting; +package Casting; class Test {} diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/generics/Casting3.java --- a/langtools/test/tools/javac/generics/Casting3.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/generics/Casting3.java Thu Mar 18 18:50:22 2010 -0700 @@ -30,7 +30,7 @@ * @compile Casting3.java */ -package test.tools.javac.generics.Casting3; +package Casting3; class A> { > void f() { diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/generics/Casting4.java --- a/langtools/test/tools/javac/generics/Casting4.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/generics/Casting4.java Thu Mar 18 18:50:22 2010 -0700 @@ -30,7 +30,7 @@ * @compile -Werror -Xlint:unchecked Casting4.java */ -package test.tools.javac.generics.Casting4; +package Casting4; class Casting4 { Integer f(Comparable c) { diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/generics/InnerInterface1.java --- a/langtools/test/tools/javac/generics/InnerInterface1.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/generics/InnerInterface1.java Thu Mar 18 18:50:22 2010 -0700 @@ -30,7 +30,7 @@ * @compile InnerInterface1.java */ -package test.tools.javac.generics.InnerInterface1; +package InnerInterface1; interface Iterator { } diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/generics/InnerInterface2.java --- a/langtools/test/tools/javac/generics/InnerInterface2.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/generics/InnerInterface2.java Thu Mar 18 18:50:22 2010 -0700 @@ -30,7 +30,7 @@ * @compile InnerInterface2.java */ -package test.tools.javac.generics.InnerInterface2; +package InnerInterface2; class Builder { diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/generics/Multibound1.java --- a/langtools/test/tools/javac/generics/Multibound1.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/generics/Multibound1.java Thu Mar 18 18:50:22 2010 -0700 @@ -30,7 +30,7 @@ * @compile/fail Multibound1.java */ -package test.tools.javac.generics.Multibound1; +package Multibound1; interface A {} interface B {} diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/generics/MultipleInheritance.java --- a/langtools/test/tools/javac/generics/MultipleInheritance.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/generics/MultipleInheritance.java Thu Mar 18 18:50:22 2010 -0700 @@ -30,7 +30,7 @@ * @compile MultipleInheritance.java */ -package test.tools.javac.generics.MultipleInheritance; +package MultipleInheritance; import java.util.*; diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/generics/NameOrder.java --- a/langtools/test/tools/javac/generics/NameOrder.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/generics/NameOrder.java Thu Mar 18 18:50:22 2010 -0700 @@ -27,22 +27,22 @@ * @summary generics: type inference failure due to a bug in ClassSymbol.isLess * @author gafter * - * @compile NameOrder.java + * @compile NameOrder.java */ -package test.tools.javac.generics.NameOrder; +package NameOrder; interface a {} interface b {} interface c {} -class A implements a, b {} -class B implements c, a {} +class AB implements a, b {} +class CA implements c, a {} // this is how to trigger a symptom: -abstract class C { +abstract class X { T f(T t1, T t2) { return null; } void g() { - a x = f( new A(), new B() ); + a x = f( new AB(), new CA() ); } } diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/generics/PermuteBound.java --- a/langtools/test/tools/javac/generics/PermuteBound.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/generics/PermuteBound.java Thu Mar 18 18:50:22 2010 -0700 @@ -30,7 +30,7 @@ * @compile PermuteBound.java */ -package test.tools.javac.generics.PermuteBound; +package PermuteBound; class C {} diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/generics/PrimitiveVariant.java --- a/langtools/test/tools/javac/generics/PrimitiveVariant.java Fri Mar 12 17:44:50 2010 -0800 +++ b/langtools/test/tools/javac/generics/PrimitiveVariant.java Thu Mar 18 18:50:22 2010 -0700 @@ -30,7 +30,7 @@ * @compile/fail PrimitiveVariant.java */ -package test.tools.javac.generics.PrimitiveVariant; +package PrimitiveVariant; interface I { double m(); diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/processing/6511613/DummyProcessor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/6511613/DummyProcessor.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,40 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import javax.annotation.processing.*; +import javax.lang.model.*; +import javax.lang.model.element.*; +import java.util.Set; + +@SupportedAnnotationTypes("*") +public class DummyProcessor extends AbstractProcessor { + public boolean process(Set annotations, + RoundEnvironment roundEnv) { + return true; + } + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latest(); + } +} + diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/processing/6511613/clss41701.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/6511613/clss41701.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,43 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6511613 + * @summary javac unexpectedly doesn't fail in some cases if an annotation processor specified + * + * @build DummyProcessor + * @compile/fail clss41701.java + * @compile/fail -processor DummyProcessor clss41701.java + */ + +import java.io.PrintStream; + +interface clss41701i { + void run(); +} + +class clss41701a { +} diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/processing/model/element/TestAnonClassNames.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/model/element/TestAnonClassNames.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,186 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6449781 + * @summary Test that reported names of anonymous classes are non-null. + * @author Joseph D. Darcy + * @build TestAnonSourceNames + * @compile/fail -processor TestAnonSourceNames TestAnonClassNames.java + * @build TestAnonClassNames + * @run main TestAnonClassNames + */ + +/* + * This test operates in phases to test retrieving the qualified name + * of anonymous classes from type elements modeling the anonymous + * class. The type elements are generated using both source files and + * class files as the basis of constructing the elements. + * + * Source files will be tested by the @compile line which runs + * TestAnonSourceNames as an annotation processor over this file. + * This compile line is expected to fail until 6930507 is fixed. Once + * bug 6930507 is fixed, the "@compile/fail -processor ..." and + * following "@build..." steps can be replaced with a single "@compile + * -processor ..." directive. + * + * Class files are tested by the @run command on this type. This + * class gets the names of classes with different nesting kinds, + * including anonymous classes, and then invokes the compiler with an + * annotation processor having the class files names as inputs. The + * compiler is invoked via the javax.tools mechanism. + */ + +import java.lang.annotation.*; +import javax.lang.model.element.*; +import javax.annotation.processing.*; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.*; +import javax.lang.model.util.*; +import javax.tools.*; +import java.util.*; + +import static java.lang.annotation.RetentionPolicy.*; +import static javax.lang.model.element.NestingKind.*; +import static javax.lang.model.util.ElementFilter.*; +import static javax.tools.Diagnostic.Kind.*; +import static javax.tools.StandardLocation.*; + +@Nesting(TOP_LEVEL) +public class TestAnonClassNames { + @Nesting(MEMBER) + static class MemberClass1{} + + @Nesting(MEMBER) + class MemberClass2{} + + @Nesting(MEMBER) + class Win$$AtVegas { } // Class with funny name. + + public static void main(String... argv) { + @Nesting(LOCAL) + class LocalClass{}; + + Object o = new @Nesting(ANONYMOUS) Object() { // An anonymous annotated class + public String toString() { + return "I have no name!"; + } + }; + + Class[] classes = { + MemberClass1.class, + MemberClass2.class, + LocalClass.class, + Win$$AtVegas.class, + o.getClass(), + TestAnonClassNames.class, + }; + + for(Class clazz : classes) { + String name = clazz.getName(); + System.out.format("%s is %s%n", + clazz.getName(), + clazz.getAnnotation(Nesting.class).value()); + testClassName(name); + } + } + + /** + * Perform annotation processing on the class file name and verify + * the existence of different flavors of class names when the + * input classes are modeled as elements. + */ + static void testClassName(String className) { + JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler(); + List classNames = new ArrayList<>(); + classNames.add(className); + + List options = new ArrayList<>(); + options.add("-proc:only"); + options.add("-classpath"); + options.add(System.getProperty("test.classes")); + + JavaCompiler.CompilationTask compileTask = + javaCompiler.getTask(null, // Output + null, // File manager + null, // Diagnostics + options, + classNames, + null); // Sources + List processors = new ArrayList<>(); + processors.add(new ClassNameProber()); + compileTask.setProcessors(processors); + Boolean goodResult = compileTask.call(); + if (!goodResult) { + throw new RuntimeException("Errors found during compile."); + } + } +} + +@Retention(RUNTIME) +@interface Nesting { + NestingKind value(); +} + +/** + * Probe at the various kinds of names of a type element. + */ +@SupportedAnnotationTypes("*") +class ClassNameProber extends AbstractProcessor { + public ClassNameProber(){super();} + + private boolean classesFound=false; + + public boolean process(Set annotations, + RoundEnvironment roundEnv) { + if (!roundEnv.processingOver()) { + for(TypeElement typeElt : typesIn(roundEnv.getRootElements())) { + classesFound = true; + + // Verify different names are non-null; an NPE will + // result in failed compile status being reported. + NestingKind nestingKind = typeElt.getNestingKind(); + System.out.printf("\tSimple name: ''%s''\tQualified Name: ''%s''\tKind ''%s''\tNesting ''%s''%n", + typeElt.getSimpleName().toString(), + typeElt.getQualifiedName().toString(), + typeElt.getKind().toString(), + nestingKind.toString()); + + if (typeElt.getAnnotation(Nesting.class).value() != nestingKind) { + throw new RuntimeException("Mismatch of expected and reported nesting kind."); + } + } + + } + + if (!classesFound) { + throw new RuntimeException("Error: no classes processed."); + } + return true; + } + + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latest(); + } +} diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/processing/model/element/TestAnonSourceNames.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/processing/model/element/TestAnonSourceNames.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,92 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.io.*; +import javax.annotation.processing.*; +import javax.lang.model.*; +import javax.lang.model.element.*; +import javax.lang.model.type.*; +import javax.lang.model.util.*; +import java.util.*; +import com.sun.source.tree.*; +import com.sun.source.util.*; +import static javax.tools.Diagnostic.Kind.*; + +/** + * Using the tree API, retrieve element representations of anonymous + * classes and verify their names are as specified. + */ +@SupportedAnnotationTypes("*") +public class TestAnonSourceNames extends AbstractProcessor { + + public boolean process(Set annotations, + RoundEnvironment roundEnv) { + if (!roundEnv.processingOver()) { + Trees trees = Trees.instance(processingEnv); + + for(Element rootElement : roundEnv.getRootElements()) { + TreePath treePath = trees.getPath(rootElement); + + (new ClassTreeScanner(trees)). + scan(trees.getTree(rootElement), + treePath.getCompilationUnit()); + } + } + return true; + } + + class ClassTreeScanner extends TreeScanner { + private Trees trees; + + public ClassTreeScanner(Trees trees) { + super(); + this.trees = trees; + } + @Override + public Void visitClass(ClassTree node, CompilationUnitTree cu) { + Element element = trees.getElement(trees.getPath(cu, node)); + if (element == null) { + processingEnv.getMessager().printMessage(ERROR, + "No element retreived for node named ''" + + node.getSimpleName() + "''."); + } else { + + System.out.println("\nVisiting class ``" + element.getSimpleName() + + "'' of kind " + element.getKind()); + if (element instanceof TypeElement) { + TypeElement typeElement = (TypeElement) element; + String s = typeElement.getQualifiedName().toString(); + System.out.println("\tqualified name:" + s); + } else { + throw new RuntimeException("TypeElement not gotten from ClassTree."); + } + } + return super.visitClass(node, cu); + } + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latest(); + } +} diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/tree/TestAnnotatedAnonClass.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/tree/TestAnnotatedAnonClass.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,37 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + + +/* + * This file is not a regular test, but is processed by ./TreePosTest.java, + * which verifies the position info in the javac tree. + * To run the test standalone, compile TreePosTest, then run TreePosTest + * on this file. + * @bug 6931927 + * @summary position issues with synthesized anonymous class + */ +class TestAnnotatedAnonClass { + void m() { + Object o = new @Deprecated Object() { }; + } +} diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/tree/TreePosTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/tree/TreePosTest.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,762 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.EventQueue; +import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.swing.DefaultComboBoxModel; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.SwingUtilities; +import javax.swing.event.CaretEvent; +import javax.swing.event.CaretListener; +import javax.swing.text.BadLocationException; +import javax.swing.text.DefaultHighlighter; +import javax.swing.text.Highlighter; +import javax.tools.Diagnostic; +import javax.tools.DiagnosticListener; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; + +import com.sun.source.tree.CompilationUnitTree; +import com.sun.source.util.JavacTask; +import com.sun.tools.javac.api.JavacTool; +import com.sun.tools.javac.code.Flags; +import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; +import com.sun.tools.javac.tree.JCTree.JCNewClass; +import com.sun.tools.javac.tree.JCTree.JCVariableDecl; +import com.sun.tools.javac.tree.TreeInfo; +import com.sun.tools.javac.tree.TreeScanner; + +import static com.sun.tools.javac.util.Position.NOPOS; + +/** + * Utility and test program to check validity of tree positions for tree nodes. + * The program can be run standalone, or as a jtreg test. In standalone mode, + * errors can be displayed in a gui viewer. For info on command line args, + * run program with no args. + * + *

+ * jtreg: Note that by using the -r switch in the test description below, this test + * will process all java files in the langtools/test directory, thus implicitly + * covering any new language features that may be tested in this test suite. + */ + +/* + * @test + * @bug 6919889 + * @summary assorted position errors in compiler syntax trees + * @run main TreePosTest -q -r -ef ./tools/javac/typeAnnotations -ef ./tools/javap/typeAnnotations -et ANNOTATED_TYPE . + */ +public class TreePosTest { + /** + * Main entry point. + * If test.src is set, program runs in jtreg mode, and will throw an Error + * if any errors arise, otherwise System.exit will be used, unless the gui + * viewer is being used. In jtreg mode, the default base directory for file + * args is the value of ${test.src}. In jtreg mode, the -r option can be + * given to change the default base directory to the root test directory. + */ + public static void main(String... args) { + String testSrc = System.getProperty("test.src"); + File baseDir = (testSrc == null) ? null : new File(testSrc); + boolean ok = new TreePosTest().run(baseDir, args); + if (!ok) { + if (testSrc != null) // jtreg mode + throw new Error("failed"); + else + System.exit(1); + } + } + + /** + * Run the program. A base directory can be provided for file arguments. + * In jtreg mode, the -r option can be given to change the default base + * directory to the test root directory. For other options, see usage(). + * @param baseDir base directory for any file arguments. + * @param args command line args + * @return true if successful or in gui mode + */ + boolean run(File baseDir, String... args) { + if (args.length == 0) { + usage(System.out); + return true; + } + + List files = new ArrayList(); + for (int i = 0; i < args.length; i++) { + String arg = args[i]; + if (arg.equals("-encoding") && i + 1 < args.length) + encoding = args[++i]; + else if (arg.equals("-gui")) + gui = true; + else if (arg.equals("-q")) + quiet = true; + else if (arg.equals("-v")) + verbose = true; + else if (arg.equals("-t") && i + 1 < args.length) + tags.add(args[++i]); + else if (arg.equals("-ef") && i + 1 < args.length) + excludeFiles.add(new File(baseDir, args[++i])); + else if (arg.equals("-et") && i + 1 < args.length) + excludeTags.add(args[++i]); + else if (arg.equals("-r")) { + if (excludeFiles.size() > 0) + throw new Error("-r must be used before -ef"); + File d = baseDir; + while (!new File(d, "TEST.ROOT").exists()) { + d = d.getParentFile(); + if (d == null) + throw new Error("cannot find TEST.ROOT"); + } + baseDir = d; + } + else if (arg.startsWith("-")) + throw new Error("unknown option: " + arg); + else { + while (i < args.length) + files.add(new File(baseDir, args[i++])); + } + } + + for (File file: files) { + if (file.exists()) + test(file); + else + error("File not found: " + file); + } + + if (fileCount != 1) + System.err.println(fileCount + " files read"); + if (errors > 0) + System.err.println(errors + " errors"); + + return (gui || errors == 0); + } + + /** + * Print command line help. + * @param out output stream + */ + void usage(PrintStream out) { + out.println("Usage:"); + out.println(" java TreePosTest options... files..."); + out.println(""); + out.println("where options include:"); + out.println("-gui Display returns in a GUI viewer"); + out.println("-q Quiet: don't report on inapplicable files"); + out.println("-v Verbose: report on files as they are being read"); + out.println("-t tag Limit checks to tree nodes with this tag"); + out.println(" Can be repeated if desired"); + out.println("-ef file Exclude file or directory"); + out.println("-et tag Exclude tree nodes with given tag name"); + out.println(""); + out.println("files may be directories or files"); + out.println("directories will be scanned recursively"); + out.println("non java files, or java files which cannot be parsed, will be ignored"); + out.println(""); + } + + /** + * Test a file. If the file is a directory, it will be recursively scanned + * for java files. + * @param file the file or directory to test + */ + void test(File file) { + if (excludeFiles.contains(file)) { + if (!quiet) + error("File " + file + " excluded"); + return; + } + + if (file.isDirectory()) { + for (File f: file.listFiles()) { + test(f); + } + return; + } + + if (file.isFile() && file.getName().endsWith(".java")) { + try { + if (verbose) + System.err.println(file); + fileCount++; + PosTester p = new PosTester(); + p.test(read(file)); + } catch (ParseException e) { + if (!quiet) { + error("Error parsing " + file + "\n" + e.getMessage()); + } + } catch (IOException e) { + error("Error reading " + file + ": " + e); + } + return; + } + + if (!quiet) + error("File " + file + " ignored"); + } + + /** + * Read a file. + * @param file the file to be read + * @return the tree for the content of the file + * @throws IOException if any IO errors occur + * @throws TreePosTest.ParseException if any errors occur while parsing the file + */ + JCCompilationUnit read(File file) throws IOException, ParseException { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + Reporter r = new Reporter(pw); + JavacTool tool = JavacTool.create(); + Charset cs = (encoding == null ? null : Charset.forName(encoding)); + StandardJavaFileManager fm = tool.getStandardFileManager(r, null, null); + Iterable files = fm.getJavaFileObjects(file); + JavacTask task = tool.getTask(pw, fm, r, Collections.emptyList(), null, files); + Iterable trees = task.parse(); + pw.flush(); + if (r.errors > 0) + throw new ParseException(sw.toString()); + Iterator iter = trees.iterator(); + if (!iter.hasNext()) + throw new Error("no trees found"); + JCCompilationUnit t = (JCCompilationUnit) iter.next(); + if (iter.hasNext()) + throw new Error("too many trees found"); + return t; + } + + /** + * Report an error. When the program is complete, the program will either + * exit or throw an Error if any errors have been reported. + * @param msg the error message + */ + void error(String msg) { + System.err.println(msg); + errors++; + } + + /** Number of files that have been analyzed. */ + int fileCount; + /** Number of errors reported. */ + int errors; + /** Flag: don't report irrelevant files. */ + boolean quiet; + /** Flag: report files as they are processed. */ + boolean verbose; + /** Flag: show errors in GUI viewer. */ + boolean gui; + /** Option: encoding for test files. */ + String encoding; + /** The GUI viewer for errors. */ + Viewer viewer; + /** The set of tags for tree nodes to be analyzed; if empty, all tree nodes + * are analyzed. */ + Set tags = new HashSet(); + /** Set of files and directories to be excluded from analysis. */ + Set excludeFiles = new HashSet(); + /** Set of tag names to be excluded from analysis. */ + Set excludeTags = new HashSet(); + /** Table of printable names for tree tag values. */ + TagNames tagNames = new TagNames(); + + /** + * Main class for testing assertions concerning tree positions for tree nodes. + */ + private class PosTester extends TreeScanner { + void test(JCCompilationUnit tree) { + sourcefile = tree.sourcefile; + endPosTable = tree.endPositions; + encl = new Info(); + tree.accept(this); + } + + @Override + public void scan(JCTree tree) { + if (tree == null) + return; + + Info self = new Info(tree, endPosTable); + if (check(encl, self)) { + // Modifiers nodes are present throughout the tree even where + // there is no corresponding source text. + // Redundant semicolons in a class definition can cause empty + // initializer blocks with no positions. + if ((self.tag == JCTree.MODIFIERS || self.tag == JCTree.BLOCK) + && self.pos == NOPOS) { + // If pos is NOPOS, so should be the start and end positions + check("start == NOPOS", encl, self, self.start == NOPOS); + check("end == NOPOS", encl, self, self.end == NOPOS); + } else { + // For this node, start , pos, and endpos should be all defined + check("start != NOPOS", encl, self, self.start != NOPOS); + check("pos != NOPOS", encl, self, self.pos != NOPOS); + check("end != NOPOS", encl, self, self.end != NOPOS); + // The following should normally be ordered + // encl.start <= start <= pos <= end <= encl.end + // In addition, the position of the enclosing node should be + // within this node. + // The primary exceptions are for array type nodes, because of the + // need to support legacy syntax: + // e.g. int a[]; int[] b[]; int f()[] { return null; } + // and because of inconsistent nesting of left and right of + // array declarations: + // e.g. int[][] a = new int[2][]; + check("encl.start <= start", encl, self, encl.start <= self.start); + check("start <= pos", encl, self, self.start <= self.pos); + if (!(self.tag == JCTree.TYPEARRAY + && (encl.tag == JCTree.VARDEF || encl.tag == JCTree.TYPEARRAY))) { + check("encl.pos <= start || end <= encl.pos", + encl, self, encl.pos <= self.start || self.end <= encl.pos); + } + check("pos <= end", encl, self, self.pos <= self.end); + if (!(self.tag == JCTree.TYPEARRAY && encl.tag == JCTree.TYPEARRAY)) { + check("end <= encl.end", encl, self, self.end <= encl.end); + } + } + } + + Info prevEncl = encl; + encl = self; + tree.accept(this); + encl = prevEncl; + } + + @Override + public void visitVarDef(JCVariableDecl tree) { + // enum member declarations are desugared in the parser and have + // ill-defined semantics for tree positions, so for now, we + // skip the synthesized bits and just check parts which came from + // the original source text + if ((tree.mods.flags & Flags.ENUM) != 0) { + scan(tree.mods); + if (tree.init != null) { + if (tree.init.getTag() == JCTree.NEWCLASS) { + JCNewClass init = (JCNewClass) tree.init; + if (init.args != null && init.args.nonEmpty()) { + scan(init.args); + } + if (init.def != null && init.def.defs != null) { + scan(init.def.defs); + } + } + } + } else + super.visitVarDef(tree); + } + + boolean check(Info encl, Info self) { + if (excludeTags.size() > 0) { + if (encl != null && excludeTags.contains(tagNames.get(encl.tag)) + || excludeTags.contains(tagNames.get(self.tag))) + return false; + } + return tags.size() == 0 || tags.contains(tagNames.get(self.tag)); + } + + void check(String label, Info encl, Info self, boolean ok) { + if (!ok) { + if (gui) { + if (viewer == null) + viewer = new Viewer(); + viewer.addEntry(sourcefile, label, encl, self); + } + + String s = self.tree.toString(); + String msg = sourcefile.getName() + ": " + label + ": " + + "encl:" + encl + " this:" + self + "\n" + + s.substring(0, Math.min(80, s.length())).replaceAll("[\r\n]+", " "); + error(msg); + } + } + + JavaFileObject sourcefile; + Map endPosTable; + Info encl; + + } + + /** + * Utility class providing easy access to position and other info for a tree node. + */ + private class Info { + Info() { + tree = null; + tag = JCTree.ERRONEOUS; + start = 0; + pos = 0; + end = Integer.MAX_VALUE; + } + + Info(JCTree tree, Map endPosTable) { + this.tree = tree; + tag = tree.getTag(); + start = TreeInfo.getStartPos(tree); + pos = tree.pos; + end = TreeInfo.getEndPos(tree, endPosTable); + } + + @Override + public String toString() { + return tagNames.get(tree.getTag()) + "[start:" + start + ",pos:" + pos + ",end:" + end + "]"; + } + + final JCTree tree; + final int tag; + final int start; + final int pos; + final int end; + } + + /** + * Names for tree tags. + * javac does not provide an API to convert tag values to strings, so this class uses + * reflection to determine names of public static final int values in JCTree. + */ + private static class TagNames { + String get(int tag) { + if (map == null) { + map = new HashMap(); + Class c = JCTree.class; + for (Field f : c.getDeclaredFields()) { + if (f.getType().equals(int.class)) { + int mods = f.getModifiers(); + if (Modifier.isPublic(mods) && Modifier.isStatic(mods) && Modifier.isFinal(mods)) { + try { + map.put(f.getInt(null), f.getName()); + } catch (IllegalAccessException e) { + } + } + } + } + } + String name = map.get(tag); + return (name == null) ? "??" : name; + } + + private Map map; + } + + /** + * Thrown when errors are found parsing a java file. + */ + private static class ParseException extends Exception { + ParseException(String msg) { + super(msg); + } + } + + /** + * DiagnosticListener to report diagnostics and count any errors that occur. + */ + private static class Reporter implements DiagnosticListener { + Reporter(PrintWriter out) { + this.out = out; + } + + public void report(Diagnostic diagnostic) { + out.println(diagnostic); + switch (diagnostic.getKind()) { + case ERROR: + errors++; + } + } + int errors; + PrintWriter out; + } + + /** + * GUI viewer for issues found by TreePosTester. The viewer provides a drop + * down list for selecting error conditions, a header area providing details + * about an error, and a text area with the ranges of text highlighted as + * appropriate. + */ + private class Viewer extends JFrame { + /** + * Create a viewer. + */ + Viewer() { + initGUI(); + } + + /** + * Add another entry to the list of errors. + * @param file The file containing the error + * @param check The condition that was being tested, and which failed + * @param encl the enclosing tree node + * @param self the tree node containing the error + */ + void addEntry(JavaFileObject file, String check, Info encl, Info self) { + Entry e = new Entry(file, check, encl, self); + DefaultComboBoxModel m = (DefaultComboBoxModel) entries.getModel(); + m.addElement(e); + if (m.getSize() == 1) + entries.setSelectedItem(e); + } + + /** + * Initialize the GUI window. + */ + private void initGUI() { + JPanel head = new JPanel(new GridBagLayout()); + GridBagConstraints lc = new GridBagConstraints(); + GridBagConstraints fc = new GridBagConstraints(); + fc.anchor = GridBagConstraints.WEST; + fc.fill = GridBagConstraints.HORIZONTAL; + fc.gridwidth = GridBagConstraints.REMAINDER; + + entries = new JComboBox(); + entries.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + showEntry((Entry) entries.getSelectedItem()); + } + }); + fc.insets.bottom = 10; + head.add(entries, fc); + fc.insets.bottom = 0; + head.add(new JLabel("check:"), lc); + head.add(checkField = createTextField(80), fc); + fc.fill = GridBagConstraints.NONE; + head.add(setBackground(new JLabel("encl:"), enclColor), lc); + head.add(enclPanel = new InfoPanel(), fc); + head.add(setBackground(new JLabel("self:"), selfColor), lc); + head.add(selfPanel = new InfoPanel(), fc); + add(head, BorderLayout.NORTH); + + body = new JTextArea(); + body.setFont(Font.decode(Font.MONOSPACED)); + body.addCaretListener(new CaretListener() { + public void caretUpdate(CaretEvent e) { + int dot = e.getDot(); + int mark = e.getMark(); + if (dot == mark) + statusText.setText("dot: " + dot); + else + statusText.setText("dot: " + dot + ", mark:" + mark); + } + }); + JScrollPane p = new JScrollPane(body, + JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, + JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + p.setPreferredSize(new Dimension(640, 480)); + add(p, BorderLayout.CENTER); + + statusText = createTextField(80); + add(statusText, BorderLayout.SOUTH); + + pack(); + setLocationRelativeTo(null); // centered on screen + setVisible(true); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + + /** Show an entry that has been selected. */ + private void showEntry(Entry e) { + try { + // update simple fields + setTitle(e.file.getName()); + checkField.setText(e.check); + enclPanel.setInfo(e.encl); + selfPanel.setInfo(e.self); + // show file text with highlights + body.setText(e.file.getCharContent(true).toString()); + Highlighter highlighter = body.getHighlighter(); + highlighter.removeAllHighlights(); + addHighlight(highlighter, e.encl, enclColor); + addHighlight(highlighter, e.self, selfColor); + scroll(body, getMinPos(enclPanel.info, selfPanel.info)); + } catch (IOException ex) { + body.setText("Cannot read " + e.file.getName() + ": " + e); + } + } + + /** Create a test field. */ + private JTextField createTextField(int width) { + JTextField f = new JTextField(width); + f.setEditable(false); + f.setBorder(null); + return f; + } + + /** Add a highlighted region based on the positions in an Info object. */ + private void addHighlight(Highlighter h, Info info, Color c) { + int start = info.start; + int end = info.end; + if (start == -1 && end == -1) + return; + if (start == -1) + start = end; + if (end == -1) + end = start; + try { + h.addHighlight(info.start, info.end, + new DefaultHighlighter.DefaultHighlightPainter(c)); + if (info.pos != -1) { + Color c2 = new Color(c.getRed(), c.getGreen(), c.getBlue(), (int)(.4f * 255)); // 40% + h.addHighlight(info.pos, info.pos + 1, + new DefaultHighlighter.DefaultHighlightPainter(c2)); + } + } catch (BadLocationException e) { + e.printStackTrace(); + } + } + + /** Get the minimum valid position in a set of info objects. */ + private int getMinPos(Info... values) { + int i = Integer.MAX_VALUE; + for (Info info: values) { + if (info.start >= 0) i = Math.min(i, info.start); + if (info.pos >= 0) i = Math.min(i, info.pos); + if (info.end >= 0) i = Math.min(i, info.end); + } + return (i == Integer.MAX_VALUE) ? 0 : i; + } + + /** Set the background on a component. */ + private JComponent setBackground(JComponent comp, Color c) { + comp.setOpaque(true); + comp.setBackground(c); + return comp; + } + + /** Scroll a text area to display a given position near the middle of the visible area. */ + private void scroll(final JTextArea t, final int pos) { + // Using invokeLater appears to give text a chance to sort itself out + // before the scroll happens; otherwise scrollRectToVisible doesn't work. + // Maybe there's a better way to sync with the text... + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + Rectangle r = t.modelToView(pos); + JScrollPane p = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, t); + r.y = Math.max(0, r.y - p.getHeight() * 2 / 5); + r.height += p.getHeight() * 4 / 5; + t.scrollRectToVisible(r); + } catch (BadLocationException ignore) { + } + } + }); + } + + private JComboBox entries; + private JTextField checkField; + private InfoPanel enclPanel; + private InfoPanel selfPanel; + private JTextArea body; + private JTextField statusText; + + private Color selfColor = new Color(0.f, 1.f, 0.f, 0.2f); // 20% green + private Color enclColor = new Color(1.f, 0.f, 0.f, 0.2f); // 20% red + + /** Panel to display an Info object. */ + private class InfoPanel extends JPanel { + InfoPanel() { + add(tagName = createTextField(20)); + add(new JLabel("start:")); + add(addListener(start = createTextField(6))); + add(new JLabel("pos:")); + add(addListener(pos = createTextField(6))); + add(new JLabel("end:")); + add(addListener(end = createTextField(6))); + } + + void setInfo(Info info) { + this.info = info; + tagName.setText(tagNames.get(info.tag)); + start.setText(String.valueOf(info.start)); + pos.setText(String.valueOf(info.pos)); + end.setText(String.valueOf(info.end)); + } + + JTextField addListener(final JTextField f) { + f.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + body.setCaretPosition(Integer.valueOf(f.getText())); + body.getCaret().setVisible(true); + } + }); + return f; + } + + Info info; + JTextField tagName; + JTextField start; + JTextField pos; + JTextField end; + } + + /** Object to record information about an error to be displayed. */ + private class Entry { + Entry(JavaFileObject file, String check, Info encl, Info self) { + this.file = file; + this.check = check; + this.encl = encl; + this.self= self; + } + + @Override + public String toString() { + return file.getName() + " " + check + " " + getMinPos(encl, self); + } + + final JavaFileObject file; + final String check; + final Info encl; + final Info self; + } + } +} + diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javac/treepostests/TreePosTest.java --- a/langtools/test/tools/javac/treepostests/TreePosTest.java Fri Mar 12 17:44:50 2010 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,762 +0,0 @@ -/* - * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. - */ - -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.EventQueue; -import java.awt.Font; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Rectangle; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.File; -import java.io.IOException; -import java.io.PrintStream; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import javax.swing.DefaultComboBoxModel; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.JTextField; -import javax.swing.SwingUtilities; -import javax.swing.event.CaretEvent; -import javax.swing.event.CaretListener; -import javax.swing.text.BadLocationException; -import javax.swing.text.DefaultHighlighter; -import javax.swing.text.Highlighter; -import javax.tools.Diagnostic; -import javax.tools.DiagnosticListener; -import javax.tools.JavaFileObject; -import javax.tools.StandardJavaFileManager; - -import com.sun.source.tree.CompilationUnitTree; -import com.sun.source.util.JavacTask; -import com.sun.tools.javac.api.JavacTool; -import com.sun.tools.javac.code.Flags; -import com.sun.tools.javac.tree.JCTree; -import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; -import com.sun.tools.javac.tree.JCTree.JCNewClass; -import com.sun.tools.javac.tree.JCTree.JCVariableDecl; -import com.sun.tools.javac.tree.TreeInfo; -import com.sun.tools.javac.tree.TreeScanner; - -import static com.sun.tools.javac.util.Position.NOPOS; - -/** - * Utility and test program to check validity of tree positions for tree nodes. - * The program can be run standalone, or as a jtreg test. In standalone mode, - * errors can be displayed in a gui viewer. For info on command line args, - * run program with no args. - * - *

- * jtreg: Note that by using the -r switch in the test description below, this test - * will process all java files in the langtools/test directory, thus implicitly - * covering any new language features that may be tested in this test suite. - */ - -/* - * @test - * @bug 6919889 - * @summary assorted position errors in compiler syntax trees - * @run main TreePosTest -q -r -ef ./tools/javac/typeAnnotations -ef ./tools/javap/typeAnnotations -et ANNOTATED_TYPE . - */ -public class TreePosTest { - /** - * Main entry point. - * If test.src is set, program runs in jtreg mode, and will throw an Error - * if any errors arise, otherwise System.exit will be used, unless the gui - * viewer is being used. In jtreg mode, the default base directory for file - * args is the value of ${test.src}. In jtreg mode, the -r option can be - * given to change the default base directory to the root test directory. - */ - public static void main(String... args) { - String testSrc = System.getProperty("test.src"); - File baseDir = (testSrc == null) ? null : new File(testSrc); - boolean ok = new TreePosTest().run(baseDir, args); - if (!ok) { - if (testSrc != null) // jtreg mode - throw new Error("failed"); - else - System.exit(1); - } - } - - /** - * Run the program. A base directory can be provided for file arguments. - * In jtreg mode, the -r option can be given to change the default base - * directory to the test root directory. For other options, see usage(). - * @param baseDir base directory for any file arguments. - * @param args command line args - * @return true if successful or in gui mode - */ - boolean run(File baseDir, String... args) { - if (args.length == 0) { - usage(System.out); - return true; - } - - List files = new ArrayList(); - for (int i = 0; i < args.length; i++) { - String arg = args[i]; - if (arg.equals("-encoding") && i + 1 < args.length) - encoding = args[++i]; - else if (arg.equals("-gui")) - gui = true; - else if (arg.equals("-q")) - quiet = true; - else if (arg.equals("-v")) - verbose = true; - else if (arg.equals("-t") && i + 1 < args.length) - tags.add(args[++i]); - else if (arg.equals("-ef") && i + 1 < args.length) - excludeFiles.add(new File(baseDir, args[++i])); - else if (arg.equals("-et") && i + 1 < args.length) - excludeTags.add(args[++i]); - else if (arg.equals("-r")) { - if (excludeFiles.size() > 0) - throw new Error("-r must be used before -ef"); - File d = baseDir; - while (!new File(d, "TEST.ROOT").exists()) { - d = d.getParentFile(); - if (d == null) - throw new Error("cannot find TEST.ROOT"); - } - baseDir = d; - } - else if (arg.startsWith("-")) - throw new Error("unknown option: " + arg); - else { - while (i < args.length) - files.add(new File(baseDir, args[i++])); - } - } - - for (File file: files) { - if (file.exists()) - test(file); - else - error("File not found: " + file); - } - - if (fileCount != 1) - System.err.println(fileCount + " files read"); - if (errors > 0) - System.err.println(errors + " errors"); - - return (gui || errors == 0); - } - - /** - * Print command line help. - * @param out output stream - */ - void usage(PrintStream out) { - out.println("Usage:"); - out.println(" java TreePosTest options... files..."); - out.println(""); - out.println("where options include:"); - out.println("-gui Display returns in a GUI viewer"); - out.println("-q Quiet: don't report on inapplicable files"); - out.println("-v Verbose: report on files as they are being read"); - out.println("-t tag Limit checks to tree nodes with this tag"); - out.println(" Can be repeated if desired"); - out.println("-ef file Exclude file or directory"); - out.println("-et tag Exclude tree nodes with given tag name"); - out.println(""); - out.println("files may be directories or files"); - out.println("directories will be scanned recursively"); - out.println("non java files, or java files which cannot be parsed, will be ignored"); - out.println(""); - } - - /** - * Test a file. If the file is a directory, it will be recursively scanned - * for java files. - * @param file the file or directory to test - */ - void test(File file) { - if (excludeFiles.contains(file)) { - if (!quiet) - error("File " + file + " excluded"); - return; - } - - if (file.isDirectory()) { - for (File f: file.listFiles()) { - test(f); - } - return; - } - - if (file.isFile() && file.getName().endsWith(".java")) { - try { - if (verbose) - System.err.println(file); - fileCount++; - PosTester p = new PosTester(); - p.test(read(file)); - } catch (ParseException e) { - if (!quiet) { - error("Error parsing " + file + "\n" + e.getMessage()); - } - } catch (IOException e) { - error("Error reading " + file + ": " + e); - } - return; - } - - if (!quiet) - error("File " + file + " ignored"); - } - - /** - * Read a file. - * @param file the file to be read - * @return the tree for the content of the file - * @throws IOException if any IO errors occur - * @throws TreePosTest.ParseException if any errors occur while parsing the file - */ - JCCompilationUnit read(File file) throws IOException, ParseException { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - Reporter r = new Reporter(pw); - JavacTool tool = JavacTool.create(); - Charset cs = (encoding == null ? null : Charset.forName(encoding)); - StandardJavaFileManager fm = tool.getStandardFileManager(r, null, null); - Iterable files = fm.getJavaFileObjects(file); - JavacTask task = tool.getTask(pw, fm, r, Collections.emptyList(), null, files); - Iterable trees = task.parse(); - pw.flush(); - if (r.errors > 0) - throw new ParseException(sw.toString()); - Iterator iter = trees.iterator(); - if (!iter.hasNext()) - throw new Error("no trees found"); - JCCompilationUnit t = (JCCompilationUnit) iter.next(); - if (iter.hasNext()) - throw new Error("too many trees found"); - return t; - } - - /** - * Report an error. When the program is complete, the program will either - * exit or throw an Error if any errors have been reported. - * @param msg the error message - */ - void error(String msg) { - System.err.println(msg); - errors++; - } - - /** Number of files that have been analyzed. */ - int fileCount; - /** Number of errors reported. */ - int errors; - /** Flag: don't report irrelevant files. */ - boolean quiet; - /** Flag: report files as they are processed. */ - boolean verbose; - /** Flag: show errors in GUI viewer. */ - boolean gui; - /** Option: encoding for test files. */ - String encoding; - /** The GUI viewer for errors. */ - Viewer viewer; - /** The set of tags for tree nodes to be analyzed; if empty, all tree nodes - * are analyzed. */ - Set tags = new HashSet(); - /** Set of files and directories to be excluded from analysis. */ - Set excludeFiles = new HashSet(); - /** Set of tag names to be excluded from analysis. */ - Set excludeTags = new HashSet(); - /** Table of printable names for tree tag values. */ - TagNames tagNames = new TagNames(); - - /** - * Main class for testing assertions concerning tree positions for tree nodes. - */ - private class PosTester extends TreeScanner { - void test(JCCompilationUnit tree) { - sourcefile = tree.sourcefile; - endPosTable = tree.endPositions; - encl = new Info(); - tree.accept(this); - } - - @Override - public void scan(JCTree tree) { - if (tree == null) - return; - - Info self = new Info(tree, endPosTable); - if (check(encl, self)) { - // Modifiers nodes are present throughout the tree even where - // there is no corresponding source text. - // Redundant semicolons in a class definition can cause empty - // initializer blocks with no positions. - if ((self.tag == JCTree.MODIFIERS || self.tag == JCTree.BLOCK) - && self.pos == NOPOS) { - // If pos is NOPOS, so should be the start and end positions - check("start == NOPOS", encl, self, self.start == NOPOS); - check("end == NOPOS", encl, self, self.end == NOPOS); - } else { - // For this node, start , pos, and endpos should be all defined - check("start != NOPOS", encl, self, self.start != NOPOS); - check("pos != NOPOS", encl, self, self.pos != NOPOS); - check("end != NOPOS", encl, self, self.end != NOPOS); - // The following should normally be ordered - // encl.start <= start <= pos <= end <= encl.end - // In addition, the position of the enclosing node should be - // within this node. - // The primary exceptions are for array type nodes, because of the - // need to support legacy syntax: - // e.g. int a[]; int[] b[]; int f()[] { return null; } - // and because of inconsistent nesting of left and right of - // array declarations: - // e.g. int[][] a = new int[2][]; - check("encl.start <= start", encl, self, encl.start <= self.start); - check("start <= pos", encl, self, self.start <= self.pos); - if (!(self.tag == JCTree.TYPEARRAY - && (encl.tag == JCTree.VARDEF || encl.tag == JCTree.TYPEARRAY))) { - check("encl.pos <= start || end <= encl.pos", - encl, self, encl.pos <= self.start || self.end <= encl.pos); - } - check("pos <= end", encl, self, self.pos <= self.end); - if (!(self.tag == JCTree.TYPEARRAY && encl.tag == JCTree.TYPEARRAY)) { - check("end <= encl.end", encl, self, self.end <= encl.end); - } - } - } - - Info prevEncl = encl; - encl = self; - tree.accept(this); - encl = prevEncl; - } - - @Override - public void visitVarDef(JCVariableDecl tree) { - // enum member declarations are desugared in the parser and have - // ill-defined semantics for tree positions, so for now, we - // skip the synthesized bits and just check parts which came from - // the original source text - if ((tree.mods.flags & Flags.ENUM) != 0) { - scan(tree.mods); - if (tree.init != null) { - if (tree.init.getTag() == JCTree.NEWCLASS) { - JCNewClass init = (JCNewClass) tree.init; - if (init.args != null && init.args.nonEmpty()) { - scan(init.args); - } - if (init.def != null && init.def.defs != null) { - scan(init.def.defs); - } - } - } - } else - super.visitVarDef(tree); - } - - boolean check(Info encl, Info self) { - if (excludeTags.size() > 0) { - if (encl != null && excludeTags.contains(tagNames.get(encl.tag)) - || excludeTags.contains(tagNames.get(self.tag))) - return false; - } - return tags.size() == 0 || tags.contains(tagNames.get(self.tag)); - } - - void check(String label, Info encl, Info self, boolean ok) { - if (!ok) { - if (gui) { - if (viewer == null) - viewer = new Viewer(); - viewer.addEntry(sourcefile, label, encl, self); - } - - String s = self.tree.toString(); - String msg = sourcefile.getName() + ": " + label + ": " + - "encl:" + encl + " this:" + self + "\n" + - s.substring(0, Math.min(80, s.length())).replaceAll("[\r\n]+", " "); - error(msg); - } - } - - JavaFileObject sourcefile; - Map endPosTable; - Info encl; - - } - - /** - * Utility class providing easy access to position and other info for a tree node. - */ - private class Info { - Info() { - tree = null; - tag = JCTree.ERRONEOUS; - start = 0; - pos = 0; - end = Integer.MAX_VALUE; - } - - Info(JCTree tree, Map endPosTable) { - this.tree = tree; - tag = tree.getTag(); - start = TreeInfo.getStartPos(tree); - pos = tree.pos; - end = TreeInfo.getEndPos(tree, endPosTable); - } - - @Override - public String toString() { - return tagNames.get(tree.getTag()) + "[start:" + start + ",pos:" + pos + ",end:" + end + "]"; - } - - final JCTree tree; - final int tag; - final int start; - final int pos; - final int end; - } - - /** - * Names for tree tags. - * javac does not provide an API to convert tag values to strings, so this class uses - * reflection to determine names of public static final int values in JCTree. - */ - private static class TagNames { - String get(int tag) { - if (map == null) { - map = new HashMap(); - Class c = JCTree.class; - for (Field f : c.getDeclaredFields()) { - if (f.getType().equals(int.class)) { - int mods = f.getModifiers(); - if (Modifier.isPublic(mods) && Modifier.isStatic(mods) && Modifier.isFinal(mods)) { - try { - map.put(f.getInt(null), f.getName()); - } catch (IllegalAccessException e) { - } - } - } - } - } - String name = map.get(tag); - return (name == null) ? "??" : name; - } - - private Map map; - } - - /** - * Thrown when errors are found parsing a java file. - */ - private static class ParseException extends Exception { - ParseException(String msg) { - super(msg); - } - } - - /** - * DiagnosticListener to report diagnostics and count any errors that occur. - */ - private static class Reporter implements DiagnosticListener { - Reporter(PrintWriter out) { - this.out = out; - } - - public void report(Diagnostic diagnostic) { - out.println(diagnostic); - switch (diagnostic.getKind()) { - case ERROR: - errors++; - } - } - int errors; - PrintWriter out; - } - - /** - * GUI viewer for issues found by TreePosTester. The viewer provides a drop - * down list for selecting error conditions, a header area providing details - * about an error, and a text area with the ranges of text highlighted as - * appropriate. - */ - private class Viewer extends JFrame { - /** - * Create a viewer. - */ - Viewer() { - initGUI(); - } - - /** - * Add another entry to the list of errors. - * @param file The file containing the error - * @param check The condition that was being tested, and which failed - * @param encl the enclosing tree node - * @param self the tree node containing the error - */ - void addEntry(JavaFileObject file, String check, Info encl, Info self) { - Entry e = new Entry(file, check, encl, self); - DefaultComboBoxModel m = (DefaultComboBoxModel) entries.getModel(); - m.addElement(e); - if (m.getSize() == 1) - entries.setSelectedItem(e); - } - - /** - * Initialize the GUI window. - */ - private void initGUI() { - JPanel head = new JPanel(new GridBagLayout()); - GridBagConstraints lc = new GridBagConstraints(); - GridBagConstraints fc = new GridBagConstraints(); - fc.anchor = GridBagConstraints.WEST; - fc.fill = GridBagConstraints.HORIZONTAL; - fc.gridwidth = GridBagConstraints.REMAINDER; - - entries = new JComboBox(); - entries.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - showEntry((Entry) entries.getSelectedItem()); - } - }); - fc.insets.bottom = 10; - head.add(entries, fc); - fc.insets.bottom = 0; - head.add(new JLabel("check:"), lc); - head.add(checkField = createTextField(80), fc); - fc.fill = GridBagConstraints.NONE; - head.add(setBackground(new JLabel("encl:"), enclColor), lc); - head.add(enclPanel = new InfoPanel(), fc); - head.add(setBackground(new JLabel("self:"), selfColor), lc); - head.add(selfPanel = new InfoPanel(), fc); - add(head, BorderLayout.NORTH); - - body = new JTextArea(); - body.setFont(Font.decode(Font.MONOSPACED)); - body.addCaretListener(new CaretListener() { - public void caretUpdate(CaretEvent e) { - int dot = e.getDot(); - int mark = e.getMark(); - if (dot == mark) - statusText.setText("dot: " + dot); - else - statusText.setText("dot: " + dot + ", mark:" + mark); - } - }); - JScrollPane p = new JScrollPane(body, - JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, - JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); - p.setPreferredSize(new Dimension(640, 480)); - add(p, BorderLayout.CENTER); - - statusText = createTextField(80); - add(statusText, BorderLayout.SOUTH); - - pack(); - setLocationRelativeTo(null); // centered on screen - setVisible(true); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - } - - /** Show an entry that has been selected. */ - private void showEntry(Entry e) { - try { - // update simple fields - setTitle(e.file.getName()); - checkField.setText(e.check); - enclPanel.setInfo(e.encl); - selfPanel.setInfo(e.self); - // show file text with highlights - body.setText(e.file.getCharContent(true).toString()); - Highlighter highlighter = body.getHighlighter(); - highlighter.removeAllHighlights(); - addHighlight(highlighter, e.encl, enclColor); - addHighlight(highlighter, e.self, selfColor); - scroll(body, getMinPos(enclPanel.info, selfPanel.info)); - } catch (IOException ex) { - body.setText("Cannot read " + e.file.getName() + ": " + e); - } - } - - /** Create a test field. */ - private JTextField createTextField(int width) { - JTextField f = new JTextField(width); - f.setEditable(false); - f.setBorder(null); - return f; - } - - /** Add a highlighted region based on the positions in an Info object. */ - private void addHighlight(Highlighter h, Info info, Color c) { - int start = info.start; - int end = info.end; - if (start == -1 && end == -1) - return; - if (start == -1) - start = end; - if (end == -1) - end = start; - try { - h.addHighlight(info.start, info.end, - new DefaultHighlighter.DefaultHighlightPainter(c)); - if (info.pos != -1) { - Color c2 = new Color(c.getRed(), c.getGreen(), c.getBlue(), (int)(.4f * 255)); // 40% - h.addHighlight(info.pos, info.pos + 1, - new DefaultHighlighter.DefaultHighlightPainter(c2)); - } - } catch (BadLocationException e) { - e.printStackTrace(); - } - } - - /** Get the minimum valid position in a set of info objects. */ - private int getMinPos(Info... values) { - int i = Integer.MAX_VALUE; - for (Info info: values) { - if (info.start >= 0) i = Math.min(i, info.start); - if (info.pos >= 0) i = Math.min(i, info.pos); - if (info.end >= 0) i = Math.min(i, info.end); - } - return (i == Integer.MAX_VALUE) ? 0 : i; - } - - /** Set the background on a component. */ - private JComponent setBackground(JComponent comp, Color c) { - comp.setOpaque(true); - comp.setBackground(c); - return comp; - } - - /** Scroll a text area to display a given position near the middle of the visible area. */ - private void scroll(final JTextArea t, final int pos) { - // Using invokeLater appears to give text a chance to sort itself out - // before the scroll happens; otherwise scrollRectToVisible doesn't work. - // Maybe there's a better way to sync with the text... - EventQueue.invokeLater(new Runnable() { - public void run() { - try { - Rectangle r = t.modelToView(pos); - JScrollPane p = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, t); - r.y = Math.max(0, r.y - p.getHeight() * 2 / 5); - r.height += p.getHeight() * 4 / 5; - t.scrollRectToVisible(r); - } catch (BadLocationException ignore) { - } - } - }); - } - - private JComboBox entries; - private JTextField checkField; - private InfoPanel enclPanel; - private InfoPanel selfPanel; - private JTextArea body; - private JTextField statusText; - - private Color selfColor = new Color(0.f, 1.f, 0.f, 0.2f); // 20% green - private Color enclColor = new Color(1.f, 0.f, 0.f, 0.2f); // 20% red - - /** Panel to display an Info object. */ - private class InfoPanel extends JPanel { - InfoPanel() { - add(tagName = createTextField(20)); - add(new JLabel("start:")); - add(addListener(start = createTextField(6))); - add(new JLabel("pos:")); - add(addListener(pos = createTextField(6))); - add(new JLabel("end:")); - add(addListener(end = createTextField(6))); - } - - void setInfo(Info info) { - this.info = info; - tagName.setText(tagNames.get(info.tag)); - start.setText(String.valueOf(info.start)); - pos.setText(String.valueOf(info.pos)); - end.setText(String.valueOf(info.end)); - } - - JTextField addListener(final JTextField f) { - f.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - body.setCaretPosition(Integer.valueOf(f.getText())); - body.getCaret().setVisible(true); - } - }); - return f; - } - - Info info; - JTextField tagName; - JTextField start; - JTextField pos; - JTextField end; - } - - /** Object to record information about an error to be displayed. */ - private class Entry { - Entry(JavaFileObject file, String check, Info encl, Info self) { - this.file = file; - this.check = check; - this.encl = encl; - this.self= self; - } - - @Override - public String toString() { - return file.getName() + " " + check + " " + getMinPos(encl, self); - } - - final JavaFileObject file; - final String check; - final Info encl; - final Info self; - } - } -} - diff -r 85992faf57f5 -r 27cccdaba851 langtools/test/tools/javah/T6893943.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javah/T6893943.java Thu Mar 18 18:50:22 2010 -0700 @@ -0,0 +1,75 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + * @test + * @bug 6893943 + * @summary exit code from javah with no args is 0 + */ + +import java.io.*; +import java.util.*; + +public class T6893943 { + public static void main(String... args) throws Exception { + new T6893943().run(); + } + + void run() throws Exception { + testSimpleAPI(); + testCommand(); + } + + void testSimpleAPI() throws Exception { + PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.err)); + int rc = com.sun.tools.javah.Main.run(new String[] { }, pw); + expect("testSimpleAPI", rc, 1); + } + + void testCommand() throws Exception { + File javaHome = new File(System.getProperty("java.home")); + if (javaHome.getName().equals("jre")) + javaHome = javaHome.getParentFile(); + + List command = new ArrayList(); + command.add(new File(new File(javaHome, "bin"), "javah").getPath()); + command.add("-J-Xbootclasspath:" + System.getProperty("sun.boot.class.path")); + //System.err.println("command: " + command); + + ProcessBuilder pb = new ProcessBuilder(command); + pb.redirectErrorStream(true); + Process p = pb.start(); + p.getOutputStream().close(); + String line; + BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); + while ((line = in.readLine()) != null) + System.err.println("javah: " + line); + int rc = p.waitFor(); + expect("testCommand", rc, 1); + } + + void expect(String name, int actual, int expect) throws Exception { + if (actual != expect) + throw new Exception(name + ": unexpected exit: " + actual + ", expected: " + expect); + } +}