This commit is contained in:
Kelly O'Hair 2009-12-01 08:54:10 -08:00
commit 759c63a953
130 changed files with 5161 additions and 1914 deletions

View File

@ -96,6 +96,7 @@ OTHER_CPPFLAGS += $(LIBARCH_DEFINES)
ifneq ($(PLATFORM), windows) # UNIX systems ifneq ($(PLATFORM), windows) # UNIX systems
LD_RUNPATH_EXTRAS += ..
LIB_LOCATION = $(LIBDIR)/$(LIBARCH)/jli LIB_LOCATION = $(LIBDIR)/$(LIBARCH)/jli
# Note: its important to keep this order meaning -lc is the # Note: its important to keep this order meaning -lc is the
# last library otherwise it could cause compatibility issues # last library otherwise it could cause compatibility issues

View File

@ -61,8 +61,5 @@ OTHER_CPPFLAGS += -DLAUNCHER_NAME='"$(LAUNCHER_NAME)"'
ifeq ($(PLATFORM), solaris) ifeq ($(PLATFORM), solaris)
LDFLAGS += -R$(OPENWIN_LIB) LDFLAGS += -R$(OPENWIN_LIB)
endif
ifeq ($(PLATFORM), solaris)
LDFLAGS += -M mapfile-$(ARCH) LDFLAGS += -M mapfile-$(ARCH)
endif endif

View File

@ -194,10 +194,8 @@ endif
# For backwards compatability, make a link of the 32-bit client JVM to $(LIBDIR) # For backwards compatability, make a link of the 32-bit client JVM to $(LIBDIR)
IMPORT_LIST += $(LIB_LOCATION)/$(JVM_NAME) IMPORT_LIST += $(LIB_LOCATION)/$(JVM_NAME)
# create a link from lib/libjvm.so to client/libjvm.so
$(LIB_LOCATION)/$(JVM_NAME): $(LIB_LOCATION)/$(CLIENT_LOCATION)/$(JVM_NAME) $(LIB_LOCATION)/$(JVM_NAME): $(LIB_LOCATION)/$(CLIENT_LOCATION)/$(JVM_NAME)
@$(prep-target) @$(prep-target)
$(LN) -s $(CLIENT_LOCATION)/$(JVM_NAME) $@
# solaris ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ solaris # solaris ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ solaris
endif # 32bit solaris endif # 32bit solaris

View File

@ -21,4 +21,4 @@
# CA 95054 USA or visit www.sun.com if you need additional information or # CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions. # have any questions.
# #
tzdata2009l tzdata2009r

View File

@ -102,15 +102,38 @@ Rule ChileAQ 2000 max - Mar Sun>=9 3:00u 0 -
# Davis, Vestfold Hills, -6835+07759, since 1957-01-13 # Davis, Vestfold Hills, -6835+07759, since 1957-01-13
# (except 1964-11 - 1969-02) # (except 1964-11 - 1969-02)
# Mawson, Holme Bay, -6736+06253, since 1954-02-13 # Mawson, Holme Bay, -6736+06253, since 1954-02-13
# From Steffen Thorsen (2009-03-11):
# Three Australian stations in Antarctica have changed their time zone:
# Casey moved from UTC+8 to UTC+11
# Davis moved from UTC+7 to UTC+5
# Mawson moved from UTC+6 to UTC+5
# The changes occurred on 2009-10-18 at 02:00 (local times).
#
# Government source: (Australian Antarctic Division)
# <a href="http://www.aad.gov.au/default.asp?casid=37079">
# http://www.aad.gov.au/default.asp?casid=37079
# </a>
#
# We have more background information here:
# <a href="http://www.timeanddate.com/news/time/antarctica-new-times.html">
# http://www.timeanddate.com/news/time/antarctica-new-times.html
# </a>
# Zone NAME GMTOFF RULES FORMAT [UNTIL] # Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Antarctica/Casey 0 - zzz 1969 Zone Antarctica/Casey 0 - zzz 1969
8:00 - WST # Western (Aus) Standard Time 8:00 - WST 2009 Oct 18 2:00
# Western (Aus) Standard Time
11:00 - CAST # Casey Time
Zone Antarctica/Davis 0 - zzz 1957 Jan 13 Zone Antarctica/Davis 0 - zzz 1957 Jan 13
7:00 - DAVT 1964 Nov # Davis Time 7:00 - DAVT 1964 Nov # Davis Time
0 - zzz 1969 Feb 0 - zzz 1969 Feb
7:00 - DAVT 7:00 - DAVT 2009 Oct 18 2:0
5:00 - DAVT
Zone Antarctica/Mawson 0 - zzz 1954 Feb 13 Zone Antarctica/Mawson 0 - zzz 1954 Feb 13
6:00 - MAWT # Mawson Time 6:00 - MAWT 2009 Oct 18 2:00
# Mawson Time
5:00 - MAWT
# References: # References:
# <a href="http://www.antdiv.gov.au/aad/exop/sfo/casey/casey_aws.html"> # <a href="http://www.antdiv.gov.au/aad/exop/sfo/casey/casey_aws.html">
# Casey Weather (1998-02-26) # Casey Weather (1998-02-26)

View File

@ -21,7 +21,6 @@
# CA 95054 USA or visit www.sun.com if you need additional information or # CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions. # have any questions.
# #
# <pre>
# This file is in the public domain, so clarified as of # This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson. # 2009-05-17 by Arthur David Olson.
@ -194,11 +193,30 @@ Zone Asia/Bahrain 3:22:20 - LMT 1920 # Al Manamah
# #
# No DST end date has been announced yet. # No DST end date has been announced yet.
# From Arthur David Olson (2009-07-11): # From Alexander Krivenyshev (2009-09-25):
# Arbitrarily end DST at the end of 2009 so that a POSIX-sytle time zone string # Bangladesh won't go back to Standard Time from October 1, 2009,
# can appear in the Dhaka binary file and for the benefit of old glibc # instead it will continue DST measure till the cabinet makes a fresh decision.
# reimplementations of the time zone software that mishandle permanent DST. #
# A change will be required once the end date is known. # Following report by same newspaper-"The Daily Star Friday":
# "DST change awaits cabinet decision-Clock won't go back by 1-hr from Oct 1"
# <a href="http://www.thedailystar.net/newDesign/news-details.php?nid=107021">
# http://www.thedailystar.net/newDesign/news-details.php?nid=107021
# </a>
# or
# <a href="http://www.worldtimezone.com/dst_news/dst_news_bangladesh04.html">
# http://www.worldtimezone.com/dst_news/dst_news_bangladesh04.html
# </a>
# From Steffen Thorsen (2009-10-13):
# IANS (Indo-Asian News Service) now reports:
# Bangladesh has decided that the clock advanced by an hour to make
# maximum use of daylight hours as an energy saving measure would
# "continue for an indefinite period."
#
# One of many places where it is published:
# <a href="http://www.thaindian.com/newsportal/business/bangladesh-to-continue-indefinitely-with-advanced-time_100259987.html">
# http://www.thaindian.com/newsportal/business/bangladesh-to-continue-indefinitely-with-advanced-time_100259987.html
# </a>
# Zone NAME GMTOFF RULES FORMAT [UNTIL] # Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Dhaka 6:01:40 - LMT 1890 Zone Asia/Dhaka 6:01:40 - LMT 1890
@ -208,8 +226,7 @@ Zone Asia/Dhaka 6:01:40 - LMT 1890
6:30 - BURT 1951 Sep 30 6:30 - BURT 1951 Sep 30
6:00 - DACT 1971 Mar 26 # Dacca Time 6:00 - DACT 1971 Mar 26 # Dacca Time
6:00 - BDT 2009 Jun 19 23:00 # Bangladesh Time 6:00 - BDT 2009 Jun 19 23:00 # Bangladesh Time
6:00 1:00 BDST 2010 6:00 1:00 BDST
6:00 - BDT
# Bhutan # Bhutan
# Zone NAME GMTOFF RULES FORMAT [UNTIL] # Zone NAME GMTOFF RULES FORMAT [UNTIL]
@ -373,14 +390,84 @@ Zone Asia/Kashgar 5:03:56 - LMT 1928 # or Kashi or Kaxgar
5:00 - KAST 1980 May 5:00 - KAST 1980 May
8:00 PRC C%sT 8:00 PRC C%sT
# 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,
# 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
# think 3:30 is correct. The official DST record for Hong Kong can be
# obtained from
# <a href="http://www.hko.gov.hk/gts/time/Summertime.htm">
# http://www.hko.gov.hk/gts/time/Summertime.htm
# </a>.
# From Arthur David Olson (2009-10-28):
# Here are the dates given at
# <a href="http://www.hko.gov.hk/gts/time/Summertime.htm">
# http://www.hko.gov.hk/gts/time/Summertime.htm
# </a>
# as of 2009-10-28:
# Year Period
# 1941 1 Apr to 30 Sep
# 1942 Whole year
# 1943 Whole year
# 1944 Whole year
# 1945 Whole year
# 1946 20 Apr to 1 Dec
# 1947 13 Apr to 30 Dec
# 1948 2 May to 31 Oct
# 1949 3 Apr to 30 Oct
# 1950 2 Apr to 29 Oct
# 1951 1 Apr to 28 Oct
# 1952 6 Apr to 25 Oct
# 1953 5 Apr to 1 Nov
# 1954 21 Mar to 31 Oct
# 1955 20 Mar to 6 Nov
# 1956 18 Mar to 4 Nov
# 1957 24 Mar to 3 Nov
# 1958 23 Mar to 2 Nov
# 1959 22 Mar to 1 Nov
# 1960 20 Mar to 6 Nov
# 1961 19 Mar to 5 Nov
# 1962 18 Mar to 4 Nov
# 1963 24 Mar to 3 Nov
# 1964 22 Mar to 1 Nov
# 1965 18 Apr to 17 Oct
# 1966 17 Apr to 16 Oct
# 1967 16 Apr to 22 Oct
# 1968 21 Apr to 20 Oct
# 1969 20 Apr to 19 Oct
# 1970 19 Apr to 18 Oct
# 1971 18 Apr to 17 Oct
# 1972 16 Apr to 22 Oct
# 1973 22 Apr to 21 Oct
# 1973/74 30 Dec 73 to 20 Oct 74
# 1975 20 Apr to 19 Oct
# 1976 18 Apr to 17 Oct
# 1977 Nil
# 1978 Nil
# 1979 13 May to 21 Oct
# 1980 to Now Nil
# The page does not give start or end times of day.
# The page does not give a start date for 1942.
# The page does not givw an end date for 1945.
# The Japanese occupation of Hong Kong began on 1941-12-25.
# The Japanese surrender of Hong Kong was signed 1945-09-15.
# For lack of anything better, use start of those days as the transition times.
# Hong Kong (Xianggang) # Hong Kong (Xianggang)
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule HK 1941 only - Apr 1 3:30 1:00 S
Rule HK 1941 only - Sep 30 3:30 0 -
Rule HK 1946 only - Apr 20 3:30 1:00 S Rule HK 1946 only - Apr 20 3:30 1:00 S
Rule HK 1946 only - Dec 1 3:30 0 - Rule HK 1946 only - Dec 1 3:30 0 -
Rule HK 1947 only - Apr 13 3:30 1:00 S Rule HK 1947 only - Apr 13 3:30 1:00 S
Rule HK 1947 only - Dec 30 3:30 0 - Rule HK 1947 only - Dec 30 3:30 0 -
Rule HK 1948 only - May 2 3:30 1:00 S Rule HK 1948 only - May 2 3:30 1:00 S
Rule HK 1948 1952 - Oct lastSun 3:30 0 - Rule HK 1948 1951 - Oct lastSun 3:30 0 -
Rule HK 1952 only - Oct 25 3:30 0 -
Rule HK 1949 1953 - Apr Sun>=1 3:30 1:00 S Rule HK 1949 1953 - Apr Sun>=1 3:30 1:00 S
Rule HK 1953 only - Nov 1 3:30 0 - Rule HK 1953 only - Nov 1 3:30 0 -
Rule HK 1954 1964 - Mar Sun>=18 3:30 1:00 S Rule HK 1954 1964 - Mar Sun>=18 3:30 1:00 S
@ -388,13 +475,15 @@ Rule HK 1954 only - Oct 31 3:30 0 -
Rule HK 1955 1964 - Nov Sun>=1 3:30 0 - Rule HK 1955 1964 - Nov Sun>=1 3:30 0 -
Rule HK 1965 1977 - Apr Sun>=16 3:30 1:00 S Rule HK 1965 1977 - Apr Sun>=16 3:30 1:00 S
Rule HK 1965 1977 - Oct Sun>=16 3:30 0 - Rule HK 1965 1977 - Oct Sun>=16 3:30 0 -
Rule HK 1979 1980 - May Sun>=8 3:30 1:00 S Rule HK 1973 only - Dec 30 3:30 1:00 S
Rule HK 1979 1980 - Oct Sun>=16 3:30 0 - Rule HK 1979 only - May Sun>=8 3:30 1:00 S
Rule HK 1979 only - Oct Sun>=16 3:30 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL] # Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Hong_Kong 7:36:36 - LMT 1904 Oct 30 Zone Asia/Hong_Kong 7:36:36 - LMT 1904 Oct 30
8:00 HK HK%sT 1941 Dec 25
9:00 - JST 1945 Sep 15
8:00 HK HK%sT 8:00 HK HK%sT
############################################################################### ###############################################################################
# Taiwan # Taiwan
@ -1696,16 +1785,66 @@ Zone Asia/Muscat 3:54:20 - LMT 1920
# advance clocks in the country by one hour from April 15 to # advance clocks in the country by one hour from April 15 to
# conserve energy" # conserve energy"
# From Arthur David Olson (2009-04-10): # From Steffen Thorsen (2009-09-17):
# Assume for now that Pakistan will end DST in 2009 as it did in 2008. # "The News International," Pakistan reports that: "The Federal
# Government has decided to restore the previous time by moving the
# clocks backward by one hour from October 1. A formal announcement to
# this effect will be made after the Prime Minister grants approval in
# this regard."
# <a href="http://www.thenews.com.pk/updates.asp?id=87168">
# http://www.thenews.com.pk/updates.asp?id=87168
# </a>
# From Alexander Krivenyshev (2009-09-28):
# According to Associated Press Of Pakistan, it is confirmed that
# Pakistan clocks across the country would be turned back by an hour from October
# 1, 2009.
#
# "Clocks to go back one hour from 1 Oct"
# <a href="http://www.app.com.pk/en_/index.php?option=com_content&task=view&id=86715&Itemid=2">
# http://www.app.com.pk/en_/index.php?option=com_content&task=view&id=86715&Itemid=2
# </a>
# or
# <a href="http://www.worldtimezone.com/dst_news/dst_news_pakistan07.htm">
# http://www.worldtimezone.com/dst_news/dst_news_pakistan07.htm
# </a>
# From Steffen Thorsen (2009-09-29):
# Alexander Krivenyshev wrote:
# > According to Associated Press Of Pakistan, it is confirmed that
# > Pakistan clocks across the country would be turned back by an hour from October
# > 1, 2009.
#
# Now they seem to have changed their mind, November 1 is the new date:
# <a href="http://www.thenews.com.pk/top_story_detail.asp?Id=24742">
# http://www.thenews.com.pk/top_story_detail.asp?Id=24742
# </a>
# "The country's clocks will be reversed by one hour on November 1.
# Officials of Federal Ministry for Interior told this to Geo News on
# Monday."
#
# And more importantly, it seems that these dates will be kept every year:
# "It has now been decided that clocks will be wound forward by one hour
# on April 15 and reversed by an hour on November 1 every year without
# obtaining prior approval, the officials added."
#
# We have confirmed this year's end date with both with the Ministry of
# Water and Power and the Pakistan Electric Power Company:
# <a href="http://www.timeanddate.com/news/time/pakistan-ends-dst09.html">
# http://www.timeanddate.com/news/time/pakistan-ends-dst09.html
# </a>
# From Christoph Goehre (2009-10-01):
# [T]he German Consulate General in Karachi reported me today that Pakistan
# will go back to standard time on 1st of November.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Pakistan 2002 only - Apr Sun>=2 0:01 1:00 S Rule Pakistan 2002 only - Apr Sun>=2 0:01 1:00 S
Rule Pakistan 2002 only - Oct Sun>=2 0:01 0 - Rule Pakistan 2002 only - Oct Sun>=2 0:01 0 -
Rule Pakistan 2008 only - Jun 1 0:00 1:00 S Rule Pakistan 2008 only - Jun 1 0:00 1:00 S
Rule Pakistan 2008 only - Nov 1 0:00 0 - Rule Pakistan 2008 only - Nov 1 0:00 0 -
Rule Pakistan 2009 only - Apr 15 0:00 1:00 S Rule Pakistan 2009 max - Apr 15 0:00 1:00 S
Rule Pakistan 2009 only - Nov 1 0:00 0 - Rule Pakistan 2009 max - Nov 1 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL] # Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Karachi 4:28:12 - LMT 1907 Zone Asia/Karachi 4:28:12 - LMT 1907
5:30 - IST 1942 Sep 5:30 - IST 1942 Sep
@ -1858,6 +1997,42 @@ Zone Asia/Karachi 4:28:12 - LMT 1907
# http://www.worldtimezone.com/dst_news/dst_news_westbank01.html # http://www.worldtimezone.com/dst_news/dst_news_westbank01.html
# </a> # </a>
# From Steffen Thorsen (2009-08-31):
# Palestine's Council of Ministers announced that they will revert back to
# winter time on Friday, 2009-09-04.
#
# One news source:
# <a href="http://www.safa.ps/ara/?action=showdetail&seid=4158">
# http://www.safa.ps/ara/?action=showdetail&seid=4158
# </a>
# (Palestinian press agency, Arabic),
# Google translate: "Decided that the Palestinian government in Ramallah
# headed by Salam Fayyad, the start of work in time for the winter of
# 2009, starting on Friday approved the fourth delay Sept. clock sixty
# minutes per hour as of Friday morning."
#
# We are not sure if Gaza will do the same, last year they had a different
# end date, we will keep this page updated:
# <a href="http://www.timeanddate.com/news/time/westbank-gaza-dst-2009.html">
# http://www.timeanddate.com/news/time/westbank-gaza-dst-2009.html
# </a>
# From Alexander Krivenyshev (2009-09-02):
# Seems that Gaza Strip will go back to Winter Time same date as West Bank.
#
# According to Palestinian Ministry Of Interior, West Bank and Gaza Strip plan
# to change time back to Standard time on September 4, 2009.
#
# "Winter time unite the West Bank and Gaza"
# (from Palestinian National Authority):
# <a href="http://www.moi.gov.ps/en/?page=633167343250594025&nid=11505
# http://www.moi.gov.ps/en/?page=633167343250594025&nid=11505
# </a>
# or
# <a href="http://www.worldtimezone.com/dst_news/dst_news_gazastrip02.html>
# http://www.worldtimezone.com/dst_news/dst_news_gazastrip02.html
# </a>
# The rules for Egypt are stolen from the `africa' file. # The rules for Egypt are stolen from the `africa' file.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S # Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule EgyptAsia 1957 only - May 10 0:00 1:00 S Rule EgyptAsia 1957 only - May 10 0:00 1:00 S
@ -1876,7 +2051,7 @@ Rule Palestine 2006 only - Sep 22 0:00 0 -
Rule Palestine 2007 only - Sep Thu>=8 2:00 0 - Rule Palestine 2007 only - Sep Thu>=8 2:00 0 -
Rule Palestine 2008 only - Aug lastFri 2:00 0 - Rule Palestine 2008 only - Aug lastFri 2:00 0 -
Rule Palestine 2009 max - Mar lastFri 0:00 1:00 S Rule Palestine 2009 max - Mar lastFri 0:00 1:00 S
Rule Palestine 2009 max - Sep lastMon 2:00 0 - Rule Palestine 2009 max - Sep Fri>=1 2:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL] # Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Gaza 2:17:52 - LMT 1900 Oct Zone Asia/Gaza 2:17:52 - LMT 1900 Oct
@ -2154,9 +2329,23 @@ Rule Syria 2007 only - Nov Fri>=1 0:00 0 -
# http://www.timeanddate.com/news/time/syria-dst-starts-march-27-2009.html # http://www.timeanddate.com/news/time/syria-dst-starts-march-27-2009.html
# </a> # </a>
# From Steffen Thorsen (2009-10-27):
# The Syrian Arab News Network on 2009-09-29 reported that Syria will
# revert back to winter (standard) time on midnight between Thursday
# 2009-10-29 and Friday 2009-10-30:
# <a href="http://www.sana.sy/ara/2/2009/09/29/247012.htm">
# http://www.sana.sy/ara/2/2009/09/29/247012.htm (Arabic)
# </a>
# From Arthur David Olson (2009-10-28):
# We'll see if future DST switching times turn out to be end of the last
# Thursday of the month or the start of the last Friday of the month or
# something else. For now, use the start of the last Friday.
Rule Syria 2008 only - Apr Fri>=1 0:00 1:00 S Rule Syria 2008 only - Apr Fri>=1 0:00 1:00 S
Rule Syria 2008 max - Nov 1 0:00 0 - Rule Syria 2008 only - Nov 1 0:00 0 -
Rule Syria 2009 max - Mar lastFri 0:00 1:00 S Rule Syria 2009 max - Mar lastFri 0:00 1:00 S
Rule Syria 2009 max - Oct lastFri 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL] # Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Damascus 2:25:12 - LMT 1920 # Dimashq Zone Asia/Damascus 2:25:12 - LMT 1920 # Dimashq

View File

@ -465,10 +465,56 @@ Zone Pacific/Pago_Pago 12:37:12 - LMT 1879 Jul 5
# http://www.worldtimezone.com/dst_news/dst_news_samoa01.html # http://www.worldtimezone.com/dst_news/dst_news_samoa01.html
# </a> # </a>
# From Steffen Thorsen (2009-08-27):
# Samoa's parliament passed the Daylight Saving Bill 2009, and will start
# daylight saving time on the first Sunday of October 2009 and end on the
# last Sunday of March 2010. We hope that the full text will be published
# soon, but we believe that the bill is only valid for 2009-2010. Samoa's
# Daylight Saving Act 2009 will be enforced as soon as the Head of State
# executes a proclamation publicizing this Act.
#
# Some background information here, which will be updated once we have
# more details:
# <a href="http://www.timeanddate.com/news/time/samoa-dst-plan-2009.html">
# http://www.timeanddate.com/news/time/samoa-dst-plan-2009.html
# </a>
# From Alexander Krivenyshev (2009-10-03):
# First, my deepest condolences to people of Samoa islands and all families and
# loved ones around the world who lost their lives in the earthquake and tsunami.
#
# Considering the recent devastation on Samoa by earthquake and tsunami and that
# many government offices/ ministers are closed- not sure if "Daylight Saving
# Bill 2009" will be implemented in next few days- on October 4, 2009.
#
# Here is reply from Consulate-General of Samoa in New Zealand
# ---------------------------
# Consul General
# consulgeneral@samoaconsulate.org.nz
#
# Talofa Alexander,
#
# Thank you for your sympathy for our country but at this time we have not
# been informed about the Daylight Savings Time Change. Most Ministries in
# Apia are closed or relocating due to weather concerns.
#
# When we do find out if they are still proceeding with the time change we
# will advise you soonest.
#
# Kind Regards,
# Lana
# for: Consul General
# From Steffen Thorsen (2009-10-05):
# We have called a hotel in Samoa and asked about local time there - they
# are still on standard time.
Zone Pacific/Apia 12:33:04 - LMT 1879 Jul 5 Zone Pacific/Apia 12:33:04 - LMT 1879 Jul 5
-11:26:56 - LMT 1911 -11:26:56 - LMT 1911
-11:30 - SAMT 1950 # Samoa Time -11:30 - SAMT 1950 # Samoa Time
-11:00 - WST # Samoa Time -11:00 - WST 2009 Oct 4
-11:00 1:00 WSDT 2010 Mar 28
-11:00 - WST
# Solomon Is # Solomon Is
# excludes Bougainville, for which see Papua New Guinea # excludes Bougainville, for which see Papua New Guinea

View File

@ -2094,9 +2094,43 @@ Zone Asia/Novosibirsk 5:31:40 - LMT 1919 Dec 14 6:00
6:00 Russia NOV%sT 1992 Jan 19 2:00s 6:00 Russia NOV%sT 1992 Jan 19 2:00s
7:00 Russia NOV%sT 1993 May 23 # say Shanks & P. 7:00 Russia NOV%sT 1993 May 23 # say Shanks & P.
6:00 Russia NOV%sT 6:00 Russia NOV%sT
# From Alexander Krivenyshev (2009-10-13):
# Kemerovo oblast' (Kemerovo region) in Russia will change current time zone on
# March 28, 2010:
# from current Russia Zone 6 - Krasnoyarsk Time Zone (KRA) UTC +0700
# to Russia Zone 5 - Novosibirsk Time Zone (NOV) UTC +0600
#
# This is according to Government of Russia decree # 740, on September
# 14, 2009 "Application in the territory of the Kemerovo region the Fifth
# time zone." ("Russia Zone 5" or old "USSR Zone 5" is GMT +0600)
#
# Russian Government web site (Russian language)
# <a href="http://www.government.ru/content/governmentactivity/rfgovernmentdecisions/archiv">
# http://www.government.ru/content/governmentactivity/rfgovernmentdecisions/archive/2009/09/14/991633.htm
# </a>
# or Russian-English translation by WorldTimeZone.com with reference
# map to local region and new Russia Time Zone map after March 28, 2010
# <a href="http://www.worldtimezone.com/dst_news/dst_news_russia03.html">
# http://www.worldtimezone.com/dst_news/dst_news_russia03.html
# </a>
#
# Thus, when Russia will switch to DST on the night of March 28, 2010
# Kemerovo region (Kemerovo oblast') will not change the clock.
#
# As a result, Kemerovo oblast' will be in the same time zone as
# Novosibirsk, Omsk, Tomsk, Barnaul and Altai Republic.
Zone Asia/Novokuznetsk 5:48:48 - NMT 1920 Jan 6
6:00 - KRAT 1930 Jun 21 # Krasnoyarsk Time
7:00 Russia KRA%sT 1991 Mar 31 2:00s
6:00 Russia KRA%sT 1992 Jan 19 2:00s
7:00 Russia KRA%sT 2010 Mar 28 2:00s
6:00 Russia NOV%sT # Novosibirsk/Novokuznetsk Time
# #
# From Oscar van Vlijmen (2001-08-25): [This region consists of] # From Oscar van Vlijmen (2001-08-25): [This region consists of]
# Kemerovskaya oblast', Krasnoyarskij kraj, # Krasnoyarskij kraj,
# Tajmyrskij (Dolgano-Nenetskij) avtonomnyj okrug, # Tajmyrskij (Dolgano-Nenetskij) avtonomnyj okrug,
# Respublika Tuva, Respublika Khakasiya, Evenkijskij avtonomnyj okrug. # Respublika Tuva, Respublika Khakasiya, Evenkijskij avtonomnyj okrug.
Zone Asia/Krasnoyarsk 6:11:20 - LMT 1920 Jan 6 Zone Asia/Krasnoyarsk 6:11:20 - LMT 1920 Jan 6

View File

@ -237,9 +237,23 @@ Rule Arg 2000 only - Mar 3 0:00 0 -
# http://www.jujuy.gov.ar/index2/partes_prensa/18_10_08/235-181008.doc # http://www.jujuy.gov.ar/index2/partes_prensa/18_10_08/235-181008.doc
# </a> # </a>
# From fullinet (2009-10-18):
# As announced in
# <a hef="http://www.argentina.gob.ar/argentina/portal/paginas.dhtml?pagina=356">
# http://www.argentina.gob.ar/argentina/portal/paginas.dhtml?pagina=356
# </a>
# (an official .gob.ar) under title: "Sin Cambio de Hora" (english: "No hour change")
#
# "Por el momento, el Gobierno Nacional resolvio no modificar la hora
# oficial, decision que estaba en estudio para su implementacion el
# domingo 18 de octubre. Desde el Ministerio de Planificacion se anuncio
# que la Argentina hoy, en estas condiciones meteorologicas, no necesita
# la modificacion del huso horario, ya que 2009 nos encuentra con
# crecimiento en la produccion y distribucion energetica."
Rule Arg 2007 only - Dec 30 0:00 1:00 S Rule Arg 2007 only - Dec 30 0:00 1:00 S
Rule Arg 2008 max - Mar Sun>=15 0:00 0 - Rule Arg 2008 2009 - Mar Sun>=15 0:00 0 -
Rule Arg 2008 max - Oct Sun>=15 0:00 1:00 S Rule Arg 2008 only - Oct Sun>=15 0:00 1:00 S
# From Mariano Absatz (2004-05-21): # From Mariano Absatz (2004-05-21):
# Today it was officially published that the Province of Mendoza is changing # Today it was officially published that the Province of Mendoza is changing
@ -411,15 +425,40 @@ Rule Arg 2008 max - Oct Sun>=15 0:00 1:00 S
# during 2009, this timezone change will run from 00:00 the third Sunday # during 2009, this timezone change will run from 00:00 the third Sunday
# in March until 24:00 of the second Saturday in October. # in March until 24:00 of the second Saturday in October.
# From Arthur David Olson (2009-03-16): # From Mariano Absatz (2009-10-16):
# The unofficial claim at # ...the Province of San Luis is a case in itself.
# <a href="http://www.timeanddate.com/news/time/san-luis-new-time-zone.html">
# http://www.timeanddate.com/news/time/san-luis-new-time-zone.html
# </a>
# is that "The province will most likely follow the next daylight saving schedule,
# which is planned for the second Sunday in October."
# #
# The Law at
# <a href="http://www.diputadossanluis.gov.ar/diputadosasp/paginas/verNorma.asp?NormaID=276>"
# http://www.diputadossanluis.gov.ar/diputadosasp/paginas/verNorma.asp?NormaID=276
# </a>
# is ambiguous because establishes a calendar from the 2nd Sunday in
# October at 0:00 thru the 2nd Saturday in March at 24:00 and the
# complement of that starting on the 2nd Sunday of March at 0:00 and
# ending on the 2nd Saturday of March at 24:00.
#
# This clearly breaks every time the 1st of March or October is a Sunday.
#
# IMHO, the "spirit of the Law" is to make the changes at 0:00 on the 2nd
# Sunday of October and March.
#
# The problem is that the changes in the rest of the Provinces that did
# change in 2007/2008, were made according to the Federal Law and Decrees
# that did so on the 3rd Sunday of October and March.
#
# In fact, San Luis actually switched from UTC-4 to UTC-3 last Sunday
# (October 11th) at 0:00.
#
# So I guess a new set of rules, besides "Arg", must be made and the last
# America/Argentina/San_Luis entries should change to use these...
#
# I'm enclosing a patch that does what I say... regretfully, the San Luis
# timezone must be called "WART/WARST" even when most of the time (like,
# right now) WARST == ART... that is, since last Sunday, all the country
# is using UTC-3, but in my patch, San Luis calls it "WARST" and the rest
# of the country calls it "ART".
# ...
# Zone NAME GMTOFF RULES FORMAT [UNTIL] # Zone NAME GMTOFF RULES FORMAT [UNTIL]
# #
# Buenos Aires (BA), Capital Federal (CF), # Buenos Aires (BA), Capital Federal (CF),
@ -552,6 +591,10 @@ Zone America/Argentina/Mendoza -4:35:16 - LMT 1894 Oct 31
-3:00 - ART -3:00 - ART
# #
# San Luis (SL) # San Luis (SL)
Rule SanLuis 2008 max - Mar Sun>=8 0:00 0 -
Rule SanLuis 2007 max - Oct Sun>=8 0:00 1:00 S
Zone America/Argentina/San_Luis -4:25:24 - LMT 1894 Oct 31 Zone America/Argentina/San_Luis -4:25:24 - LMT 1894 Oct 31
-4:16:48 - CMT 1920 May -4:16:48 - CMT 1920 May
-4:00 - ART 1930 Dec -4:00 - ART 1930 Dec
@ -566,8 +609,7 @@ Zone America/Argentina/San_Luis -4:25:24 - LMT 1894 Oct 31
-3:00 - ART 2004 May 31 -3:00 - ART 2004 May 31
-4:00 - WART 2004 Jul 25 -4:00 - WART 2004 Jul 25
-3:00 Arg AR%sT 2008 Jan 21 -3:00 Arg AR%sT 2008 Jan 21
-3:00 - ART 2009 Mar 15 -4:00 SanLuis WAR%sT
-4:00 Arg WAR%sT
# #
# Santa Cruz (SC) # Santa Cruz (SC)
Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31 Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31

View File

@ -352,6 +352,7 @@ RU +5312+05009 Europe/Samara Moscow+01 - Samara, Udmurtia
RU +5651+06036 Asia/Yekaterinburg Moscow+02 - Urals RU +5651+06036 Asia/Yekaterinburg Moscow+02 - Urals
RU +5500+07324 Asia/Omsk Moscow+03 - west Siberia RU +5500+07324 Asia/Omsk Moscow+03 - west Siberia
RU +5502+08255 Asia/Novosibirsk Moscow+03 - Novosibirsk RU +5502+08255 Asia/Novosibirsk Moscow+03 - Novosibirsk
RU +5345+08707 Asia/Novokuznetsk Moscow+03 - Novokuznetsk
RU +5601+09250 Asia/Krasnoyarsk Moscow+04 - Yenisei River RU +5601+09250 Asia/Krasnoyarsk Moscow+04 - Yenisei River
RU +5216+10420 Asia/Irkutsk Moscow+05 - Lake Baikal RU +5216+10420 Asia/Irkutsk Moscow+05 - Lake Baikal
RU +6200+12940 Asia/Yakutsk Moscow+06 - Lena River RU +6200+12940 Asia/Yakutsk Moscow+06 - Lena River

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1995-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -41,15 +41,13 @@
* options are turned into "-foo" options to the vm. This option * options are turned into "-foo" options to the vm. This option
* filtering is handled in a number of places in the launcher, some of * filtering is handled in a number of places in the launcher, some of
* it in machine-dependent code. In this file, the function * it in machine-dependent code. In this file, the function
* CheckJVMType removes vm style options and TranslateApplicationArgs * CheckJvmType removes vm style options and TranslateApplicationArgs
* removes "-J" prefixes. On unix platforms, the * removes "-J" prefixes. The CreateExecutionEnvironment function processes
* CreateExecutionEnvironment function from the unix java_md.c file * and removes -d<n> options. On unix, there is a possibility that the running
* processes and removes -d<n> options. However, in case * data model may not match to the desired data model, in this case an exec is
* CreateExecutionEnvironment does not need to exec because * required to start the desired model. If the data models match, then
* LD_LIBRARY_PATH is set acceptably and the data model does not need * ParseArguments will remove the -d<n> flags. If the data models do not match
* to be changed, ParseArguments will screen out the redundant -d<n> * the CreateExecutionEnviroment will remove the -d<n> flags.
* options and prevent them from being passed to the vm; this is done
* by RemovableOption.
*/ */
@ -1891,11 +1889,11 @@ DumpState()
* Return JNI_TRUE for an option string that has no effect but should * Return JNI_TRUE for an option string that has no effect but should
* _not_ be passed on to the vm; return JNI_FALSE otherwise. On * _not_ be passed on to the vm; return JNI_FALSE otherwise. On
* Solaris SPARC, this screening needs to be done if: * Solaris SPARC, this screening needs to be done if:
* 1) LD_LIBRARY_PATH does _not_ need to be reset and * -d32 or -d64 is passed to a binary with an unmatched data model
* 2) -d32 or -d64 is passed to a binary with a matching data model * (the exec in CreateExecutionEnvironment removes -d<n> options and points the
* (the exec in SetLibraryPath removes -d<n> options and points the * exec to the proper binary). In the case of when the data model and the
* exec to the proper binary). When this exec is not done, these options * requested version is matched, an exec would not occur, and these options
* would end up getting passed onto the vm. * were erroneously passed to the vm.
*/ */
jboolean jboolean
RemovableOption(char * option) RemovableOption(char * option)

View File

@ -99,4 +99,58 @@ public interface ExtendedGSSContext extends GSSContext {
*/ */
public Object inquireSecContext(InquireType type) public Object inquireSecContext(InquireType type)
throws GSSException; throws GSSException;
/**
* Requests that the delegation policy be respected. When a true value is
* requested, the underlying context would use the delegation policy
* defined by the environment as a hint to determine whether credentials
* delegation should be performed. This request can only be made on the
* context initiator's side and it has to be done prior to the first
* call to <code>initSecContext</code>.
* <p>
* When this flag is false, delegation will only be tried when the
* {@link GSSContext#requestCredDeleg(boolean) credentials delegation flag}
* is true.
* <p>
* When this flag is true but the
* {@link GSSContext#requestCredDeleg(boolean) credentials delegation flag}
* is false, delegation will be only tried if the delegation policy permits
* delegation.
* <p>
* When both this flag and the
* {@link GSSContext#requestCredDeleg(boolean) credentials delegation flag}
* are true, delegation will be always tried. However, if the delegation
* policy does not permit delegation, the value of
* {@link #getDelegPolicyState} will be false, even
* if delegation is performed successfully.
* <p>
* In any case, if the delegation is not successful, the value returned
* by {@link GSSContext#getCredDelegState()} is false, and the value
* returned by {@link #getDelegPolicyState()} is also false.
* <p>
* Not all mechanisms support delegation policy. Therefore, the
* application should check to see if the request was honored with the
* {@link #getDelegPolicyState() getDelegPolicyState} method. When
* delegation policy is not supported, <code>requestDelegPolicy</code>
* should return silently without throwing an exception.
* <p>
* Note: for the Kerberos 5 mechanism, the delegation policy is expressed
* through the OK-AS-DELEGATE flag in the service ticket. When it's true,
* the KDC permits delegation to the target server. In a cross-realm
* environment, in order for delegation be permitted, all cross-realm TGTs
* on the authentication path must also have the OK-AS-DELAGATE flags set.
* @param state true if the policy should be respected
* @throws GSSException containing the following
* major error codes:
* {@link GSSException#FAILURE GSSException.FAILURE}
*/
public void requestDelegPolicy(boolean state) throws GSSException;
/**
* Returns the delegation policy response. Called after a security context
* is established. This method can be only called on the initiator's side.
* See {@link ExtendedGSSContext#requestDelegPolicy}.
* @return the delegation policy response
*/
public boolean getDelegPolicyState();
} }

View File

@ -229,6 +229,21 @@ public class Applet extends Panel {
resize(d.width, d.height); resize(d.width, d.height);
} }
/**
* Indicates if this container is a validate root.
* <p>
* {@code Applet} objects are the validate roots, and, therefore, they
* override this method to return {@code true}.
*
* @return {@code true}
* @since 1.7
* @see java.awt.Container#isValidateRoot
*/
@Override
public boolean isValidateRoot() {
return true;
}
/** /**
* Requests that the argument string be displayed in the * Requests that the argument string be displayed in the
* "status window". Many browsers and applet viewers * "status window". Many browsers and applet viewers

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 1997-2005 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -92,7 +92,15 @@ import java.security.BasicPermission;
* <td>Enter full-screen exclusive mode</td> * <td>Enter full-screen exclusive mode</td>
* <td>Entering full-screen exclusive mode allows direct access to * <td>Entering full-screen exclusive mode allows direct access to
* low-level graphics card memory. This could be used to spoof the * low-level graphics card memory. This could be used to spoof the
* system, since the program is in direct control of rendering.</td> * system, since the program is in direct control of rendering. Depending on
* the implementation, the security warning may not be shown for the windows
* used to enter the full-screen exclusive mode (assuming that the {@code
* fullScreenExclusive} permission has been granted to this application). Note
* that this behavior does not mean that the {@code
* showWindowWithoutWarningBanner} permission will be automatically granted to
* the application which has the {@code fullScreenExclusive} permission:
* non-full-screen windows will continue to be shown with the security
* warning.</td>
* </tr> * </tr>
* *
* <tr> * <tr>

View File

@ -2764,8 +2764,11 @@ public abstract class Component implements ImageObserver, MenuContainer,
} }
/** /**
* Ensures that this component has a valid layout. This method is * Validates this component.
* primarily intended to operate on instances of <code>Container</code>. * <p>
* The meaning of the term <i>validating</i> is defined by the ancestors of
* this class. See {@link Container#validate} for more details.
*
* @see #invalidate * @see #invalidate
* @see #doLayout() * @see #doLayout()
* @see LayoutManager * @see LayoutManager
@ -2794,12 +2797,24 @@ public abstract class Component implements ImageObserver, MenuContainer,
} }
/** /**
* Invalidates this component. This component and all parents * Invalidates this component and its ancestors.
* above it are marked as needing to be laid out. This method can * <p>
* be called often, so it needs to execute quickly. * All the ancestors of this component up to the nearest validate root are
* marked invalid also. If there is no a validate root container for this
* component, all of its ancestors up to the root of the hierarchy are
* marked invalid as well. Marking a container <i>invalid</i> indicates
* that the container needs to be laid out.
* <p>
* This method is called automatically when any layout-related information
* changes (e.g. setting the bounds of the component, or adding the
* component to a container).
* <p>
* This method might be called often, so it should work fast.
*
* @see #validate * @see #validate
* @see #doLayout * @see #doLayout
* @see LayoutManager * @see LayoutManager
* @see java.awt.Container#isValidateRoot
* @since JDK1.0 * @since JDK1.0
*/ */
public void invalidate() { public void invalidate() {
@ -2818,9 +2833,18 @@ public abstract class Component implements ImageObserver, MenuContainer,
if (!isMaximumSizeSet()) { if (!isMaximumSizeSet()) {
maxSize = null; maxSize = null;
} }
if (parent != null) { invalidateParent();
parent.invalidateIfValid(); }
} }
/**
* Invalidates the parent of this component if any.
*
* This method MUST BE invoked under the TreeLock.
*/
void invalidateParent() {
if (parent != null) {
parent.invalidateIfValid();
} }
} }
@ -6727,12 +6751,13 @@ public abstract class Component implements ImageObserver, MenuContainer,
} }
} }
} else { } else {
// It's native. If the parent is lightweight it // It's native. If the parent is lightweight it will need some
// will need some help. // help.
Container parent = this.parent; Container parent = getContainer();
if (parent != null && parent.peer instanceof LightweightPeer) { if (parent != null && parent.isLightweight()) {
relocateComponent(); relocateComponent();
if (!isRecursivelyVisible()) { if (!parent.isRecursivelyVisibleUpToHeavyweightContainer())
{
peer.setVisible(false); peer.setVisible(false);
} }
} }

View File

@ -1492,20 +1492,59 @@ public class Container extends Component {
} }
/** /**
* Invalidates the container. The container and all parents * Indicates if this container is a <i>validate root</i>.
* above it are marked as needing to be laid out. This method can * <p>
* be called often, so it needs to execute quickly. * Layout-related changes, such as bounds of the validate root descendants,
* do not affect the layout of the validate root parent. This peculiarity
* enables the {@code invalidate()} method to stop invalidating the
* component hierarchy when the method encounters a validate root.
* <p>
* If a component hierarchy contains validate roots, the {@code validate()}
* method must be invoked on the validate root of a previously invalidated
* component, rather than on the top-level container (such as a {@code
* Frame} object) to restore the validity of the hierarchy later.
* <p>
* The {@code Window} class and the {@code Applet} class are the validate
* roots in AWT. Swing introduces more validate roots.
* *
* <p> If the {@code LayoutManager} installed on this container is * @return whether this container is a validate root
* an instance of {@code LayoutManager2}, then * @see #invalidate
* {@link LayoutManager2#invalidateLayout(Container)} is invoked on * @see java.awt.Component#invalidate
* it supplying this {@code Container} as the argument. * @see javax.swing.JComponent#isValidateRoot
* @see javax.swing.JComponent#revalidate
* @since 1.7
*/
public boolean isValidateRoot() {
return false;
}
/**
* Invalidates the parent of the container unless the container
* is a validate root.
*/
@Override
void invalidateParent() {
if (!isValidateRoot()) {
super.invalidateParent();
}
}
/**
* Invalidates the container.
* <p>
* If the {@code LayoutManager} installed on this container is an instance
* of the {@code LayoutManager2} interface, then
* the {@link LayoutManager2#invalidateLayout(Container)} method is invoked
* on it supplying this {@code Container} as the argument.
* <p>
* Afterwards this method marks this container invalid, and invalidates its
* ancestors. See the {@link Component#invalidate} method for more details.
* *
* @see #validate * @see #validate
* @see #layout * @see #layout
* @see LayoutManager * @see LayoutManager2
* @see LayoutManager2#invalidateLayout(Container)
*/ */
@Override
public void invalidate() { public void invalidate() {
LayoutManager layoutMgr = this.layoutMgr; LayoutManager layoutMgr = this.layoutMgr;
if (layoutMgr instanceof LayoutManager2) { if (layoutMgr instanceof LayoutManager2) {
@ -1518,52 +1557,90 @@ public class Container extends Component {
/** /**
* Validates this container and all of its subcomponents. * Validates this container and all of its subcomponents.
* <p> * <p>
* The <code>validate</code> method is used to cause a container * Validating a container means laying out its subcomponents.
* to lay out its subcomponents again. It should be invoked when * Layout-related changes, such as setting the bounds of a component, or
* this container's subcomponents are modified (added to or * adding a component to the container, invalidate the container
* removed from the container, or layout-related information * automatically. Note that the ancestors of the container may be
* changed) after the container has been displayed. * invalidated also (see {@link Component#invalidate} for details.)
* * Therefore, to restore the validity of the hierarchy, the {@code
* <p>If this {@code Container} is not valid, this method invokes * validate()} method should be invoked on a validate root of an
* invalidated component, or on the top-most container if the hierarchy
* does not contain validate roots.
* <p>
* Validating the container may be a quite time-consuming operation. For
* performance reasons a developer may postpone the validation of the
* hierarchy till a set of layout-related operations completes, e.g. after
* adding all the children to the container.
* <p>
* If this {@code Container} is not valid, this method invokes
* the {@code validateTree} method and marks this {@code Container} * the {@code validateTree} method and marks this {@code Container}
* as valid. Otherwise, no action is performed. * as valid. Otherwise, no action is performed.
* <p>
* Note that the {@code invalidate()} method may invalidate not only the
* component it is called upon, but also the parents of the component.
* Therefore, to restore the validity of the hierarchy, the {@code
* validate()} method must be invoked on the top-most invalid container of
* the hierarchy. For performance reasons a developer may postpone the
* validation of the hierarchy till a bunch of layout-related operations
* completes, e.g. after adding all the children to the container.
* *
* @see #add(java.awt.Component) * @see #add(java.awt.Component)
* @see #invalidate * @see #invalidate
* @see Container#isValidateRoot
* @see javax.swing.JComponent#revalidate() * @see javax.swing.JComponent#revalidate()
* @see #validateTree * @see #validateTree
*/ */
public void validate() { public void validate() {
/* Avoid grabbing lock unless really necessary. */ boolean updateCur = false;
if (!isValid()) { synchronized (getTreeLock()) {
boolean updateCur = false; if ((!isValid() || descendUnconditionallyWhenValidating)
synchronized (getTreeLock()) { && peer != null)
if (!isValid() && peer != null) { {
ContainerPeer p = null; ContainerPeer p = null;
if (peer instanceof ContainerPeer) { if (peer instanceof ContainerPeer) {
p = (ContainerPeer) peer; p = (ContainerPeer) peer;
} }
if (p != null) { if (p != null) {
p.beginValidate(); p.beginValidate();
} }
validateTree(); validateTree();
if (p != null) { if (p != null) {
p.endValidate(); p.endValidate();
// Avoid updating cursor if this is an internal call.
// See validateUnconditionally() for details.
if (!descendUnconditionallyWhenValidating) {
updateCur = isVisible(); updateCur = isVisible();
} }
} }
} }
if (updateCur) { }
updateCursorImmediately(); if (updateCur) {
updateCursorImmediately();
}
}
/**
* Indicates whether valid containers should also traverse their
* children and call the validateTree() method on them.
*
* Synchronization: TreeLock.
*
* The field is allowed to be static as long as the TreeLock itself is
* static.
*
* @see #validateUnconditionally()
*/
private static boolean descendUnconditionallyWhenValidating = false;
/**
* Unconditionally validate the component hierarchy.
*/
final void validateUnconditionally() {
boolean updateCur = false;
synchronized (getTreeLock()) {
descendUnconditionallyWhenValidating = true;
validate();
if (peer instanceof ContainerPeer) {
updateCur = isVisible();
} }
descendUnconditionallyWhenValidating = false;
}
if (updateCur) {
updateCursorImmediately();
} }
} }
@ -1578,16 +1655,20 @@ public class Container extends Component {
*/ */
protected void validateTree() { protected void validateTree() {
checkTreeLock(); checkTreeLock();
if (!isValid()) { if (!isValid() || descendUnconditionallyWhenValidating) {
if (peer instanceof ContainerPeer) { if (peer instanceof ContainerPeer) {
((ContainerPeer)peer).beginLayout(); ((ContainerPeer)peer).beginLayout();
} }
doLayout(); if (!isValid()) {
doLayout();
}
for (int i = 0; i < component.size(); i++) { for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i); Component comp = component.get(i);
if ( (comp instanceof Container) if ( (comp instanceof Container)
&& !(comp instanceof Window) && !(comp instanceof Window)
&& !comp.isValid()) { && (!comp.isValid() ||
descendUnconditionallyWhenValidating))
{
((Container)comp).validateTree(); ((Container)comp).validateTree();
} else { } else {
comp.validate(); comp.validate();
@ -4092,16 +4173,29 @@ public class Container extends Component {
} }
} }
/* /**
* Checks if the container and its direct lightweight containers are
* visible.
*
* Consider the heavyweight container hides or shows the HW descendants * Consider the heavyweight container hides or shows the HW descendants
* automatically. Therefore we care of LW containers' visibility only. * automatically. Therefore we care of LW containers' visibility only.
*
* This method MUST be invoked under the TreeLock.
*/ */
private boolean isRecursivelyVisibleUpToHeavyweightContainer() { final boolean isRecursivelyVisibleUpToHeavyweightContainer() {
if (!isLightweight()) { if (!isLightweight()) {
return true; return true;
} }
return isVisible() && (getContainer() == null ||
getContainer().isRecursivelyVisibleUpToHeavyweightContainer()); for (Container cont = getContainer();
cont != null && cont.isLightweight();
cont = cont.getContainer())
{
if (!cont.isVisible()) {
return false;
}
}
return true;
} }
@Override @Override

View File

@ -1027,7 +1027,9 @@ public class EventQueue {
synchronized (lock) { synchronized (lock) {
Toolkit.getEventQueue().postEvent(event); Toolkit.getEventQueue().postEvent(event);
lock.wait(); while (!event.isDispatched()) {
lock.wait();
}
} }
Throwable eventThrowable = event.getThrowable(); Throwable eventThrowable = event.getThrowable();

View File

@ -845,8 +845,11 @@ public class Frame extends Window implements MenuContainer {
* others by setting those fields you want to accept from system * others by setting those fields you want to accept from system
* to <code>Integer.MAX_VALUE</code>. * to <code>Integer.MAX_VALUE</code>.
* <p> * <p>
* On some systems only the size portion of the bounds is taken * Note, the given maximized bounds are used as a hint for the native
* into account. * system, because the underlying platform may not support setting the
* location and/or size of the maximized windows. If that is the case, the
* provided values do not affect the appearance of the frame in the
* maximized state.
* *
* @param bounds bounds for the maximized state * @param bounds bounds for the maximized state
* @see #getMaximizedBounds() * @see #getMaximizedBounds()

View File

@ -767,7 +767,7 @@ public class Window extends Container implements Accessible {
isPacked = true; isPacked = true;
} }
validate(); validateUnconditionally();
} }
/** /**
@ -943,7 +943,7 @@ public class Window extends Container implements Accessible {
if (peer == null) { if (peer == null) {
addNotify(); addNotify();
} }
validate(); validateUnconditionally();
isInShow = true; isInShow = true;
if (visible) { if (visible) {
@ -2599,6 +2599,21 @@ public class Window extends Container implements Accessible {
super.addPropertyChangeListener(propertyName, listener); super.addPropertyChangeListener(propertyName, listener);
} }
/**
* Indicates if this container is a validate root.
* <p>
* {@code Window} objects are the validate roots, and, therefore, they
* override this method to return {@code true}.
*
* @return {@code true}
* @since 1.7
* @see java.awt.Container#isValidateRoot
*/
@Override
public boolean isValidateRoot() {
return true;
}
/** /**
* Dispatches an event to this window or one of its sub components. * Dispatches an event to this window or one of its sub components.
* @param e the event * @param e the event

View File

@ -1184,7 +1184,7 @@ public class DataFlavor implements Externalizable, Cloneable {
*/ */
public boolean isRepresentationClassRemote() { public boolean isRepresentationClassRemote() {
return java.rmi.Remote.class.isAssignableFrom(representationClass); return DataTransferer.isRemote(representationClass);
} }
/** /**

View File

@ -78,10 +78,21 @@ public class InvocationEvent extends AWTEvent implements ActiveEvent {
/** /**
* The (potentially null) Object whose notifyAll() method will be called * The (potentially null) Object whose notifyAll() method will be called
* immediately after the Runnable.run() method returns. * immediately after the Runnable.run() method has returned or thrown an exception.
*
* @see #isDispatched
*/ */
protected Object notifier; protected Object notifier;
/**
* Indicates whether the <code>run()</code> method of the <code>runnable</code>
* was executed or not.
*
* @see #isDispatched
* @since 1.7
*/
private volatile boolean dispatched = false;
/** /**
* Set to true if dispatch() catches Throwable and stores it in the * Set to true if dispatch() catches Throwable and stores it in the
* exception instance variable. If false, Throwables are propagated up * exception instance variable. If false, Throwables are propagated up
@ -144,7 +155,7 @@ public class InvocationEvent extends AWTEvent implements ActiveEvent {
* source which will execute the runnable's <code>run</code> * source which will execute the runnable's <code>run</code>
* method when dispatched. If notifier is non-<code>null</code>, * method when dispatched. If notifier is non-<code>null</code>,
* <code>notifyAll()</code> will be called on it * <code>notifyAll()</code> will be called on it
* immediately after <code>run</code> returns. * immediately after <code>run</code> has returned or thrown an exception.
* <p>An invocation of the form <tt>InvocationEvent(source, * <p>An invocation of the form <tt>InvocationEvent(source,
* runnable, notifier, catchThrowables)</tt> * runnable, notifier, catchThrowables)</tt>
* behaves in exactly the same way as the invocation of * behaves in exactly the same way as the invocation of
@ -159,7 +170,8 @@ public class InvocationEvent extends AWTEvent implements ActiveEvent {
* executed * executed
* @param notifier The {@code Object} whose <code>notifyAll</code> * @param notifier The {@code Object} whose <code>notifyAll</code>
* method will be called after * method will be called after
* <code>Runnable.run</code> has returned * <code>Runnable.run</code> has returned or
* thrown an exception
* @param catchThrowables Specifies whether <code>dispatch</code> * @param catchThrowables Specifies whether <code>dispatch</code>
* should catch Throwable when executing * should catch Throwable when executing
* the <code>Runnable</code>'s <code>run</code> * the <code>Runnable</code>'s <code>run</code>
@ -180,8 +192,8 @@ public class InvocationEvent extends AWTEvent implements ActiveEvent {
* Constructs an <code>InvocationEvent</code> with the specified * Constructs an <code>InvocationEvent</code> with the specified
* source and ID which will execute the runnable's <code>run</code> * source and ID which will execute the runnable's <code>run</code>
* method when dispatched. If notifier is non-<code>null</code>, * method when dispatched. If notifier is non-<code>null</code>,
* <code>notifyAll</code> will be called on it * <code>notifyAll</code> will be called on it immediately after
* immediately after <code>run</code> returns. * <code>run</code> has returned or thrown an exception.
* <p>This method throws an * <p>This method throws an
* <code>IllegalArgumentException</code> if <code>source</code> * <code>IllegalArgumentException</code> if <code>source</code>
* is <code>null</code>. * is <code>null</code>.
@ -195,7 +207,8 @@ public class InvocationEvent extends AWTEvent implements ActiveEvent {
* <code>run</code> method will be executed * <code>run</code> method will be executed
* @param notifier The <code>Object</code> whose <code>notifyAll</code> * @param notifier The <code>Object</code> whose <code>notifyAll</code>
* method will be called after * method will be called after
* <code>Runnable.run</code> has returned * <code>Runnable.run</code> has returned or
* thrown an exception
* @param catchThrowables Specifies whether <code>dispatch</code> * @param catchThrowables Specifies whether <code>dispatch</code>
* should catch Throwable when executing the * should catch Throwable when executing the
* <code>Runnable</code>'s <code>run</code> * <code>Runnable</code>'s <code>run</code>
@ -217,27 +230,33 @@ public class InvocationEvent extends AWTEvent implements ActiveEvent {
/** /**
* Executes the Runnable's <code>run()</code> method and notifies the * Executes the Runnable's <code>run()</code> method and notifies the
* notifier (if any) when <code>run()</code> returns. * notifier (if any) when <code>run()</code> has returned or thrown an exception.
*
* @see #isDispatched
*/ */
public void dispatch() { public void dispatch() {
if (catchExceptions) { try {
try { if (catchExceptions) {
try {
runnable.run();
}
catch (Throwable t) {
if (t instanceof Exception) {
exception = (Exception) t;
}
throwable = t;
}
}
else {
runnable.run(); runnable.run();
} }
catch (Throwable t) { } finally {
if (t instanceof Exception) { dispatched = true;
exception = (Exception) t;
}
throwable = t;
}
}
else {
runnable.run();
}
if (notifier != null) { if (notifier != null) {
synchronized (notifier) { synchronized (notifier) {
notifier.notifyAll(); notifier.notifyAll();
}
} }
} }
} }
@ -277,6 +296,40 @@ public class InvocationEvent extends AWTEvent implements ActiveEvent {
return when; return when;
} }
/**
* Returns {@code true} if the event is dispatched or any exception is
* thrown while dispatching, {@code false} otherwise. The method should
* be called by a waiting thread that calls the {@code notifier.wait()} method.
* Since spurious wakeups are possible (as explained in {@link Object#wait()}),
* this method should be used in a waiting loop to ensure that the event
* got dispatched:
* <pre>
* while (!event.isDispatched()) {
* notifier.wait();
* }
* </pre>
* If the waiting thread wakes up without dispatching the event,
* the {@code isDispatched()} method returns {@code false}, and
* the {@code while} loop executes once more, thus, causing
* the awakened thread to revert to the waiting mode.
* <p>
* If the {@code notifier.notifyAll()} happens before the waiting thread
* enters the {@code notifier.wait()} method, the {@code while} loop ensures
* that the waiting thread will not enter the {@code notifier.wait()} method.
* Otherwise, there is no guarantee that the waiting thread will ever be woken
* from the wait.
*
* @return {@code true} if the event has been dispatched, or any exception
* has been thrown while dispatching, {@code false} otherwise
* @see #dispatch
* @see #notifier
* @see #catchExceptions
* @since 1.7
*/
public boolean isDispatched() {
return dispatched;
}
/** /**
* Returns a parameter string identifying this event. * Returns a parameter string identifying this event.
* This method is useful for event-logging and for debugging. * This method is useful for event-logging and for debugging.

File diff suppressed because it is too large Load Diff

View File

@ -65,7 +65,7 @@ import javax.print.attribute.PrintServiceAttribute;
* PrinterStateReason PrinterStateReason} objects to an existing * PrinterStateReason PrinterStateReason} objects to an existing
* PrinterStateReasons object and remove them again. However, like class * PrinterStateReasons object and remove them again. However, like class
* {@link java.util.HashMap java.util.HashMap}, class PrinterStateReasons is * {@link java.util.HashMap java.util.HashMap}, class PrinterStateReasons is
* bot multiple thread safe. If a PrinterStateReasons object will be used by * not multiple thread safe. If a PrinterStateReasons object will be used by
* multiple threads, be sure to synchronize its operations (e.g., using a * multiple threads, be sure to synchronize its operations (e.g., using a
* synchronized map view obtained from class {@link java.util.Collections * synchronized map view obtained from class {@link java.util.Collections
* java.util.Collections}). * java.util.Collections}).

View File

@ -795,7 +795,6 @@ public abstract class JComponent extends Container implements Serializable,
* @see java.awt.Container#paint * @see java.awt.Container#paint
*/ */
protected void paintChildren(Graphics g) { protected void paintChildren(Graphics g) {
boolean isJComponent;
Graphics sg = g; Graphics sg = g;
synchronized(getTreeLock()) { synchronized(getTreeLock()) {
@ -826,12 +825,21 @@ public abstract class JComponent extends Container implements Serializable,
} }
} }
boolean printing = getFlag(IS_PRINTING); boolean printing = getFlag(IS_PRINTING);
final Window window = SwingUtilities.getWindowAncestor(this);
final boolean isWindowOpaque = window == null || window.isOpaque();
for (; i >= 0 ; i--) { for (; i >= 0 ; i--) {
Component comp = getComponent(i); Component comp = getComponent(i);
isJComponent = (comp instanceof JComponent); if (comp == null) {
if (comp != null && continue;
(isJComponent || isLightweightComponent(comp)) && }
(comp.isVisible() == true)) {
final boolean isJComponent = comp instanceof JComponent;
// Enable painting of heavyweights in non-opaque windows.
// See 6884960
if ((!isWindowOpaque || isJComponent ||
isLightweightComponent(comp)) && comp.isVisible())
{
Rectangle cr; Rectangle cr;
cr = comp.getBounds(tmpRect); cr = comp.getBounds(tmpRect);
@ -887,6 +895,8 @@ public abstract class JComponent extends Container implements Serializable,
} }
} }
} else { } else {
// The component is either lightweight, or
// heavyweight in a non-opaque window
if (!printing) { if (!printing) {
comp.paint(cg); comp.paint(cg);
} }
@ -4868,7 +4878,9 @@ public abstract class JComponent extends Container implements Serializable,
* @see #revalidate * @see #revalidate
* @see java.awt.Component#invalidate * @see java.awt.Component#invalidate
* @see java.awt.Container#validate * @see java.awt.Container#validate
* @see java.awt.Container#isValidateRoot
*/ */
@Override
public boolean isValidateRoot() { public boolean isValidateRoot() {
return false; return false;
} }

View File

@ -1330,7 +1330,7 @@ public class JEditorPane extends JTextComponent {
*/ */
public Dimension getPreferredSize() { public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize(); Dimension d = super.getPreferredSize();
JViewport port = SwingUtilities2.getViewport(this); JViewport port = SwingUtilities.getParentViewport(this);
if (port != null) { if (port != null) {
TextUI ui = getUI(); TextUI ui = getUI();
int prefWidth = d.width; int prefWidth = d.width;
@ -1452,7 +1452,7 @@ public class JEditorPane extends JTextComponent {
* match its own, false otherwise * match its own, false otherwise
*/ */
public boolean getScrollableTracksViewportWidth() { public boolean getScrollableTracksViewportWidth() {
JViewport port = SwingUtilities2.getViewport(this); JViewport port = SwingUtilities.getParentViewport(this);
if (port != null) { if (port != null) {
TextUI ui = getUI(); TextUI ui = getUI();
int w = port.getWidth(); int w = port.getWidth();
@ -1474,7 +1474,7 @@ public class JEditorPane extends JTextComponent {
* false otherwise * false otherwise
*/ */
public boolean getScrollableTracksViewportHeight() { public boolean getScrollableTracksViewportHeight() {
JViewport port = SwingUtilities2.getViewport(this); JViewport port = SwingUtilities.getParentViewport(this);
if (port != null) { if (port != null) {
TextUI ui = getUI(); TextUI ui = getUI();
int h = port.getHeight(); int h = port.getHeight();

View File

@ -2722,7 +2722,7 @@ public class JList extends JComponent implements Scrollable, Accessible
getVisibleRowCount() <= 0) { getVisibleRowCount() <= 0) {
return true; return true;
} }
JViewport port = SwingUtilities2.getViewport(this); JViewport port = SwingUtilities.getParentViewport(this);
if (port != null) { if (port != null) {
return port.getWidth() > getPreferredSize().width; return port.getWidth() > getPreferredSize().width;
} }
@ -2748,7 +2748,7 @@ public class JList extends JComponent implements Scrollable, Accessible
getVisibleRowCount() <= 0) { getVisibleRowCount() <= 0) {
return true; return true;
} }
JViewport port = SwingUtilities2.getViewport(this); JViewport port = SwingUtilities.getParentViewport(this);
if (port != null) { if (port != null) {
return port.getHeight() > getPreferredSize().height; return port.getHeight() > getPreferredSize().height;
} }

View File

@ -725,8 +725,10 @@ public class JRootPane extends JComponent implements Accessible {
* because both classes override <code>isValidateRoot</code> to return true. * because both classes override <code>isValidateRoot</code> to return true.
* *
* @see JComponent#isValidateRoot * @see JComponent#isValidateRoot
* @see java.awt.Container#isValidateRoot
* @return true * @return true
*/ */
@Override
public boolean isValidateRoot() { public boolean isValidateRoot() {
return true; return true;
} }

View File

@ -453,10 +453,12 @@ public class JScrollPane extends JComponent implements ScrollPaneConstants, Acce
* @see java.awt.Container#validate * @see java.awt.Container#validate
* @see JComponent#revalidate * @see JComponent#revalidate
* @see JComponent#isValidateRoot * @see JComponent#isValidateRoot
* @see java.awt.Container#isValidateRoot
* *
* @beaninfo * @beaninfo
* hidden: true * hidden: true
*/ */
@Override
public boolean isValidateRoot() { public boolean isValidateRoot() {
return true; return true;
} }

View File

@ -947,10 +947,12 @@ public class JSplitPane extends JComponent implements Accessible
* *
* @return true * @return true
* @see JComponent#revalidate * @see JComponent#revalidate
* @see java.awt.Container#isValidateRoot
* *
* @beaninfo * @beaninfo
* hidden: true * hidden: true
*/ */
@Override
public boolean isValidateRoot() { public boolean isValidateRoot() {
return true; return true;
} }

View File

@ -57,6 +57,7 @@ import sun.swing.SwingUtilities2;
import sun.swing.SwingUtilities2.Section; import sun.swing.SwingUtilities2.Section;
import static sun.swing.SwingUtilities2.Section.*; import static sun.swing.SwingUtilities2.Section.*;
import sun.swing.PrintingStatus; import sun.swing.PrintingStatus;
import sun.swing.SwingLazyValue;
/** /**
* The <code>JTable</code> is used to display and edit regular two-dimensional tables * The <code>JTable</code> is used to display and edit regular two-dimensional tables
@ -718,7 +719,7 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
* @see #addNotify * @see #addNotify
*/ */
protected void configureEnclosingScrollPane() { protected void configureEnclosingScrollPane() {
JViewport port = SwingUtilities2.getViewport(this); JViewport port = SwingUtilities.getParentViewport(this);
if (port != null) { if (port != null) {
Container gp = port.getParent(); Container gp = port.getParent();
if (gp instanceof JScrollPane) { if (gp instanceof JScrollPane) {
@ -727,7 +728,8 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
// example, the rowHeaderView of the scrollPane - // example, the rowHeaderView of the scrollPane -
// an implementor of fixed columns might do this. // an implementor of fixed columns might do this.
JViewport viewport = scrollPane.getViewport(); JViewport viewport = scrollPane.getViewport();
if (viewport == null || viewport.getView() != this) { if (viewport == null ||
SwingUtilities.getUnwrappedView(viewport) != this) {
return; return;
} }
scrollPane.setColumnHeaderView(getTableHeader()); scrollPane.setColumnHeaderView(getTableHeader());
@ -750,7 +752,7 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
* from configureEnclosingScrollPane() and updateUI() in a safe manor. * from configureEnclosingScrollPane() and updateUI() in a safe manor.
*/ */
private void configureEnclosingScrollPaneUI() { private void configureEnclosingScrollPaneUI() {
JViewport port = SwingUtilities2.getViewport(this); JViewport port = SwingUtilities.getParentViewport(this);
if (port != null) { if (port != null) {
Container gp = port.getParent(); Container gp = port.getParent();
if (gp instanceof JScrollPane) { if (gp instanceof JScrollPane) {
@ -759,7 +761,8 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
// example, the rowHeaderView of the scrollPane - // example, the rowHeaderView of the scrollPane -
// an implementor of fixed columns might do this. // an implementor of fixed columns might do this.
JViewport viewport = scrollPane.getViewport(); JViewport viewport = scrollPane.getViewport();
if (viewport == null || viewport.getView() != this) { if (viewport == null ||
SwingUtilities.getUnwrappedView(viewport) != this) {
return; return;
} }
// scrollPane.getViewport().setBackingStoreEnabled(true); // scrollPane.getViewport().setBackingStoreEnabled(true);
@ -819,7 +822,7 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
* @since 1.3 * @since 1.3
*/ */
protected void unconfigureEnclosingScrollPane() { protected void unconfigureEnclosingScrollPane() {
JViewport port = SwingUtilities2.getViewport(this); JViewport port = SwingUtilities.getParentViewport(this);
if (port != null) { if (port != null) {
Container gp = port.getParent(); Container gp = port.getParent();
if (gp instanceof JScrollPane) { if (gp instanceof JScrollPane) {
@ -828,7 +831,8 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
// example, the rowHeaderView of the scrollPane - // example, the rowHeaderView of the scrollPane -
// an implementor of fixed columns might do this. // an implementor of fixed columns might do this.
JViewport viewport = scrollPane.getViewport(); JViewport viewport = scrollPane.getViewport();
if (viewport == null || viewport.getView() != this) { if (viewport == null ||
SwingUtilities.getUnwrappedView(viewport) != this) {
return; return;
} }
scrollPane.setColumnHeaderView(null); scrollPane.setColumnHeaderView(null);
@ -5215,7 +5219,7 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
* @see #getFillsViewportHeight * @see #getFillsViewportHeight
*/ */
public boolean getScrollableTracksViewportHeight() { public boolean getScrollableTracksViewportHeight() {
JViewport port = SwingUtilities2.getViewport(this); JViewport port = SwingUtilities.getParentViewport(this);
return getFillsViewportHeight() return getFillsViewportHeight()
&& port != null && port != null
&& port.getHeight() > getPreferredSize().height; && port.getHeight() > getPreferredSize().height;
@ -5316,7 +5320,7 @@ public class JTable extends JComponent implements TableModelListener, Scrollable
} }
private void setLazyValue(Hashtable h, Class c, String s) { private void setLazyValue(Hashtable h, Class c, String s) {
h.put(c, new UIDefaults.ProxyLazyValue(s)); h.put(c, new SwingLazyValue(s));
} }
private void setLazyRenderer(Class c, String s) { private void setLazyRenderer(Class c, String s) {

View File

@ -288,9 +288,11 @@ public class JTextField extends JTextComponent implements SwingConstants {
* *
* @see JComponent#revalidate * @see JComponent#revalidate
* @see JComponent#isValidateRoot * @see JComponent#isValidateRoot
* @see java.awt.Container#isValidateRoot
*/ */
@Override
public boolean isValidateRoot() { public boolean isValidateRoot() {
return SwingUtilities2.getViewport(this) == null; return SwingUtilities.getParentViewport(this) == null;
} }

View File

@ -3498,7 +3498,7 @@ public class JTree extends JComponent implements Scrollable, Accessible
* @see Scrollable#getScrollableTracksViewportWidth * @see Scrollable#getScrollableTracksViewportWidth
*/ */
public boolean getScrollableTracksViewportWidth() { public boolean getScrollableTracksViewportWidth() {
JViewport port = SwingUtilities2.getViewport(this); JViewport port = SwingUtilities.getParentViewport(this);
if (port != null) { if (port != null) {
return port.getWidth() > getPreferredSize().width; return port.getWidth() > getPreferredSize().width;
} }
@ -3515,7 +3515,7 @@ public class JTree extends JComponent implements Scrollable, Accessible
* @see Scrollable#getScrollableTracksViewportHeight * @see Scrollable#getScrollableTracksViewportHeight
*/ */
public boolean getScrollableTracksViewportHeight() { public boolean getScrollableTracksViewportHeight() {
JViewport port = SwingUtilities2.getViewport(this); JViewport port = SwingUtilities.getParentViewport(this);
if (port != null) { if (port != null) {
return port.getHeight() > getPreferredSize().height; return port.getHeight() > getPreferredSize().height;
} }

View File

@ -469,49 +469,12 @@ public class JViewport extends JComponent implements Accessible
* is the synchronous version of a <code>revalidate</code>. * is the synchronous version of a <code>revalidate</code>.
*/ */
private void validateView() { private void validateView() {
Component validateRoot = null; Component validateRoot = SwingUtilities.getValidateRoot(this, false);
/* Find the first JComponent ancestor of this component whose
* isValidateRoot() method returns true.
*/
for(Component c = this; c != null; c = c.getParent()) {
if ((c instanceof CellRendererPane) || (c.getPeer() == null)) {
return;
}
if ((c instanceof JComponent) &&
(((JComponent)c).isValidateRoot())) {
validateRoot = c;
break;
}
}
// If no validateRoot, nothing to validate from.
if (validateRoot == null) { if (validateRoot == null) {
return; return;
} }
// Make sure all ancestors are visible.
Component root = null;
for(Component c = validateRoot; c != null; c = c.getParent()) {
// We don't check isVisible here, otherwise if the component
// is contained in something like a JTabbedPane when the
// component is made visible again it won't have scrolled
// to the correct location.
if (c.getPeer() == null) {
return;
}
if ((c instanceof Window) || (c instanceof Applet)) {
root = c;
break;
}
}
// Make sure there is a Window ancestor.
if (root == null) {
return;
}
// Validate the root. // Validate the root.
validateRoot.validate(); validateRoot.validate();

View File

@ -310,47 +310,13 @@ public class RepaintManager
delegate.addInvalidComponent(invalidComponent); delegate.addInvalidComponent(invalidComponent);
return; return;
} }
Component validateRoot = null; Component validateRoot =
SwingUtilities.getValidateRoot(invalidComponent, true);
/* Find the first JComponent ancestor of this component whose
* isValidateRoot() method returns true.
*/
for(Component c = invalidComponent; c != null; c = c.getParent()) {
if ((c instanceof CellRendererPane) || (c.getPeer() == null)) {
return;
}
if ((c instanceof JComponent) && (((JComponent)c).isValidateRoot())) {
validateRoot = c;
break;
}
}
/* There's no validateRoot to apply validate to, so we're done.
*/
if (validateRoot == null) { if (validateRoot == null) {
return; return;
} }
/* If the validateRoot and all of its ancestors aren't visible
* then we don't do anything. While we're walking up the tree
* we find the root Window or Applet.
*/
Component root = null;
for(Component c = validateRoot; c != null; c = c.getParent()) {
if (!c.isVisible() || (c.getPeer() == null)) {
return;
}
if ((c instanceof Window) || (c instanceof Applet)) {
root = c;
break;
}
}
if (root == null) {
return;
}
/* Lazily create the invalidateComponents vector and add the /* Lazily create the invalidateComponents vector and add the
* validateRoot if it's not there already. If this validateRoot * validateRoot if it's not there already. If this validateRoot
* is already in the vector, we're done. * is already in the vector, we're done.

View File

@ -1967,4 +1967,114 @@ public class SwingUtilities implements SwingConstants
SwingUtilities.updateComponentTreeUI(component); SwingUtilities.updateComponentTreeUI(component);
} }
} }
/**
* Looks for the first ancestor of the {@code component}
* which is not an instance of {@link JLayer}.
* If this ancestor is an instance of {@code JViewport},
* this {@code JViewport} is returned, otherwise returns {@code null}.
* The following way of obtaining the parent {@code JViewport}
* is not recommended any more:
* <pre>
* JViewport port = null;
* Container parent = component.getParent();
* // not recommended any more
* if(parent instanceof JViewport) {
* port = (JViewport) parent;
* }
* </pre>
* Here is the way to go:
* <pre>
* // the correct way:
* JViewport port = SwingUtilities.getParentViewport(component);
* </pre>
* @param component {@code Component} to get the parent {@code JViewport} of.
* @return the {@code JViewport} instance for the {@code component}
* or {@code null}
* @throws NullPointerException if {@code component} is {@code null}
*
* @since 1.7
*/
public static JViewport getParentViewport(Component component) {
do {
component = component.getParent();
if (component instanceof JViewport) {
return (JViewport) component;
}
} while(component instanceof JLayer);
return null;
}
/**
* Returns the first {@code JViewport}'s descendant
* which is not an instance of {@code JLayer} or {@code null}.
*
* If the {@code viewport}'s view component is not a {@code JLayer},
* this method is equal to {@link JViewport#getView()}
* otherwise {@link JLayer#getView()} will be recursively tested
*
* @return the first {@code JViewport}'s descendant
* which is not an instance of {@code JLayer} or {@code null}.
*
* @throws NullPointerException if {@code viewport} is {@code null}
* @see JViewport#getView()
* @see JLayer
*/
static Component getUnwrappedView(JViewport viewport) {
Component view = viewport.getView();
while (view instanceof JLayer) {
view = ((JLayer)view).getView();
}
return view;
}
/**
* Retrieves the validate root of a given container.
*
* If the container is contained within a {@code CellRendererPane}, this
* method returns {@code null} due to the synthetic nature of the {@code
* CellRendererPane}.
* <p>
* The component hierarchy must be displayable up to the toplevel component
* (either a {@code Frame} or an {@code Applet} object.) Otherwise this
* method returns {@code null}.
* <p>
* If the {@code visibleOnly} argument is {@code true}, the found validate
* root and all its parents up to the toplevel component must also be
* visible. Otherwise this method returns {@code null}.
*
* @return the validate root of the given container or null
* @see java.awt.Component#isDisplayable()
* @see java.awt.Component#isVisible()
* @since 1.7
*/
static Container getValidateRoot(Container c, boolean visibleOnly) {
Container root = null;
for (; c != null; c = c.getParent())
{
if (!c.isDisplayable() || c instanceof CellRendererPane) {
return null;
}
if (c.isValidateRoot()) {
root = c;
break;
}
}
if (root == null) {
return null;
}
for (; c != null; c = c.getParent()) {
if (!c.isDisplayable() || (visibleOnly && !c.isVisible())) {
return null;
}
if (c instanceof Window || c instanceof Applet) {
return root;
}
}
return null;
}
} }

View File

@ -33,7 +33,8 @@ import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.Vector; import java.util.List;
import java.util.ArrayList;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
@ -173,22 +174,27 @@ public abstract class FileSystemView {
* @since 1.4 * @since 1.4
*/ */
public String getSystemDisplayName(File f) { public String getSystemDisplayName(File f) {
String name = null; if (f == null) {
if (f != null) { return null;
name = f.getName(); }
if (!name.equals("..") && !name.equals(".") &&
(useSystemExtensionHiding ||
!isFileSystem(f) ||
isFileSystemRoot(f)) &&
((f instanceof ShellFolder) ||
f.exists())) {
String name = f.getName();
if (!name.equals("..") && !name.equals(".") &&
(useSystemExtensionHiding || !isFileSystem(f) || isFileSystemRoot(f)) &&
(f instanceof ShellFolder || f.exists())) {
try {
name = getShellFolder(f).getDisplayName(); name = getShellFolder(f).getDisplayName();
if (name == null || name.length() == 0) { } catch (FileNotFoundException e) {
name = f.getPath(); // e.g. "/" return null;
} }
if (name == null || name.length() == 0) {
name = f.getPath(); // e.g. "/"
} }
} }
return name; return name;
} }
@ -222,17 +228,25 @@ public abstract class FileSystemView {
* @since 1.4 * @since 1.4
*/ */
public Icon getSystemIcon(File f) { public Icon getSystemIcon(File f) {
if (f != null) { if (f == null) {
ShellFolder sf = getShellFolder(f);
Image img = sf.getIcon(false);
if (img != null) {
return new ImageIcon(img, sf.getFolderType());
} else {
return UIManager.getIcon(f.isDirectory() ? "FileView.directoryIcon" : "FileView.fileIcon");
}
} else {
return null; return null;
} }
ShellFolder sf;
try {
sf = getShellFolder(f);
} catch (FileNotFoundException e) {
return null;
}
Image img = sf.getIcon(false);
if (img != null) {
return new ImageIcon(img, sf.getFolderType());
} else {
return UIManager.getIcon(f.isDirectory() ? "FileView.directoryIcon" : "FileView.fileIcon");
}
} }
/** /**
@ -446,24 +460,28 @@ public abstract class FileSystemView {
* Gets the list of shown (i.e. not hidden) files. * Gets the list of shown (i.e. not hidden) files.
*/ */
public File[] getFiles(File dir, boolean useFileHiding) { public File[] getFiles(File dir, boolean useFileHiding) {
Vector<File> files = new Vector<File>(); List<File> files = new ArrayList<File>();
// add all files in dir // add all files in dir
File[] names; if (!(dir instanceof ShellFolder)) {
if (!(dir instanceof ShellFolder)) { try {
dir = getShellFolder(dir); dir = getShellFolder(dir);
} catch (FileNotFoundException e) {
return new File[0];
} }
}
names = ((ShellFolder)dir).listFiles(!useFileHiding); File[] names = ((ShellFolder) dir).listFiles(!useFileHiding);
File f;
int nameCount = (names == null) ? 0 : names.length; if (names == null) {
for (int i = 0; i < nameCount; i++) { return new File[0];
}
for (File f : names) {
if (Thread.currentThread().isInterrupted()) { if (Thread.currentThread().isInterrupted()) {
break; break;
} }
f = names[i];
if (!(f instanceof ShellFolder)) { if (!(f instanceof ShellFolder)) {
if (isFileSystemRoot(f)) { if (isFileSystemRoot(f)) {
f = createFileSystemRoot(f); f = createFileSystemRoot(f);
@ -481,7 +499,7 @@ public abstract class FileSystemView {
} }
} }
if (!useFileHiding || !isHiddenFile(f)) { if (!useFileHiding || !isHiddenFile(f)) {
files.addElement(f); files.add(f);
} }
} }
@ -497,42 +515,50 @@ public abstract class FileSystemView {
* <code>null</code> if <code>dir</code> is <code>null</code> * <code>null</code> if <code>dir</code> is <code>null</code>
*/ */
public File getParentDirectory(File dir) { public File getParentDirectory(File dir) {
if (dir != null && dir.exists()) { if (dir == null || !dir.exists()) {
ShellFolder sf = getShellFolder(dir); return null;
File psf = sf.getParentFile(); }
if (psf != null) {
if (isFileSystem(psf)) { ShellFolder sf;
File f = psf;
if (f != null && !f.exists()) { try {
// This could be a node under "Network Neighborhood". sf = getShellFolder(dir);
File ppsf = psf.getParentFile(); } catch (FileNotFoundException e) {
if (ppsf == null || !isFileSystem(ppsf)) { return null;
// We're mostly after the exists() override for windows below. }
f = createFileSystemRoot(f);
} File psf = sf.getParentFile();
}
return f; if (psf == null) {
} else { return null;
return psf; }
if (isFileSystem(psf)) {
File f = psf;
if (!f.exists()) {
// This could be a node under "Network Neighborhood".
File ppsf = psf.getParentFile();
if (ppsf == null || !isFileSystem(ppsf)) {
// We're mostly after the exists() override for windows below.
f = createFileSystemRoot(f);
} }
} }
return f;
} else {
return psf;
} }
return null;
} }
ShellFolder getShellFolder(File f) { /**
if (!(f instanceof ShellFolder) * Throws {@code FileNotFoundException} if file not found or current thread was interrupted
&& !(f instanceof FileSystemRoot) */
&& isFileSystemRoot(f)) { ShellFolder getShellFolder(File f) throws FileNotFoundException {
if (!(f instanceof ShellFolder) && !(f instanceof FileSystemRoot) && isFileSystemRoot(f)) {
f = createFileSystemRoot(f); f = createFileSystemRoot(f);
} }
try { try {
return ShellFolder.getShellFolder(f); return ShellFolder.getShellFolder(f);
} catch (FileNotFoundException e) {
System.err.println("FileSystemView.getShellFolder: f="+f);
e.printStackTrace();
return null;
} catch (InternalError e) { } catch (InternalError e) {
System.err.println("FileSystemView.getShellFolder: f="+f); System.err.println("FileSystemView.getShellFolder: f="+f);
e.printStackTrace(); e.printStackTrace();
@ -596,9 +622,9 @@ class UnixFileSystemView extends FileSystemView {
// Unix - using OpenWindows' default folder name. Can't find one for Motif/CDE. // Unix - using OpenWindows' default folder name. Can't find one for Motif/CDE.
newFolder = createFileObject(containingDir, newFolderString); newFolder = createFileObject(containingDir, newFolderString);
int i = 1; int i = 1;
while (newFolder.exists() && (i < 100)) { while (newFolder.exists() && i < 100) {
newFolder = createFileObject(containingDir, MessageFormat.format( newFolder = createFileObject(containingDir, MessageFormat.format(
newFolderNextString, new Object[] { new Integer(i) })); newFolderNextString, new Integer(i)));
i++; i++;
} }
@ -612,7 +638,7 @@ class UnixFileSystemView extends FileSystemView {
} }
public boolean isFileSystemRoot(File dir) { public boolean isFileSystemRoot(File dir) {
return (dir != null && dir.getAbsolutePath().equals("/")); return dir != null && dir.getAbsolutePath().equals("/");
} }
public boolean isDrive(File dir) { public boolean isDrive(File dir) {
@ -654,7 +680,7 @@ class WindowsFileSystemView extends FileSystemView {
public File getChild(File parent, String fileName) { public File getChild(File parent, String fileName) {
if (fileName.startsWith("\\") if (fileName.startsWith("\\")
&& !(fileName.startsWith("\\\\")) && !fileName.startsWith("\\\\")
&& isFileSystem(parent)) { && isFileSystem(parent)) {
//Path is relative to the root of parent's drive //Path is relative to the root of parent's drive
@ -677,9 +703,13 @@ class WindowsFileSystemView extends FileSystemView {
* The Windows implementation gets information from the ShellFolder class. * The Windows implementation gets information from the ShellFolder class.
*/ */
public String getSystemTypeDescription(File f) { public String getSystemTypeDescription(File f) {
if (f != null) { if (f == null) {
return null;
}
try {
return getShellFolder(f).getFolderType(); return getShellFolder(f).getFolderType();
} else { } catch (FileNotFoundException e) {
return null; return null;
} }
} }
@ -701,9 +731,9 @@ class WindowsFileSystemView extends FileSystemView {
// Using NT's default folder name // Using NT's default folder name
File newFolder = createFileObject(containingDir, newFolderString); File newFolder = createFileObject(containingDir, newFolderString);
int i = 2; int i = 2;
while (newFolder.exists() && (i < 100)) { while (newFolder.exists() && i < 100) {
newFolder = createFileObject(containingDir, MessageFormat.format( newFolder = createFileObject(containingDir, MessageFormat.format(
newFolderNextString, new Object[] { new Integer(i) })); newFolderNextString, new Integer(i)));
i++; i++;
} }
@ -727,7 +757,7 @@ class WindowsFileSystemView extends FileSystemView {
} }
}); });
return (path != null && (path.equals("A:\\") || path.equals("B:\\"))); return path != null && (path.equals("A:\\") || path.equals("B:\\"));
} }
/** /**

View File

@ -71,33 +71,410 @@ public class LayerUI<V extends Component>
* Subclasses should override this method and use * Subclasses should override this method and use
* the specified {@code Graphics} object to * the specified {@code Graphics} object to
* render the content of the component. * render the content of the component.
* <p/>
* If {@code g} is not an instance of {@code Graphics2D},
* this method is no-op.
* *
* @param g the {@code Graphics} context in which to paint; * @param g the {@code Graphics} context in which to paint;
* @param c the component being painted; * @param c the component being painted;
* it can be safely cast to the {@code JLayer<V>} * it can be safely cast to {@code JLayer<? extends V>}
*
* @see #configureGraphics(Graphics2D, JLayer)
* @see #paintLayer(Graphics2D, JLayer)
*/ */
@Override
public void paint(Graphics g, JComponent c) { public void paint(Graphics g, JComponent c) {
c.paint(g); if (g instanceof Graphics2D) {
Graphics2D g2 = (Graphics2D) g.create();
JLayer<? extends V> l = (JLayer<? extends V>) c;
configureGraphics(g2, l);
paintLayer(g2, l);
g2.dispose();
}
}
/**
* This method is called by the {@link #paint} method prior to
* {@link #paintLayer} to configure the {@code Graphics2D} object.
* The default implementation is empty.
*
* @param g2 the {@code Graphics2D} object to configure
* @param l the {@code JLayer} being painted
*
* @see #paintLayer(Graphics2D, JLayer)
*/
protected void configureGraphics(Graphics2D g2, JLayer<? extends V> l) {
}
/**
* Called by the {@link #paint} method,
* subclasses should override this method
* to perform any custom painting operations.
* <p/>
* The default implementation paints the passed {@code JLayer} as is.
*
* @param g2 the {@code Graphics2D} context in which to paint
* @param l the {@code JLayer} being painted
*
* @see #configureGraphics(Graphics2D, JLayer)
*/
protected void paintLayer(Graphics2D g2, JLayer<? extends V> l) {
l.paint(g2);
} }
/** /**
* Dispatches {@code AWTEvent}s for {@code JLayer} * Dispatches {@code AWTEvent}s for {@code JLayer}
* and <b>all it subcomponents</b> to this {@code LayerUI} instance. * and <b>all its subcomponents</b> to this {@code LayerUI} instance.
* <p> * <p/>
* To enable the {@code AWTEvent} of the particular type, * To enable the {@code AWTEvent}s of a particular type,
* you call {@link javax.swing.JLayer#setLayerEventMask} * you call {@link JLayer#setLayerEventMask}
* in {@link #installUI(javax.swing.JComponent)} * in {@link #installUI(javax.swing.JComponent)}
* and set the layer event mask to {@code 0} * and set the layer event mask to {@code 0}
* in {@link #uninstallUI(javax.swing.JComponent)} after that * in {@link #uninstallUI(javax.swing.JComponent)} after that.
* By default this method calls the appropriate
* {@code process&lt;event&nbsp;type&gt;Event}
* method for the given class of event.
* *
* @param e the event to be dispatched * @param e the event to be dispatched
* @param l the layer this LayerUI is set to * @param l the layer this LayerUI is set to
* *
* @see JLayer#setLayerEventMask(long) * @see JLayer#setLayerEventMask(long)
* @see javax.swing.JLayer#getLayerEventMask() * @see #installUI(javax.swing.JComponent)
* @see #uninstallUI(javax.swing.JComponent)
* @see #processComponentEvent
* @see #processFocusEvent
* @see #processKeyEvent
* @see #processMouseEvent
* @see #processMouseMotionEvent
* @see #processInputMethodEvent
* @see #processHierarchyEvent
* @see #processMouseWheelEvent
*/ */
public void eventDispatched(AWTEvent e, JLayer<? extends V> l){ public void eventDispatched(AWTEvent e, JLayer<? extends V> l){
if (e instanceof FocusEvent) {
processFocusEvent((FocusEvent)e, l);
} else if (e instanceof MouseEvent) {
switch(e.getID()) {
case MouseEvent.MOUSE_PRESSED:
case MouseEvent.MOUSE_RELEASED:
case MouseEvent.MOUSE_CLICKED:
case MouseEvent.MOUSE_ENTERED:
case MouseEvent.MOUSE_EXITED:
processMouseEvent((MouseEvent)e, l);
break;
case MouseEvent.MOUSE_MOVED:
case MouseEvent.MOUSE_DRAGGED:
processMouseMotionEvent((MouseEvent)e, l);
break;
case MouseEvent.MOUSE_WHEEL:
processMouseWheelEvent((MouseWheelEvent)e, l);
break;
}
} else if (e instanceof KeyEvent) {
processKeyEvent((KeyEvent)e, l);
} else if (e instanceof ComponentEvent) {
processComponentEvent((ComponentEvent)e, l);
} else if (e instanceof InputMethodEvent) {
processInputMethodEvent((InputMethodEvent)e, l);
} else if (e instanceof HierarchyEvent) {
switch (e.getID()) {
case HierarchyEvent.HIERARCHY_CHANGED:
processHierarchyEvent((HierarchyEvent)e, l);
break;
case HierarchyEvent.ANCESTOR_MOVED:
case HierarchyEvent.ANCESTOR_RESIZED:
processHierarchyBoundsEvent((HierarchyEvent)e, l);
break;
}
}
}
/**
* Processes component events occurring on the {@link JLayer}
* or any of its subcomponents.
* <p/>
* This method is not called unless component events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Component events are enabled in the overridden {@link #installUI} method
* and should be disabled in the {@link #uninstallUI} method after that.
* <pre>
* public void installUI(JComponent c) {
* super.installUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(AWTEvent.COMPONENT_EVENT_MASK);
* }
*
* public void unistallUI(JComponent c) {
* super.uninstallUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(0);
* }
* </pre>
*
* @param e the {@code ComponentEvent} to be processed
* @param l the layer this {@code LayerUI} instance is set to
*
* @see JLayer#setLayerEventMask(long)
* @see #installUI(javax.swing.JComponent)
* @see #uninstallUI(javax.swing.JComponent)
*/
protected void processComponentEvent(ComponentEvent e, JLayer<? extends V> l) {
}
/**
* Processes focus events occurring on the {@link JLayer}
* or any of its subcomponents.
* <p/>
* This method is not called unless focus events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Focus events are enabled in the overridden {@link #installUI} method
* and should be disabled in the {@link #uninstallUI} method after that.
* <pre>
* public void installUI(JComponent c) {
* super.installUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(AWTEvent.FOCUS_EVENT_MASK);
* }
*
* public void unistallUI(JComponent c) {
* super.uninstallUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(0);
* }
* </pre>
*
* @param e the {@code FocusEvent} to be processed
* @param l the layer this {@code LayerUI} instance is set to
*
* @see JLayer#setLayerEventMask(long)
* @see #installUI(javax.swing.JComponent)
* @see #uninstallUI(javax.swing.JComponent)
*/
protected void processFocusEvent(FocusEvent e, JLayer<? extends V> l) {
}
/**
* Processes key events occurring on the {@link JLayer}
* or any of its subcomponents.
* <p/>
* This method is not called unless key events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Key events are enabled in the overridden {@link #installUI} method
* and should be disabled in the {@link #uninstallUI} method after that.
* <pre>
* public void installUI(JComponent c) {
* super.installUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(AWTEvent.KEY_EVENT_MASK);
* }
*
* public void unistallUI(JComponent c) {
* super.uninstallUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(0);
* }
* </pre>
*
* @param e the {@code KeyEvent} to be processed
* @param l the layer this {@code LayerUI} instance is set to
*
* @see JLayer#setLayerEventMask(long)
* @see #installUI(javax.swing.JComponent)
* @see #uninstallUI(javax.swing.JComponent)
*/
protected void processKeyEvent(KeyEvent e, JLayer<? extends V> l) {
}
/**
* Processes mouse events occurring on the {@link JLayer}
* or any of its subcomponents.
* <p/>
* This method is not called unless mouse events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Mouse events are enabled in the overridden {@link #installUI} method
* and should be disabled in the {@link #uninstallUI} method after that.
* <pre>
* public void installUI(JComponent c) {
* super.installUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK);
* }
*
* public void unistallUI(JComponent c) {
* super.uninstallUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(0);
* }
* </pre>
*
* @param e the {@code MouseEvent} to be processed
* @param l the layer this {@code LayerUI} instance is set to
*
* @see JLayer#setLayerEventMask(long)
* @see #installUI(javax.swing.JComponent)
* @see #uninstallUI(javax.swing.JComponent)
*/
protected void processMouseEvent(MouseEvent e, JLayer<? extends V> l) {
}
/**
* Processes mouse motion event occurring on the {@link JLayer}
* or any of its subcomponents.
* <p/>
* This method is not called unless mouse motion events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Mouse motion events are enabled in the overridden {@link #installUI} method
* and should be disabled in the {@link #uninstallUI} method after that.
* <pre>
* public void installUI(JComponent c) {
* super.installUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(AWTEvent.MOUSE_MOTION_EVENT_MASK);
* }
*
* public void unistallUI(JComponent c) {
* super.uninstallUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(0);
* }
* </pre>
*
* @param e the {@code MouseEvent} to be processed
* @param l the layer this {@code LayerUI} instance is set to
*
* @see JLayer#setLayerEventMask(long)
* @see #installUI(javax.swing.JComponent)
* @see #uninstallUI(javax.swing.JComponent)
*/
protected void processMouseMotionEvent(MouseEvent e, JLayer<? extends V> l) {
}
/**
* Processes mouse wheel event occurring on the {@link JLayer}
* or any of its subcomponents.
* <p/>
* This method is not called unless mouse wheel events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Mouse wheel events are enabled in the overridden {@link #installUI} method
* and should be disabled in the {@link #uninstallUI} method after that.
* <pre>
* public void installUI(JComponent c) {
* super.installUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(AWTEvent.MOUSE_WHEEL_EVENT_MASK);
* }
*
* public void unistallUI(JComponent c) {
* super.uninstallUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(0);
* }
* </pre>
*
* @param e the {@code MouseEvent} to be processed
* @param l the layer this {@code LayerUI} instance is set to
*
* @see JLayer#setLayerEventMask(long)
* @see #installUI(javax.swing.JComponent)
* @see #uninstallUI(javax.swing.JComponent)
*/
protected void processMouseWheelEvent(MouseWheelEvent e, JLayer<? extends V> l) {
}
/**
* Processes input event occurring on the {@link JLayer}
* or any of its subcomponents.
* <p/>
* This method is not called unless input events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Input events are enabled in the overridden {@link #installUI} method
* and should be disabled in the {@link #uninstallUI} method after that.
* <pre>
* public void installUI(JComponent c) {
* super.installUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(AWTEvent.INPUT_METHOD_EVENT_MASK);
* }
*
* public void unistallUI(JComponent c) {
* super.uninstallUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(0);
* }
* </pre>
*
* @param e the {@code InputMethodEvent} to be processed
* @param l the layer this {@code LayerUI} instance is set to
*
* @see JLayer#setLayerEventMask(long)
* @see #installUI(javax.swing.JComponent)
* @see #uninstallUI(javax.swing.JComponent)
*/
protected void processInputMethodEvent(InputMethodEvent e, JLayer<? extends V> l) {
}
/**
* Processes hierarchy event occurring on the {@link JLayer}
* or any of its subcomponents.
* <p/>
* This method is not called unless hierarchy events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Hierarchy events are enabled in the overridden {@link #installUI} method
* and should be disabled in the {@link #uninstallUI} method after that.
* <pre>
* public void installUI(JComponent c) {
* super.installUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(AWTEvent.HIERARCHY_EVENT_MASK);
* }
*
* public void unistallUI(JComponent c) {
* super.uninstallUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(0);
* }
* </pre>
*
* @param e the {@code HierarchyEvent} to be processed
* @param l the layer this {@code LayerUI} instance is set to
*
* @see JLayer#setLayerEventMask(long)
* @see #installUI(javax.swing.JComponent)
* @see #uninstallUI(javax.swing.JComponent)
*/
protected void processHierarchyEvent(HierarchyEvent e, JLayer<? extends V> l) {
}
/**
* Processes hierarchy bounds event occurring on the {@link JLayer}
* or any of its subcomponents.
* <p/>
* This method is not called unless hierarchy bounds events are
* enabled for the {@code JLayer} objects, this {@code LayerUI} is set to.
* Hierarchy bounds events are enabled in the overridden {@link #installUI}
* method and should be disabled in the {@link #uninstallUI} method after that.
* <pre>
* public void installUI(JComponent c) {
* super.installUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
* }
*
* public void unistallUI(JComponent c) {
* super.uninstallUI(c);
* JLayer l = (JLayer) c;
* l.setLayerEventMask(0);
* }
* </pre>
*
* @param e the {@code HierarchyEvent} to be processed
* @param l the layer this {@code LayerUI} instance is set to
*
* @see JLayer#setLayerEventMask(long)
* @see #installUI(javax.swing.JComponent)
* @see #uninstallUI(javax.swing.JComponent)
*/
protected void processHierarchyBoundsEvent(HierarchyEvent e, JLayer<? extends V> l) {
} }
/** /**
@ -250,14 +627,29 @@ public class LayerUI<V extends Component>
propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue); propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue);
} }
/**
* Repaints all {@code JLayer} instances this {@code LayerUI} is set to.
* Call this method when the state of this {@code LayerUI} is changed
* and the visual appearance of its {@code JLayer} objects needs to be updated.
*
* @see Component#repaint()
*/
protected void repaintLayer() {
firePropertyChange("dirty", null, null);
}
/** /**
* Notifies the {@code LayerUI} when any of its property are changed * Notifies the {@code LayerUI} when any of its property are changed
* and enables updating every {@code JLayer} this {@code LayerUI} instance is set to. * and enables updating every {@code JLayer}
* this {@code LayerUI} instance is set to.
* *
* @param evt the PropertyChangeEvent generated by this {@code LayerUI} * @param evt the PropertyChangeEvent generated by this {@code LayerUI}
* @param l the {@code JLayer} this LayerUI is set to * @param l the {@code JLayer} this LayerUI is set to
*/ */
public void applyPropertyChange(PropertyChangeEvent evt, JLayer<? extends V> l) { public void applyPropertyChange(PropertyChangeEvent evt, JLayer<? extends V> l) {
if ("dirty".equals(evt.getPropertyName())) {
l.repaint();
}
} }
/** /**

View File

@ -486,7 +486,7 @@ public class BasicDirectoryModel extends AbstractListModel implements PropertyCh
} }
if (remSize > 0 && addSize == 0) { if (remSize > 0 && addSize == 0) {
fireIntervalRemoved(BasicDirectoryModel.this, remStart, remStart + remSize - 1); fireIntervalRemoved(BasicDirectoryModel.this, remStart, remStart + remSize - 1);
} else if (addSize > 0 && remSize == 0 && fileCache.size() > addSize) { } else if (addSize > 0 && remSize == 0 && addStart + addSize <= fileCache.size()) {
fireIntervalAdded(BasicDirectoryModel.this, addStart, addStart + addSize - 1); fireIntervalAdded(BasicDirectoryModel.this, addStart, addStart + addSize - 1);
} else { } else {
fireContentsChanged(); fireContentsChanged();

View File

@ -32,6 +32,7 @@ import javax.swing.*;
import javax.swing.plaf.*; import javax.swing.plaf.*;
import sun.swing.SwingUtilities2; import sun.swing.SwingUtilities2;
import sun.swing.PrintColorUIResource; import sun.swing.PrintColorUIResource;
import sun.swing.SwingLazyValue;
/** /**
* The default theme for the {@code MetalLookAndFeel}. * The default theme for the {@code MetalLookAndFeel}.
@ -128,7 +129,7 @@ public class OceanTheme extends DefaultMetalTheme {
* @throws NullPointerException if {@code table} is {@code null} * @throws NullPointerException if {@code table} is {@code null}
*/ */
public void addCustomEntriesToTable(UIDefaults table) { public void addCustomEntriesToTable(UIDefaults table) {
Object focusBorder = new UIDefaults.ProxyLazyValue( Object focusBorder = new SwingLazyValue(
"javax.swing.plaf.BorderUIResource$LineBorderUIResource", "javax.swing.plaf.BorderUIResource$LineBorderUIResource",
new Object[] {getPrimary1()}); new Object[] {getPrimary1()});
// .30 0 DDE8F3 white secondary2 // .30 0 DDE8F3 white secondary2

View File

@ -638,7 +638,7 @@ class SynthTableUI extends BasicTableUI implements SynthUI,
if ((b == null || b instanceof UIResource if ((b == null || b instanceof UIResource
|| component instanceof SynthBooleanTableCellRenderer) || component instanceof SynthBooleanTableCellRenderer)
&& !table.isCellSelected(row, column)) { && !table.isCellSelected(row, column)) {
if (alternateColor != null && row % 2 == 0) { if (alternateColor != null && row % 2 != 0) {
component.setBackground(alternateColor); component.setBackground(alternateColor);
} }
} }

View File

@ -214,8 +214,9 @@ public class DefaultTableCellRenderer extends JLabel
: table.getBackground(); : table.getBackground();
if (background == null || background instanceof javax.swing.plaf.UIResource) { if (background == null || background instanceof javax.swing.plaf.UIResource) {
Color alternateColor = DefaultLookup.getColor(this, ui, "Table.alternateRowColor"); Color alternateColor = DefaultLookup.getColor(this, ui, "Table.alternateRowColor");
if (alternateColor != null && row % 2 == 0) if (alternateColor != null && row % 2 != 0) {
background = alternateColor; background = alternateColor;
}
} }
super.setForeground(unselectedForeground != null super.setForeground(unselectedForeground != null
? unselectedForeground ? unselectedForeground

View File

@ -2069,7 +2069,7 @@ public abstract class JTextComponent extends JComponent implements Scrollable, A
* width to match its own * width to match its own
*/ */
public boolean getScrollableTracksViewportWidth() { public boolean getScrollableTracksViewportWidth() {
JViewport port = SwingUtilities2.getViewport(this); JViewport port = SwingUtilities.getParentViewport(this);
if (port != null) { if (port != null) {
return port.getWidth() > getPreferredSize().width; return port.getWidth() > getPreferredSize().width;
} }
@ -2090,7 +2090,7 @@ public abstract class JTextComponent extends JComponent implements Scrollable, A
* to match its own * to match its own
*/ */
public boolean getScrollableTracksViewportHeight() { public boolean getScrollableTracksViewportHeight() {
JViewport port = SwingUtilities2.getViewport(this); JViewport port = SwingUtilities.getParentViewport(this);
if (port != null) { if (port != null) {
return (port.getHeight() > getPreferredSize().height); return (port.getHeight() > getPreferredSize().height);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2000-2001 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2000-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -678,7 +678,7 @@ public interface GSSContext {
* are not definitive then the method will attempt to treat all * are not definitive then the method will attempt to treat all
* available bytes as part of the token.<p> * available bytes as part of the token.<p>
* *
* Other than the possible blocking behaviour described above, this * Other than the possible blocking behavior described above, this
* method is equivalent to the byte array based {@link #unwrap(byte[], * method is equivalent to the byte array based {@link #unwrap(byte[],
* int, int, MessageProp) unwrap} method.<p> * int, int, MessageProp) unwrap} method.<p>
* *
@ -826,7 +826,7 @@ public interface GSSContext {
* are not definitive then the method will attempt to treat all * are not definitive then the method will attempt to treat all
* available bytes as part of the token.<p> * available bytes as part of the token.<p>
* *
* Other than the possible blocking behaviour described above, this * Other than the possible blocking behavior described above, this
* method is equivalent to the byte array based {@link #verifyMIC(byte[], * method is equivalent to the byte array based {@link #verifyMIC(byte[],
* int, int, byte[], int, int, MessageProp) verifyMIC} method.<p> * int, int, byte[], int, int, MessageProp) verifyMIC} method.<p>
* *
@ -917,7 +917,7 @@ public interface GSSContext {
* getMutualAuthState} method.<p> * getMutualAuthState} method.<p>
* *
* @param state a boolean value indicating whether mutual * @param state a boolean value indicating whether mutual
* authentication shouls be used or not. * authentication should be used or not.
* @see #getMutualAuthState() * @see #getMutualAuthState()
* *
* @throws GSSException containing the following * @throws GSSException containing the following
@ -928,7 +928,7 @@ public interface GSSContext {
/** /**
* Requests that replay detection be enabled for the * Requests that replay detection be enabled for the
* per-message security services after context establishemnt. This * per-message security services after context establishment. This
* request can only be made on the context initiator's side and it has * request can only be made on the context initiator's side and it has
* to be done prior to the first call to * to be done prior to the first call to
* <code>initSecContext</code>. During context establishment replay * <code>initSecContext</code>. During context establishment replay
@ -958,7 +958,7 @@ public interface GSSContext {
/** /**
* Requests that sequence checking be enabled for the * Requests that sequence checking be enabled for the
* per-message security services after context establishemnt. This * per-message security services after context establishment. This
* request can only be made on the context initiator's side and it has * request can only be made on the context initiator's side and it has
* to be done prior to the first call to * to be done prior to the first call to
* <code>initSecContext</code>. During context establishment sequence * <code>initSecContext</code>. During context establishment sequence

View File

@ -63,8 +63,6 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.rmi.MarshalledObject;
import java.security.AccessControlContext; import java.security.AccessControlContext;
import java.security.AccessControlException; import java.security.AccessControlException;
import java.security.AccessController; import java.security.AccessController;
@ -493,6 +491,13 @@ public abstract class DataTransferer {
} }
} }
/**
* Returns {@code true} if the given type is a java.rmi.Remote.
*/
public static boolean isRemote(Class<?> type) {
return RMI.isRemote(type);
}
/** /**
* Returns an Iterator which traverses a SortedSet of Strings which are * Returns an Iterator which traverses a SortedSet of Strings which are
* a total order of the standard character sets supported by the JRE. The * a total order of the standard character sets supported by the JRE. The
@ -1360,7 +1365,7 @@ search:
// Source data is an RMI object // Source data is an RMI object
} else if (flavor.isRepresentationClassRemote()) { } else if (flavor.isRepresentationClassRemote()) {
MarshalledObject mo = new MarshalledObject(obj); Object mo = RMI.newMarshalledObject(obj);
ObjectOutputStream oos = new ObjectOutputStream(bos); ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(mo); oos.writeObject(mo);
oos.close(); oos.close();
@ -1671,7 +1676,7 @@ search:
try { try {
byte[] ba = inputStreamToByteArray(str); byte[] ba = inputStreamToByteArray(str);
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(ba)); ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(ba));
Object ret = ((MarshalledObject)(ois.readObject())).get(); Object ret = RMI.getMarshalledObject(ois.readObject());
ois.close(); ois.close();
str.close(); str.close();
return ret; return ret;
@ -2669,8 +2674,12 @@ search:
Integer.valueOf(0)); Integer.valueOf(0));
nonTextRepresentationsMap.put(java.io.Serializable.class, nonTextRepresentationsMap.put(java.io.Serializable.class,
Integer.valueOf(1)); Integer.valueOf(1));
nonTextRepresentationsMap.put(java.rmi.Remote.class,
Integer.valueOf(2)); Class<?> remoteClass = RMI.remoteClass();
if (remoteClass != null) {
nonTextRepresentationsMap.put(remoteClass,
Integer.valueOf(2));
}
nonTextRepresentations = nonTextRepresentations =
Collections.unmodifiableMap(nonTextRepresentationsMap); Collections.unmodifiableMap(nonTextRepresentationsMap);
@ -2900,4 +2909,95 @@ search:
} }
} }
} }
/**
* A class that provides access to java.rmi.Remote and java.rmi.MarshalledObject
* without creating a static dependency.
*/
private static class RMI {
private static final Class<?> remoteClass = getClass("java.rmi.Remote");
private static final Class<?> marshallObjectClass =
getClass("java.rmi.MarshalledObject");
private static final Constructor<?> marshallCtor =
getConstructor(marshallObjectClass, Object.class);
private static final Method marshallGet =
getMethod(marshallObjectClass, "get");
private static Class<?> getClass(String name) {
try {
return Class.forName(name, true, null);
} catch (ClassNotFoundException e) {
return null;
}
}
private static Constructor<?> getConstructor(Class<?> c, Class<?>... types) {
try {
return (c == null) ? null : c.getDeclaredConstructor(types);
} catch (NoSuchMethodException x) {
throw new AssertionError(x);
}
}
private static Method getMethod(Class<?> c, String name, Class<?>... types) {
try {
return (c == null) ? null : c.getMethod(name, types);
} catch (NoSuchMethodException e) {
throw new AssertionError(e);
}
}
/**
* Returns {@code true} if the given class is java.rmi.Remote.
*/
static boolean isRemote(Class<?> c) {
return (remoteClass == null) ? null : remoteClass.isAssignableFrom(c);
}
/**
* Returns java.rmi.Remote.class if RMI is present; otherwise {@code null}.
*/
static Class<?> remoteClass() {
return remoteClass;
}
/**
* Returns a new MarshalledObject containing the serialized representation
* of the given object.
*/
static Object newMarshalledObject(Object obj) throws IOException {
try {
return marshallCtor.newInstance(obj);
} catch (InstantiationException x) {
throw new AssertionError(x);
} catch (IllegalAccessException x) {
throw new AssertionError(x);
} catch (InvocationTargetException x) {
Throwable cause = x.getCause();
if (cause instanceof IOException)
throw (IOException)cause;
throw new AssertionError(x);
}
}
/**
* Returns a new copy of the contained marshalled object.
*/
static Object getMarshalledObject(Object obj)
throws IOException, ClassNotFoundException
{
try {
return marshallGet.invoke(obj);
} catch (IllegalAccessException x) {
throw new AssertionError(x);
} catch (InvocationTargetException x) {
Throwable cause = x.getCause();
if (cause instanceof IOException)
throw (IOException)cause;
if (cause instanceof ClassNotFoundException)
throw (ClassNotFoundException)cause;
throw new AssertionError(x);
}
}
}
} }

View File

@ -358,7 +358,9 @@ class ExecutableInputMethodManager extends InputMethodManager
AppContext requesterAppContext = SunToolkit.targetToAppContext(requester); AppContext requesterAppContext = SunToolkit.targetToAppContext(requester);
synchronized (lock) { synchronized (lock) {
SunToolkit.postEvent(requesterAppContext, event); SunToolkit.postEvent(requesterAppContext, event);
lock.wait(); while (!event.isDispatched()) {
lock.wait();
}
} }
Throwable eventThrowable = event.getThrowable(); Throwable eventThrowable = event.getThrowable();

View File

@ -201,6 +201,8 @@ public abstract class ShellFolder extends File {
private static ShellFolderManager shellFolderManager; private static ShellFolderManager shellFolderManager;
private static Invoker invoker;
static { static {
String managerClassName = (String)Toolkit.getDefaultToolkit(). String managerClassName = (String)Toolkit.getDefaultToolkit().
getDesktopProperty("Shell.shellFolderManager"); getDesktopProperty("Shell.shellFolderManager");
@ -225,6 +227,8 @@ public abstract class ShellFolder extends File {
throw new Error ("Could not access Shell Folder Manager: " throw new Error ("Could not access Shell Folder Manager: "
+ managerClass.getName()); + managerClass.getName());
} }
invoker = shellFolderManager.createInvoker();
} }
/** /**
@ -486,21 +490,6 @@ public abstract class ShellFolder extends File {
return null; return null;
} }
private static Invoker invoker;
/**
* Provides the single access point to the {@link Invoker}. It is guaranteed that the value
* returned by this method will be always the same.
*
* @return the singleton instance of {@link Invoker}
*/
public static Invoker getInvoker() {
if (invoker == null) {
invoker = shellFolderManager.createInvoker();
}
return invoker;
}
/** /**
* Invokes the {@code task} which doesn't throw checked exceptions * Invokes the {@code task} which doesn't throw checked exceptions
* from its {@code call} method. If invokation is interrupted then Thread.currentThread().isInterrupted() will * from its {@code call} method. If invokation is interrupted then Thread.currentThread().isInterrupted() will
@ -522,7 +511,7 @@ public abstract class ShellFolder extends File {
public static <T, E extends Throwable> T invoke(Callable<T> task, Class<E> exceptionClass) public static <T, E extends Throwable> T invoke(Callable<T> task, Class<E> exceptionClass)
throws InterruptedException, E { throws InterruptedException, E {
try { try {
return getInvoker().invoke(task); return invoker.invoke(task);
} catch (Exception e) { } catch (Exception e) {
if (e instanceof RuntimeException) { if (e instanceof RuntimeException) {
// Rethrow unchecked exceptions // Rethrow unchecked exceptions

View File

@ -320,21 +320,6 @@ public abstract class Font2D {
lastFontStrike = new SoftReference(strike); lastFontStrike = new SoftReference(strike);
StrikeCache.refStrike(strike); StrikeCache.refStrike(strike);
return strike; return strike;
} else {
/* We have found a cleared reference that has not yet
* been removed by the disposer.
* If we make this reference unreachable by removing it
* from the map,or overwriting it with a new reference to
* a new strike, then it is possible it may never be
* enqueued for disposal. That is the implication of
* the docs for java.lang.ref. So on finding a cleared
* reference, we need to dispose the native resources,
* if they haven't already been freed.
* The reference object needs to have a reference to
* the disposer instance for this to occur.
*/
((StrikeCache.DisposableStrike)strikeRef)
.getDisposer().dispose();
} }
} }
/* When we create a new FontStrike instance, we *must* /* When we create a new FontStrike instance, we *must*

View File

@ -171,7 +171,7 @@ public final class FontDesignMetrics extends FontMetrics {
* out we can clear the keys from the table. * out we can clear the keys from the table.
*/ */
private static class KeyReference extends SoftReference private static class KeyReference extends SoftReference
implements DisposerRecord { implements DisposerRecord, Disposer.PollDisposable {
static ReferenceQueue queue = Disposer.getQueue(); static ReferenceQueue queue = Disposer.getQueue();

View File

@ -25,6 +25,7 @@
package sun.font; package sun.font;
import sun.java2d.Disposer;
import sun.java2d.DisposerRecord; import sun.java2d.DisposerRecord;
/* /*
@ -49,7 +50,8 @@ import sun.java2d.DisposerRecord;
* entries would be removed much more promptly than we need. * entries would be removed much more promptly than we need.
*/ */
class FontStrikeDisposer implements DisposerRecord { class FontStrikeDisposer
implements DisposerRecord, Disposer.PollDisposable {
Font2D font2D; Font2D font2D;
FontStrikeDesc desc; FontStrikeDesc desc;

View File

@ -254,9 +254,20 @@ public final class StrikeCache {
// because they may be accessed on that thread at the time of the // because they may be accessed on that thread at the time of the
// disposal (for example, when the accel. cache is invalidated) // disposal (for example, when the accel. cache is invalidated)
// REMIND: this look a bit heavyweight, but should be ok // Whilst this is a bit heavyweight, in most applications
// because strike disposal is a relatively infrequent operation, // strike disposal is a relatively infrequent operation, so it
// more worrisome is the necessity of getting a GC here. // doesn't matter. But in some tests that use vast numbers
// of strikes, the switching back and forth is measurable.
// So the "pollRemove" call is added to batch up the work.
// If we are polling we know we've already been called back
// and can directly dispose the record.
// Also worrisome is the necessity of getting a GC here.
if (Disposer.pollingQueue) {
doDispose(disposer);
return;
}
RenderQueue rq = null; RenderQueue rq = null;
GraphicsEnvironment ge = GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsEnvironment.getLocalGraphicsEnvironment();
@ -277,6 +288,7 @@ public final class StrikeCache {
rq.flushAndInvokeNow(new Runnable() { rq.flushAndInvokeNow(new Runnable() {
public void run() { public void run() {
doDispose(disposer); doDispose(disposer);
Disposer.pollRemove();
} }
}); });
} finally { } finally {

View File

@ -29,6 +29,7 @@ import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue; import java.lang.ref.ReferenceQueue;
import java.lang.ref.PhantomReference; import java.lang.ref.PhantomReference;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Hashtable; import java.util.Hashtable;
/** /**
@ -146,6 +147,7 @@ public class Disposer implements Runnable {
rec.dispose(); rec.dispose();
obj = null; obj = null;
rec = null; rec = null;
clearDeferredRecords();
} catch (Exception e) { } catch (Exception e) {
System.out.println("Exception while removing reference: " + e); System.out.println("Exception while removing reference: " + e);
e.printStackTrace(); e.printStackTrace();
@ -153,6 +155,85 @@ public class Disposer implements Runnable {
} }
} }
/*
* This is a marker interface that, if implemented, means it
* doesn't acquire any special locks, and is safe to
* be disposed in the poll loop on whatever thread
* which happens to be the Toolkit thread, is in use.
*/
public static interface PollDisposable {
};
private static ArrayList<DisposerRecord> deferredRecords = null;
private static void clearDeferredRecords() {
if (deferredRecords == null || deferredRecords.isEmpty()) {
return;
}
for (int i=0;i<deferredRecords.size(); i++) {
try {
DisposerRecord rec = deferredRecords.get(i);
rec.dispose();
} catch (Exception e) {
System.out.println("Exception while disposing deferred rec.");
e.printStackTrace();
}
}
deferredRecords.clear();
}
/*
* Set to indicate the queue is presently being polled.
*/
public static volatile boolean pollingQueue = false;
/*
* The pollRemove() method is called back from a dispose method
* that is running on the toolkit thread and wants to
* dispose any pending refs that are safe to be disposed
* on that thread.
*/
public static void pollRemove() {
/* This should never be called recursively, so this check
* is just a safeguard against the unexpected.
*/
if (pollingQueue) {
return;
}
Object obj;
pollingQueue = true;
int freed = 0;
int deferred = 0;
try {
while ((obj = queue.poll()) != null
&& freed < 10000 && deferred < 100) {
freed++;
((Reference)obj).clear();
DisposerRecord rec = (DisposerRecord)records.remove(obj);
if (rec instanceof PollDisposable) {
rec.dispose();
obj = null;
rec = null;
} else {
if (rec == null) { // shouldn't happen, but just in case.
continue;
}
deferred++;
if (deferredRecords == null) {
deferredRecords = new ArrayList<DisposerRecord>(5);
}
deferredRecords.add(rec);
}
}
} catch (Exception e) {
System.out.println("Exception while removing reference: " + e);
e.printStackTrace();
} finally {
pollingQueue = false;
}
}
private static native void initIDs(); private static native void initIDs();
/* /*

View File

@ -257,7 +257,6 @@ public final class SunGraphics2D
font = defaultFont; font = defaultFont;
} }
loops = sd.getRenderLoops(this);
setDevClip(sd.getBounds()); setDevClip(sd.getBounds());
invalidatePipe(); invalidatePipe();
} }
@ -367,6 +366,7 @@ public final class SunGraphics2D
shapepipe = invalidpipe; shapepipe = invalidpipe;
textpipe = invalidpipe; textpipe = invalidpipe;
imagepipe = invalidpipe; imagepipe = invalidpipe;
loops = null;
} }
public void validatePipe() { public void validatePipe() {

View File

@ -69,6 +69,7 @@ import sun.java2d.pipe.DrawImagePipe;
import sun.java2d.pipe.DrawImage; import sun.java2d.pipe.DrawImage;
import sun.awt.SunHints; import sun.awt.SunHints;
import sun.awt.image.SurfaceManager; import sun.awt.image.SurfaceManager;
import sun.java2d.pipe.LoopBasedPipe;
/** /**
* This class provides various pieces of information relevant to a * This class provides various pieces of information relevant to a
@ -506,7 +507,6 @@ public abstract class SurfaceData
sg2d.textpipe = solidTextRenderer; sg2d.textpipe = solidTextRenderer;
} }
sg2d.shapepipe = colorPrimitives; sg2d.shapepipe = colorPrimitives;
sg2d.loops = getRenderLoops(sg2d);
// assert(sg2d.surfaceData == this); // assert(sg2d.surfaceData == this);
} }
} else if (sg2d.compositeState == sg2d.COMP_CUSTOM) { } else if (sg2d.compositeState == sg2d.COMP_CUSTOM) {
@ -603,9 +603,18 @@ public abstract class SurfaceData
sg2d.textpipe = getTextPipe(sg2d, false /* AA==OFF */); sg2d.textpipe = getTextPipe(sg2d, false /* AA==OFF */);
sg2d.shapepipe = colorPrimitives; sg2d.shapepipe = colorPrimitives;
sg2d.loops = getRenderLoops(sg2d);
// assert(sg2d.surfaceData == this); // assert(sg2d.surfaceData == this);
} }
// check for loops
if (sg2d.textpipe instanceof LoopBasedPipe ||
sg2d.shapepipe instanceof LoopBasedPipe ||
sg2d.fillpipe instanceof LoopBasedPipe ||
sg2d.drawpipe instanceof LoopBasedPipe ||
sg2d.imagepipe instanceof LoopBasedPipe)
{
sg2d.loops = getRenderLoops(sg2d);
}
} }
/* Return the text pipe to be used based on the graphics AA hint setting, /* Return the text pipe to be used based on the graphics AA hint setting,

View File

@ -34,8 +34,9 @@ import sun.font.GlyphList;
* a solid source colour to an opaque destination. * a solid source colour to an opaque destination.
*/ */
public class AATextRenderer extends GlyphListLoopPipe { public class AATextRenderer extends GlyphListLoopPipe
implements LoopBasedPipe
{
protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) { protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) {
sg2d.loops.drawGlyphListAALoop.DrawGlyphListAA(sg2d, sg2d.surfaceData, sg2d.loops.drawGlyphListAALoop.DrawGlyphListAA(sg2d, sg2d.surfaceData,
gl); gl);

View File

@ -36,8 +36,9 @@ import sun.font.GlyphList;
* the installed loop may not match the glyphvector. * the installed loop may not match the glyphvector.
*/ */
public abstract class GlyphListLoopPipe extends GlyphListPipe { public abstract class GlyphListLoopPipe extends GlyphListPipe
implements LoopBasedPipe
{
protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl, protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl,
int aaHint) { int aaHint) {
switch (aaHint) { switch (aaHint) {

View File

@ -1,11 +1,12 @@
/* /*
* Copyright 2007 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as * under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. * published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
* *
* This code is distributed in the hope that it will be useful, but WITHOUT * This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
@ -22,25 +23,15 @@
* have any questions. * have any questions.
*/ */
/* DO NOT EDIT THIS FILE - it is machine generated */ package sun.java2d.pipe;
#include <jni.h> /**
/* Header for class libraryCaller */ * This is a marker interface used by Pipes that need RenderLoops.
* RenderLoops are validated in SurfaceData when a pipe is recognised to
#ifndef _Included_libraryCaller * implement this interface.
#define _Included_libraryCaller *
#ifdef __cplusplus * @author Mario Torre <neugens@aicas.com>
extern "C" {
#endif
/*
* Class: libraryCaller
* Method: number
* Signature: ()I
*/ */
JNIEXPORT jint JNICALL Java_libraryCaller_number public interface LoopBasedPipe {
(JNIEnv *, jclass);
#ifdef __cplusplus
} }
#endif
#endif

View File

@ -46,7 +46,8 @@ import sun.awt.SunHints;
public class LoopPipe public class LoopPipe
implements PixelDrawPipe, implements PixelDrawPipe,
PixelFillPipe, PixelFillPipe,
ShapeDrawPipe ShapeDrawPipe,
LoopBasedPipe
{ {
final static RenderingEngine RenderEngine = RenderingEngine.getInstance(); final static RenderingEngine RenderEngine = RenderingEngine.getInstance();

View File

@ -35,8 +35,9 @@ import sun.font.GlyphList;
* a solid source colour to an opaque destination. * a solid source colour to an opaque destination.
*/ */
public class SolidTextRenderer extends GlyphListLoopPipe { public class SolidTextRenderer extends GlyphListLoopPipe
implements LoopBasedPipe
{
protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) { protected void drawGlyphList(SunGraphics2D sg2d, GlyphList gl) {
sg2d.loops.drawGlyphListLoop.DrawGlyphList(sg2d, sg2d.surfaceData, gl); sg2d.loops.drawGlyphListLoop.DrawGlyphList(sg2d, sg2d.surfaceData, gl);
} }

View File

@ -65,7 +65,9 @@ public abstract class SpanShapeRenderer implements ShapeDrawPipe {
} }
} }
public static class Simple extends SpanShapeRenderer { public static class Simple extends SpanShapeRenderer
implements LoopBasedPipe
{
public Object startSequence(SunGraphics2D sg, Shape s, public Object startSequence(SunGraphics2D sg, Shape s,
Rectangle devR, int[] bbox) { Rectangle devR, int[] bbox) {
return sg; return sg;

View File

@ -775,10 +775,12 @@ public class Renderer extends LineSink {
// Free sorting arrays if larger than maximum size // Free sorting arrays if larger than maximum size
private void crossingListFinished() { private void crossingListFinished() {
if (crossings.length > DEFAULT_CROSSINGS_SIZE) { if (crossings != null && crossings.length > DEFAULT_CROSSINGS_SIZE) {
crossings = new int[DEFAULT_CROSSINGS_SIZE]; crossings = new int[DEFAULT_CROSSINGS_SIZE];
} }
if (crossingIndices.length > DEFAULT_INDICES_SIZE) { if (crossingIndices != null &&
crossingIndices.length > DEFAULT_INDICES_SIZE)
{
crossingIndices = new int[DEFAULT_INDICES_SIZE]; crossingIndices = new int[DEFAULT_INDICES_SIZE];
} }
} }

View File

@ -25,6 +25,7 @@
package sun.net.www.protocol.http.spnego; package sun.net.www.protocol.http.spnego;
import com.sun.security.jgss.ExtendedGSSContext;
import java.io.IOException; import java.io.IOException;
import org.ietf.jgss.GSSContext; import org.ietf.jgss.GSSContext;
@ -100,15 +101,10 @@ public class NegotiatorImpl extends Negotiator {
null, null,
GSSContext.DEFAULT_LIFETIME); GSSContext.DEFAULT_LIFETIME);
// In order to support credential delegation in HTTP/SPNEGO, // Always respect delegation policy in HTTP/SPNEGO.
// we always request it before initSecContext. The current if (context instanceof ExtendedGSSContext) {
// implementation will check the OK-AS-DELEGATE flag inside ((ExtendedGSSContext)context).requestDelegPolicy(true);
// the service ticket of the web server, and only enable }
// delegation when this flag is set. This check is only
// performed when the GSS caller is CALLER_HTTP_NEGOTIATE,
// so all other normal GSS-API calls are not affected.
context.requestCredDeleg(true);
oneToken = context.initSecContext(new byte[0], 0, 0); oneToken = context.initSecContext(new byte[0], 0, 0);
} }

View File

@ -89,7 +89,8 @@ import com.sun.security.jgss.*;
*/ */
class GSSContextImpl implements ExtendedGSSContext { class GSSContextImpl implements ExtendedGSSContext {
private GSSManagerImpl gssManager = null; private final GSSManagerImpl gssManager;
private final boolean initiator;
// private flags for the context state // private flags for the context state
private static final int PRE_INIT = 1; private static final int PRE_INIT = 1;
@ -99,14 +100,12 @@ class GSSContextImpl implements ExtendedGSSContext {
// instance variables // instance variables
private int currentState = PRE_INIT; private int currentState = PRE_INIT;
private boolean initiator;
private GSSContextSpi mechCtxt = null; private GSSContextSpi mechCtxt = null;
private Oid mechOid = null; private Oid mechOid = null;
private ObjectIdentifier objId = null; private ObjectIdentifier objId = null;
private GSSCredentialImpl myCred = null; private GSSCredentialImpl myCred = null;
private GSSCredentialImpl delegCred = null;
private GSSNameImpl srcName = null; private GSSNameImpl srcName = null;
private GSSNameImpl targName = null; private GSSNameImpl targName = null;
@ -121,6 +120,7 @@ class GSSContextImpl implements ExtendedGSSContext {
private boolean reqSequenceDetState = true; private boolean reqSequenceDetState = true;
private boolean reqCredDelegState = false; private boolean reqCredDelegState = false;
private boolean reqAnonState = false; private boolean reqAnonState = false;
private boolean reqDelegPolicyState = false;
/** /**
* Creates a GSSContextImp on the context initiator's side. * Creates a GSSContextImp on the context initiator's side.
@ -221,6 +221,7 @@ class GSSContextImpl implements ExtendedGSSContext {
mechCtxt.requestSequenceDet(reqSequenceDetState); mechCtxt.requestSequenceDet(reqSequenceDetState);
mechCtxt.requestAnonymity(reqAnonState); mechCtxt.requestAnonymity(reqAnonState);
mechCtxt.setChannelBinding(channelBindings); mechCtxt.setChannelBinding(channelBindings);
mechCtxt.requestDelegPolicy(reqDelegPolicyState);
objId = new ObjectIdentifier(mechOid.toString()); objId = new ObjectIdentifier(mechOid.toString());
@ -465,42 +466,42 @@ class GSSContextImpl implements ExtendedGSSContext {
} }
public void requestMutualAuth(boolean state) throws GSSException { public void requestMutualAuth(boolean state) throws GSSException {
if (mechCtxt == null) if (mechCtxt == null && initiator)
reqMutualAuthState = state; reqMutualAuthState = state;
} }
public void requestReplayDet(boolean state) throws GSSException { public void requestReplayDet(boolean state) throws GSSException {
if (mechCtxt == null) if (mechCtxt == null && initiator)
reqReplayDetState = state; reqReplayDetState = state;
} }
public void requestSequenceDet(boolean state) throws GSSException { public void requestSequenceDet(boolean state) throws GSSException {
if (mechCtxt == null) if (mechCtxt == null && initiator)
reqSequenceDetState = state; reqSequenceDetState = state;
} }
public void requestCredDeleg(boolean state) throws GSSException { public void requestCredDeleg(boolean state) throws GSSException {
if (mechCtxt == null) if (mechCtxt == null && initiator)
reqCredDelegState = state; reqCredDelegState = state;
} }
public void requestAnonymity(boolean state) throws GSSException { public void requestAnonymity(boolean state) throws GSSException {
if (mechCtxt == null) if (mechCtxt == null && initiator)
reqAnonState = state; reqAnonState = state;
} }
public void requestConf(boolean state) throws GSSException { public void requestConf(boolean state) throws GSSException {
if (mechCtxt == null) if (mechCtxt == null && initiator)
reqConfState = state; reqConfState = state;
} }
public void requestInteg(boolean state) throws GSSException { public void requestInteg(boolean state) throws GSSException {
if (mechCtxt == null) if (mechCtxt == null && initiator)
reqIntegState = state; reqIntegState = state;
} }
public void requestLifetime(int lifetime) throws GSSException { public void requestLifetime(int lifetime) throws GSSException {
if (mechCtxt == null) if (mechCtxt == null && initiator)
reqLifetime = lifetime; reqLifetime = lifetime;
} }
@ -630,6 +631,8 @@ class GSSContextImpl implements ExtendedGSSContext {
targName = null; targName = null;
} }
// ExtendedGSSContext methods:
@Override @Override
public Object inquireSecContext(InquireType type) throws GSSException { public Object inquireSecContext(InquireType type) throws GSSException {
SecurityManager security = System.getSecurityManager(); SecurityManager security = System.getSecurityManager();
@ -641,4 +644,18 @@ class GSSContextImpl implements ExtendedGSSContext {
} }
return mechCtxt.inquireSecContext(type); return mechCtxt.inquireSecContext(type);
} }
@Override
public void requestDelegPolicy(boolean state) throws GSSException {
if (mechCtxt == null && initiator)
reqDelegPolicyState = state;
}
@Override
public boolean getDelegPolicyState() {
if (mechCtxt != null)
return mechCtxt.getDelegPolicyState();
else
return reqDelegPolicyState;
}
} }

View File

@ -85,32 +85,39 @@ abstract class InitialToken extends Krb5Token {
int size = CHECKSUM_LENGTH_SIZE + CHECKSUM_BINDINGS_SIZE + int size = CHECKSUM_LENGTH_SIZE + CHECKSUM_BINDINGS_SIZE +
CHECKSUM_FLAGS_SIZE; CHECKSUM_FLAGS_SIZE;
if (context.getCredDelegState()) { if (!tgt.isForwardable()) {
if (context.getCaller() instanceof HttpCaller && context.setCredDelegState(false);
!serviceTicket.getFlags()[Krb5.TKT_OPTS_DELEGATE]) { context.setDelegPolicyState(false);
// When the caller is HTTP/SPNEGO and OK-AS-DELEGATE } else if (context.getCredDelegState()) {
// is not present in the service ticket, delegation if (context.getDelegPolicyState()) {
// is disabled. if (!serviceTicket.checkDelegate()) {
context.setCredDelegState(false); // delegation not permitted by server policy, mark it
} else if (!tgt.isForwardable()) { context.setDelegPolicyState(false);
// XXX log this resetting of delegation state
context.setCredDelegState(false);
} else {
KrbCred krbCred = null;
CipherHelper cipherHelper =
context.getCipherHelper(serviceTicket.getSessionKey());
if (useNullKey(cipherHelper)) {
krbCred = new KrbCred(tgt, serviceTicket,
EncryptionKey.NULL_KEY);
} else {
krbCred = new KrbCred(tgt, serviceTicket,
serviceTicket.getSessionKey());
} }
krbCredMessage = krbCred.getMessage();
size += CHECKSUM_DELEG_OPT_SIZE +
CHECKSUM_DELEG_LGTH_SIZE +
krbCredMessage.length;
} }
} else if (context.getDelegPolicyState()) {
if (serviceTicket.checkDelegate()) {
context.setCredDelegState(true);
} else {
context.setDelegPolicyState(false);
}
}
if (context.getCredDelegState()) {
KrbCred krbCred = null;
CipherHelper cipherHelper =
context.getCipherHelper(serviceTicket.getSessionKey());
if (useNullKey(cipherHelper)) {
krbCred = new KrbCred(tgt, serviceTicket,
EncryptionKey.NULL_KEY);
} else {
krbCred = new KrbCred(tgt, serviceTicket,
serviceTicket.getSessionKey());
}
krbCredMessage = krbCred.getMessage();
size += CHECKSUM_DELEG_OPT_SIZE +
CHECKSUM_DELEG_LGTH_SIZE +
krbCredMessage.length;
} }
checksumBytes = new byte[size]; checksumBytes = new byte[size];
@ -296,6 +303,7 @@ abstract class InitialToken extends Krb5Token {
return delegCreds; return delegCreds;
} }
// Only called by acceptor
public void setContextFlags(Krb5Context context) { public void setContextFlags(Krb5Context context) {
// default for cred delegation is false // default for cred delegation is false
if ((flags & CHECKSUM_DELEG_FLAG) > 0) if ((flags & CHECKSUM_DELEG_FLAG) > 0)

View File

@ -78,6 +78,7 @@ class Krb5Context implements GSSContextSpi {
private boolean sequenceDetState = true; private boolean sequenceDetState = true;
private boolean confState = true; private boolean confState = true;
private boolean integState = true; private boolean integState = true;
private boolean delegPolicyState = false;
private int mySeqNumber; private int mySeqNumber;
private int peerSeqNumber; private int peerSeqNumber;
@ -299,6 +300,21 @@ class Krb5Context implements GSSContextSpi {
return sequenceDetState || replayDetState; return sequenceDetState || replayDetState;
} }
/**
* Requests that the deleg policy be respected.
*/
public final void requestDelegPolicy(boolean value) {
if (state == STATE_NEW && isInitiator())
delegPolicyState = value;
}
/**
* Is deleg policy respected?
*/
public final boolean getDelegPolicyState() {
return delegPolicyState;
}
/* /*
* Anonymity is a little different in that after an application * Anonymity is a little different in that after an application
* requests anonymity it will want to know whether the mechanism * requests anonymity it will want to know whether the mechanism
@ -422,6 +438,10 @@ class Krb5Context implements GSSContextSpi {
integState = state; integState = state;
} }
final void setDelegPolicyState(boolean state) {
delegPolicyState = state;
}
/** /**
* Sets the channel bindings to be used during context * Sets the channel bindings to be used during context
* establishment. * establishment.

View File

@ -124,6 +124,8 @@ public interface GSSContextSpi {
public void requestInteg(boolean state) throws GSSException; public void requestInteg(boolean state) throws GSSException;
public void requestDelegPolicy(boolean state) throws GSSException;
public void setChannelBinding(ChannelBinding cb) throws GSSException; public void setChannelBinding(ChannelBinding cb) throws GSSException;
public boolean getCredDelegState(); public boolean getCredDelegState();
@ -136,6 +138,8 @@ public interface GSSContextSpi {
public boolean getAnonymityState(); public boolean getAnonymityState();
public boolean getDelegPolicyState();
public boolean isTransferable() throws GSSException; public boolean isTransferable() throws GSSException;
public boolean isProtReady(); public boolean isProtReady();

View File

@ -63,6 +63,7 @@ public class SpNegoContext implements GSSContextSpi {
private boolean sequenceDetState = true; private boolean sequenceDetState = true;
private boolean confState = true; private boolean confState = true;
private boolean integState = true; private boolean integState = true;
private boolean delegPolicyState = false;
private GSSNameSpi peerName = null; private GSSNameSpi peerName = null;
private GSSNameSpi myName = null; private GSSNameSpi myName = null;
@ -153,6 +154,14 @@ public class SpNegoContext implements GSSContextSpi {
integState = value; integState = value;
} }
/**
* Requests that deleg policy be respected.
*/
public final void requestDelegPolicy(boolean value) throws GSSException {
if (state == STATE_NEW && isInitiator())
delegPolicyState = value;
}
/** /**
* Is integrity available? * Is integrity available?
*/ */
@ -160,6 +169,19 @@ public class SpNegoContext implements GSSContextSpi {
return integState; return integState;
} }
/**
* Is deleg policy respected?
*/
public final boolean getDelegPolicyState() {
if (isInitiator() && mechContext != null &&
mechContext instanceof ExtendedGSSContext &&
(state == STATE_IN_PROCESS || state == STATE_DONE)) {
return ((ExtendedGSSContext)mechContext).getDelegPolicyState();
} else {
return delegPolicyState;
}
}
/** /**
* Requests that credential delegation be done during context * Requests that credential delegation be done during context
* establishment. * establishment.
@ -173,7 +195,7 @@ public class SpNegoContext implements GSSContextSpi {
* Is credential delegation enabled? * Is credential delegation enabled?
*/ */
public final boolean getCredDelegState() { public final boolean getCredDelegState() {
if (mechContext != null && if (isInitiator() && mechContext != null &&
(state == STATE_IN_PROCESS || state == STATE_DONE)) { (state == STATE_IN_PROCESS || state == STATE_DONE)) {
return mechContext.getCredDelegState(); return mechContext.getCredDelegState();
} else { } else {
@ -201,30 +223,6 @@ public class SpNegoContext implements GSSContextSpi {
return mutualAuthState; return mutualAuthState;
} }
final void setCredDelegState(boolean state) {
credDelegState = state;
}
final void setMutualAuthState(boolean state) {
mutualAuthState = state;
}
final void setReplayDetState(boolean state) {
replayDetState = state;
}
final void setSequenceDetState(boolean state) {
sequenceDetState = state;
}
final void setConfState(boolean state) {
confState = state;
}
final void setIntegState(boolean state) {
integState = state;
}
/** /**
* Returns the mechanism oid. * Returns the mechanism oid.
* *
@ -319,14 +317,9 @@ public class SpNegoContext implements GSSContextSpi {
mechToken = GSS_initSecContext(null); mechToken = GSS_initSecContext(null);
errorCode = GSSException.DEFECTIVE_TOKEN; errorCode = GSSException.DEFECTIVE_TOKEN;
byte[] micToken = null;
if (!GSSUtil.useMSInterop()) {
// calculate MIC only in normal mode
micToken = generateMechListMIC(DER_mechTypes);
}
// generate SPNEGO token // generate SPNEGO token
initToken = new NegTokenInit(DER_mechTypes, getContextFlags(), initToken = new NegTokenInit(DER_mechTypes, getContextFlags(),
mechToken, micToken); mechToken, null);
if (DEBUG) { if (DEBUG) {
System.out.println("SpNegoContext.initSecContext: " + System.out.println("SpNegoContext.initSecContext: " +
"sending token of type = " + "sending token of type = " +
@ -585,15 +578,9 @@ public class SpNegoContext implements GSSContextSpi {
"negotiated result = " + negoResult); "negotiated result = " + negoResult);
} }
// calculate MIC only in normal mode
byte[] micToken = null;
if (!GSSUtil.useMSInterop() && valid) {
micToken = generateMechListMIC(DER_mechTypes);
}
// generate SPNEGO token // generate SPNEGO token
NegTokenTarg targToken = new NegTokenTarg(negoResult.ordinal(), NegTokenTarg targToken = new NegTokenTarg(negoResult.ordinal(),
mech_wanted, accept_token, micToken); mech_wanted, accept_token, null);
if (DEBUG) { if (DEBUG) {
System.out.println("SpNegoContext.acceptSecContext: " + System.out.println("SpNegoContext.acceptSecContext: " +
"sending token of type = " + "sending token of type = " +
@ -653,6 +640,10 @@ public class SpNegoContext implements GSSContextSpi {
throw gssException; throw gssException;
} }
if (state == STATE_DONE) {
// now set the context flags for acceptor
setContextFlags();
}
return retVal; return retVal;
} }
@ -703,36 +694,39 @@ public class SpNegoContext implements GSSContextSpi {
return out; return out;
} }
// Only called on acceptor side. On the initiator side, most flags
// are already set at request. For those that might get chanegd,
// state from mech below is used.
private void setContextFlags() { private void setContextFlags() {
if (mechContext != null) { if (mechContext != null) {
// default for cred delegation is false // default for cred delegation is false
if (mechContext.getCredDelegState()) { if (mechContext.getCredDelegState()) {
setCredDelegState(true); credDelegState = true;
} }
// default for the following are true // default for the following are true
if (!mechContext.getMutualAuthState()) { if (!mechContext.getMutualAuthState()) {
setMutualAuthState(false); mutualAuthState = false;
} }
if (!mechContext.getReplayDetState()) { if (!mechContext.getReplayDetState()) {
setReplayDetState(false); replayDetState = false;
} }
if (!mechContext.getSequenceDetState()) { if (!mechContext.getSequenceDetState()) {
setSequenceDetState(false); sequenceDetState = false;
} }
if (!mechContext.getIntegState()) { if (!mechContext.getIntegState()) {
setIntegState(false); integState = false;
} }
if (!mechContext.getConfState()) { if (!mechContext.getConfState()) {
setConfState(false); confState = false;
} }
} }
} }
/** /**
* generate MIC on mechList * generate MIC on mechList. Not used at the moment.
*/ */
private byte[] generateMechListMIC(byte[] mechTypes) /*private byte[] generateMechListMIC(byte[] mechTypes)
throws GSSException { throws GSSException {
// sanity check the required input // sanity check the required input
@ -769,7 +763,7 @@ public class SpNegoContext implements GSSContextSpi {
} }
} }
return mic; return mic;
} }*/
/** /**
* verify MIC on MechList * verify MIC on MechList
@ -837,6 +831,10 @@ public class SpNegoContext implements GSSContextSpi {
mechContext.requestMutualAuth(mutualAuthState); mechContext.requestMutualAuth(mutualAuthState);
mechContext.requestReplayDet(replayDetState); mechContext.requestReplayDet(replayDetState);
mechContext.requestSequenceDet(sequenceDetState); mechContext.requestSequenceDet(sequenceDetState);
if (mechContext instanceof ExtendedGSSContext) {
((ExtendedGSSContext)mechContext).requestDelegPolicy(
delegPolicyState);
}
} }
// pass token // pass token
@ -1202,5 +1200,5 @@ public class SpNegoContext implements GSSContextSpi {
"inquireSecContext not supported by underlying mech."); "inquireSecContext not supported by underlying mech.");
} }
} }
} }

View File

@ -57,6 +57,12 @@ public final class SpNegoMechFactory implements MechanismFactory {
GSSName.NT_HOSTBASED_SERVICE, GSSName.NT_HOSTBASED_SERVICE,
GSSName.NT_EXPORT_NAME}; GSSName.NT_EXPORT_NAME};
// The default underlying mech of SPNEGO, must not be SPNEGO itself.
private static final Oid DEFAULT_SPNEGO_MECH_OID =
ProviderList.DEFAULT_MECH_OID.equals(GSS_SPNEGO_MECH_OID)?
GSSUtil.GSS_KRB5_MECH_OID:
ProviderList.DEFAULT_MECH_OID;
// Use an instance of a GSSManager whose provider list // Use an instance of a GSSManager whose provider list
// does not include native provider // does not include native provider
final GSSManagerImpl manager; final GSSManagerImpl manager;
@ -100,18 +106,27 @@ public final class SpNegoMechFactory implements MechanismFactory {
availableMechs[j++] = mechs[i]; availableMechs[j++] = mechs[i];
} }
} }
// Move the preferred mech to first place
for (int i=0; i<availableMechs.length; i++) {
if (availableMechs[i].equals(DEFAULT_SPNEGO_MECH_OID)) {
if (i != 0) {
availableMechs[i] = availableMechs[0];
availableMechs[0] = DEFAULT_SPNEGO_MECH_OID;
}
break;
}
}
} }
public GSSNameSpi getNameElement(String nameStr, Oid nameType) public GSSNameSpi getNameElement(String nameStr, Oid nameType)
throws GSSException { throws GSSException {
// get NameElement for the default Mechanism return manager.getNameElement(
return manager.getNameElement(nameStr, nameType, null); nameStr, nameType, DEFAULT_SPNEGO_MECH_OID);
} }
public GSSNameSpi getNameElement(byte[] name, Oid nameType) public GSSNameSpi getNameElement(byte[] name, Oid nameType)
throws GSSException { throws GSSException {
// get NameElement for the default Mechanism return manager.getNameElement(name, nameType, DEFAULT_SPNEGO_MECH_OID);
return manager.getNameElement(name, nameType, null);
} }
public GSSCredentialSpi getCredentialElement(GSSNameSpi name, public GSSCredentialSpi getCredentialElement(GSSNameSpi name,

View File

@ -549,6 +549,9 @@ class NativeGSSContext implements GSSContextSpi {
public void requestInteg(boolean state) throws GSSException { public void requestInteg(boolean state) throws GSSException {
changeFlags(GSS_C_INTEG_FLAG, state); changeFlags(GSS_C_INTEG_FLAG, state);
} }
public void requestDelegPolicy(boolean state) throws GSSException {
// Not supported, ignore
}
public void requestLifetime(int lifetime) throws GSSException { public void requestLifetime(int lifetime) throws GSSException {
if (isInitiator && pContext == 0) { if (isInitiator && pContext == 0) {
this.lifetime = lifetime; this.lifetime = lifetime;
@ -590,6 +593,9 @@ class NativeGSSContext implements GSSContextSpi {
public boolean getIntegState() { public boolean getIntegState() {
return checkFlags(GSS_C_INTEG_FLAG); return checkFlags(GSS_C_INTEG_FLAG);
} }
public boolean getDelegPolicyState() {
return false;
}
public int getLifetime() { public int getLifetime() {
return cStub.getContextTime(pContext); return cStub.getContextTime(pContext);
} }

View File

@ -234,7 +234,19 @@ public class Credentials {
* @return true if OK-AS_DELEGATE flag is set, otherwise, return false. * @return true if OK-AS_DELEGATE flag is set, otherwise, return false.
*/ */
public boolean checkDelegate() { public boolean checkDelegate() {
return (flags.get(Krb5.TKT_OPTS_DELEGATE)); return flags.get(Krb5.TKT_OPTS_DELEGATE);
}
/**
* Reset TKT_OPTS_DELEGATE to false, called at credentials acquirement
* when one of the cross-realm TGTs does not have the OK-AS-DELEGATE
* flag set. This info must be preservable and restorable through
* the Krb5Util.credsToTicket/ticketToCreds() methods so that even if
* the service ticket is cached it still remembers the cross-realm
* authentication result.
*/
public void resetDelegate() {
flags.set(Krb5.TKT_OPTS_DELEGATE, false);
} }
public Credentials renew() throws KrbException, IOException { public Credentials renew() throws KrbException, IOException {

View File

@ -1,5 +1,5 @@
/* /*
* Portions Copyright 2001-2004 Sun Microsystems, Inc. All Rights Reserved. * Portions Copyright 2001-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -117,6 +117,7 @@ rs.
// Get a list of realms to traverse // Get a list of realms to traverse
String[] realms = Realm.getRealmsList(localRealm, serviceRealm); String[] realms = Realm.getRealmsList(localRealm, serviceRealm);
boolean okAsDelegate = true;
if (realms == null || realms.length == 0) if (realms == null || realms.length == 0)
{ {
@ -194,6 +195,15 @@ rs.
*/ */
newTgtRealm = newTgt.getServer().getInstanceComponent(); newTgtRealm = newTgt.getServer().getInstanceComponent();
if (okAsDelegate && !newTgt.checkDelegate()) {
if (DEBUG)
{
System.out.println(">>> Credentials acquireServiceCreds: " +
"global OK-AS-DELEGATE turned off at " +
newTgt.getServer());
}
okAsDelegate = false;
}
if (DEBUG) if (DEBUG)
{ {
@ -283,6 +293,9 @@ rs.
System.out.println(">>> Credentials acquireServiceCreds: returning creds:"); System.out.println(">>> Credentials acquireServiceCreds: returning creds:");
Credentials.printDebug(theCreds); Credentials.printDebug(theCreds);
} }
if (!okAsDelegate) {
theCreds.resetDelegate();
}
return theCreds; return theCreds;
} }
throw new KrbApErrException(Krb5.KRB_AP_ERR_GEN_CRED, throw new KrbApErrException(Krb5.KRB_AP_ERR_GEN_CRED,

View File

@ -26,6 +26,9 @@ package sun.swing;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.AccessibleObject;
import java.security.AccessController;
import java.security.PrivilegedAction;
import javax.swing.UIDefaults; import javax.swing.UIDefaults;
/** /**
@ -65,13 +68,15 @@ public class SwingLazyValue implements UIDefaults.LazyValue {
if (methodName != null) { if (methodName != null) {
Class[] types = getClassArray(args); Class[] types = getClassArray(args);
Method m = c.getMethod(methodName, types); Method m = c.getMethod(methodName, types);
makeAccessible(m);
return m.invoke(c, args); return m.invoke(c, args);
} else { } else {
Class[] types = getClassArray(args); Class[] types = getClassArray(args);
Constructor constructor = c.getConstructor(types); Constructor constructor = c.getConstructor(types);
makeAccessible(constructor);
return constructor.newInstance(args); return constructor.newInstance(args);
} }
} catch(Exception e) { } catch (Exception e) {
// Ideally we would throw an exception, unfortunately // Ideally we would throw an exception, unfortunately
// often times there are errors as an initial look and // often times there are errors as an initial look and
// feel is loaded before one can be switched. Perhaps a // feel is loaded before one can be switched. Perhaps a
@ -81,6 +86,15 @@ public class SwingLazyValue implements UIDefaults.LazyValue {
return null; return null;
} }
private void makeAccessible(final AccessibleObject object) {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
object.setAccessible(true);
return null;
}
});
}
private Class[] getClassArray(Object[] args) { private Class[] getClassArray(Object[] args) {
Class[] types = null; Class[] types = null;
if (args!=null) { if (args!=null) {

View File

@ -1807,22 +1807,4 @@ public class SwingUtilities2 {
boolean three) { boolean three) {
return liesIn(rect, p, false, false, three); return liesIn(rect, p, false, false, three);
} }
/**
* Returns the {@code JViewport} instance for the {@code component}
* or {@code null}.
*
* @return the {@code JViewport} instance for the {@code component}
* or {@code null}
* @throws NullPointerException if {@code component} is {@code null}
*/
public static JViewport getViewport(Component component) {
do {
component = component.getParent();
if (component instanceof JViewport) {
return (JViewport) component;
}
} while(component instanceof JLayer);
return null;
}
} }

View File

@ -141,6 +141,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
"Malaysia Summer Time", "MYST"}; "Malaysia Summer Time", "MYST"};
String NORONHA[] = new String[] {"Fernando de Noronha Time", "FNT", String NORONHA[] = new String[] {"Fernando de Noronha Time", "FNT",
"Fernando de Noronha Summer Time", "FNST"}; "Fernando de Noronha Summer Time", "FNST"};
String NOVT[] = new String[] {"Novosibirsk Time", "NOVT",
"Novosibirsk Summer Time", "NOVST"};
String NPT[] = new String[] {"Nepal Time", "NPT", String NPT[] = new String[] {"Nepal Time", "NPT",
"Nepal Summer Time", "NPST"}; "Nepal Summer Time", "NPST"};
String NST[] = new String[] {"Newfoundland Standard Time", "NST", String NST[] = new String[] {"Newfoundland Standard Time", "NST",
@ -441,7 +443,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
{"America/Winnipeg", CST}, {"America/Winnipeg", CST},
{"America/Yakutat", AKST}, {"America/Yakutat", AKST},
{"America/Yellowknife", MST}, {"America/Yellowknife", MST},
{"Antarctica/Casey", WST_AUS}, {"Antarctica/Casey", new String[] {"Casey Time", "CAST",
"Casey Summer Time", "CAST"}},
{"Antarctica/Davis", new String[] {"Davis Time", "DAVT", {"Antarctica/Davis", new String[] {"Davis Time", "DAVT",
"Davis Summer Time", "DAVST"}}, "Davis Summer Time", "DAVST"}},
{"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville Time", "DDUT", {"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville Time", "DDUT",
@ -529,8 +532,8 @@ public final class TimeZoneNames extends TimeZoneNamesBundle {
"Philippines Summer Time", "PHST"}}, "Philippines Summer Time", "PHST"}},
{"Asia/Muscat", GST}, {"Asia/Muscat", GST},
{"Asia/Nicosia", EET}, {"Asia/Nicosia", EET},
{"Asia/Novosibirsk", new String[] {"Novosibirsk Time", "NOVT", {"Asia/Novokuznetsk", NOVT},
"Novosibirsk Summer Time", "NOVST"}}, {"Asia/Novosibirsk", NOVT},
{"Asia/Oral", new String[] {"Oral Time", "ORAT", {"Asia/Oral", new String[] {"Oral Time", "ORAT",
"Oral Summer Time", "ORAST"}}, "Oral Summer Time", "ORAST"}},
{"Asia/Omsk", new String[] {"Omsk Time", "OMST", {"Asia/Omsk", new String[] {"Omsk Time", "OMST",

View File

@ -141,6 +141,8 @@ public final class TimeZoneNames_de extends TimeZoneNamesBundle {
"Malaysische Sommerzeit", "MYST"}; "Malaysische Sommerzeit", "MYST"};
String NORONHA[] = new String[] {"Fernando de Noronha Zeit", "FNT", String NORONHA[] = new String[] {"Fernando de Noronha Zeit", "FNT",
"Fernando de Noronha Sommerzeit", "FNST"}; "Fernando de Noronha Sommerzeit", "FNST"};
String NOVT[] = new String[] {"Nowosibirsker Zeit", "NOVT",
"Nowosibirsker Sommerzeit", "NOVST"};
String NPT[] = new String[] {"Nepalesische Zeit", "NPT", String NPT[] = new String[] {"Nepalesische Zeit", "NPT",
"Nepalesische Sommerzeit", "NPST"}; "Nepalesische Sommerzeit", "NPST"};
String NST[] = new String[] {"Neufundland Normalzeit", "NST", String NST[] = new String[] {"Neufundland Normalzeit", "NST",
@ -441,7 +443,6 @@ public final class TimeZoneNames_de extends TimeZoneNamesBundle {
{"America/Winnipeg", CST}, {"America/Winnipeg", CST},
{"America/Yakutat", AKST}, {"America/Yakutat", AKST},
{"America/Yellowknife", MST}, {"America/Yellowknife", MST},
{"Antarctica/Casey", WST_AUS},
{"Antarctica/Davis", new String[] {"Davis Zeit", "DAVT", {"Antarctica/Davis", new String[] {"Davis Zeit", "DAVT",
"Davis Sommerzeit", "DAVST"}}, "Davis Sommerzeit", "DAVST"}},
{"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville Zeit", "DDUT", {"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville Zeit", "DDUT",
@ -529,8 +530,8 @@ public final class TimeZoneNames_de extends TimeZoneNamesBundle {
"Philippinische Sommerzeit", "PHST"}}, "Philippinische Sommerzeit", "PHST"}},
{"Asia/Muscat", GST}, {"Asia/Muscat", GST},
{"Asia/Nicosia", EET}, {"Asia/Nicosia", EET},
{"Asia/Novosibirsk", new String[] {"Nowosibirsker Zeit", "NOVT", {"Asia/Novokuznetsk", NOVT},
"Nowosibirsker Sommerzeit", "NOVST"}}, {"Asia/Novosibirsk", NOVT},
{"Asia/Oral", new String[] {"Oral Zeit", "ORAT", {"Asia/Oral", new String[] {"Oral Zeit", "ORAT",
"Oral Sommerzeit", "ORAST"}}, "Oral Sommerzeit", "ORAST"}},
{"Asia/Omsk", new String[] {"Omsk Zeit", "OMST", {"Asia/Omsk", new String[] {"Omsk Zeit", "OMST",

View File

@ -141,6 +141,8 @@ public final class TimeZoneNames_es extends TimeZoneNamesBundle {
"Hora de verano de Malasia", "MYST"}; "Hora de verano de Malasia", "MYST"};
String NORONHA[] = new String[] {"Hora de Fernando de Noronha", "FNT", String NORONHA[] = new String[] {"Hora de Fernando de Noronha", "FNT",
"Hora de verano de Fernando de Noronha", "FNST"}; "Hora de verano de Fernando de Noronha", "FNST"};
String NOVT[] = new String[] {"Hora de Novosibirsk", "NOVT",
"Hora de verano de Novosibirsk", "NOVST"};
String NPT[] = new String[] {"Hora de Nepal", "NPT", String NPT[] = new String[] {"Hora de Nepal", "NPT",
"Hora de verano de Nepal", "NPST"}; "Hora de verano de Nepal", "NPST"};
String NST[] = new String[] {"Hora est\u00e1ndar de Terranova", "NST", String NST[] = new String[] {"Hora est\u00e1ndar de Terranova", "NST",
@ -441,7 +443,6 @@ public final class TimeZoneNames_es extends TimeZoneNamesBundle {
{"America/Winnipeg", CST}, {"America/Winnipeg", CST},
{"America/Yakutat", AKST}, {"America/Yakutat", AKST},
{"America/Yellowknife", MST}, {"America/Yellowknife", MST},
{"Antarctica/Casey", WST_AUS},
{"Antarctica/Davis", new String[] {"Hora de Davis", "DAVT", {"Antarctica/Davis", new String[] {"Hora de Davis", "DAVT",
"Hora de verano de Davis", "DAVST"}}, "Hora de verano de Davis", "DAVST"}},
{"Antarctica/DumontDUrville", new String[] {"Hora de Dumont-d'Urville", "DDUT", {"Antarctica/DumontDUrville", new String[] {"Hora de Dumont-d'Urville", "DDUT",
@ -529,8 +530,9 @@ public final class TimeZoneNames_es extends TimeZoneNamesBundle {
"Hora de verano de Filipinas", "PHST"}}, "Hora de verano de Filipinas", "PHST"}},
{"Asia/Muscat", GST}, {"Asia/Muscat", GST},
{"Asia/Nicosia", EET}, {"Asia/Nicosia", EET},
{"Asia/Novosibirsk", new String[] {"Hora de Novosibirsk", "NOVT",
"Hora de verano de Novosibirsk", "NOVST"}}, {"Asia/Novokuznetsk", NOVT},
{"Asia/Novosibirsk", NOVT},
{"Asia/Oral", new String[] {"Hora de Uralsk", "ORAT", {"Asia/Oral", new String[] {"Hora de Uralsk", "ORAT",
"Hora de verano de Uralsk", "ORAST"}}, "Hora de verano de Uralsk", "ORAST"}},
{"Asia/Omsk", new String[] {"Hora de Omsk", "OMST", {"Asia/Omsk", new String[] {"Hora de Omsk", "OMST",

View File

@ -141,6 +141,8 @@ public final class TimeZoneNames_fr extends TimeZoneNamesBundle {
"Heure d'\u00e9t\u00e9 de Malaisie", "MYST"}; "Heure d'\u00e9t\u00e9 de Malaisie", "MYST"};
String NORONHA[] = new String[] {"Heure de Fernando de Noronha", "FNT", String NORONHA[] = new String[] {"Heure de Fernando de Noronha", "FNT",
"Heure d'\u00e9t\u00e9 de Fernando de Noronha", "FNST"}; "Heure d'\u00e9t\u00e9 de Fernando de Noronha", "FNST"};
String NOVT[] = new String[] {"Heure de Novossibirsk", "NOVT",
"Heure d'\u00e9t\u00e9 de Novossibirsk", "NOVST"};
String NPT[] = new String[] {"Heure du N\u00e9pal", "NPT", String NPT[] = new String[] {"Heure du N\u00e9pal", "NPT",
"Heure d'\u00e9t\u00e9 du N\u00e9pal", "NPST"}; "Heure d'\u00e9t\u00e9 du N\u00e9pal", "NPST"};
String NST[] = new String[] {"Heure normale de Terre-Neuve", "NST", String NST[] = new String[] {"Heure normale de Terre-Neuve", "NST",
@ -441,7 +443,6 @@ public final class TimeZoneNames_fr extends TimeZoneNamesBundle {
{"America/Winnipeg", CST}, {"America/Winnipeg", CST},
{"America/Yakutat", AKST}, {"America/Yakutat", AKST},
{"America/Yellowknife", MST}, {"America/Yellowknife", MST},
{"Antarctica/Casey", WST_AUS},
{"Antarctica/Davis", new String[] {"Heure de Davis", "DAVT", {"Antarctica/Davis", new String[] {"Heure de Davis", "DAVT",
"Heure d'\u00e9t\u00e9 de Davis", "DAVST"}}, "Heure d'\u00e9t\u00e9 de Davis", "DAVST"}},
{"Antarctica/DumontDUrville", new String[] {"Heure de Dumont-d'Urville", "DDUT", {"Antarctica/DumontDUrville", new String[] {"Heure de Dumont-d'Urville", "DDUT",
@ -529,8 +530,8 @@ public final class TimeZoneNames_fr extends TimeZoneNamesBundle {
"Heure d'\u00e9t\u00e9 des Philippines", "PHST"}}, "Heure d'\u00e9t\u00e9 des Philippines", "PHST"}},
{"Asia/Muscat", GST}, {"Asia/Muscat", GST},
{"Asia/Nicosia", EET}, {"Asia/Nicosia", EET},
{"Asia/Novosibirsk", new String[] {"Heure de Novossibirsk", "NOVT", {"Asia/Novokuznetsk", NOVT},
"Heure d'\u00e9t\u00e9 de Novossibirsk", "NOVST"}}, {"Asia/Novosibirsk", NOVT},
{"Asia/Oral", new String[] {"Heure d'Oral", "ORAT", {"Asia/Oral", new String[] {"Heure d'Oral", "ORAT",
"Heure d'\u00e9t\u00e9 d'Oral", "ORAST"}}, "Heure d'\u00e9t\u00e9 d'Oral", "ORAST"}},
{"Asia/Omsk", new String[] {"Heure d'Omsk", "OMST", {"Asia/Omsk", new String[] {"Heure d'Omsk", "OMST",

View File

@ -141,6 +141,8 @@ public final class TimeZoneNames_it extends TimeZoneNamesBundle {
"Ora estiva della Malaysia", "MYST"}; "Ora estiva della Malaysia", "MYST"};
String NORONHA[] = new String[] {"Ora di Fernando de Noronha", "FNT", String NORONHA[] = new String[] {"Ora di Fernando de Noronha", "FNT",
"Ora estiva di Fernando de Noronha", "FNST"}; "Ora estiva di Fernando de Noronha", "FNST"};
String NOVT[] = new String[] {"Ora di Novosibirsk", "NOVT",
"Ora estiva di Novosibirsk", "NOVST"};
String NPT[] = new String[] {"Ora del Nepal", "NPT", String NPT[] = new String[] {"Ora del Nepal", "NPT",
"Ora estiva del Nepal", "NPST"}; "Ora estiva del Nepal", "NPST"};
String NST[] = new String[] {"Ora solare di Terranova", "NST", String NST[] = new String[] {"Ora solare di Terranova", "NST",
@ -441,7 +443,6 @@ public final class TimeZoneNames_it extends TimeZoneNamesBundle {
{"America/Winnipeg", CST}, {"America/Winnipeg", CST},
{"America/Yakutat", AKST}, {"America/Yakutat", AKST},
{"America/Yellowknife", MST}, {"America/Yellowknife", MST},
{"Antarctica/Casey", WST_AUS},
{"Antarctica/Davis", new String[] {"Ora di Davis", "DAVT", {"Antarctica/Davis", new String[] {"Ora di Davis", "DAVT",
"Ora estiva di Davis", "DAVST"}}, "Ora estiva di Davis", "DAVST"}},
{"Antarctica/DumontDUrville", new String[] {"Ora di Dumont-d'Urville", "DDUT", {"Antarctica/DumontDUrville", new String[] {"Ora di Dumont-d'Urville", "DDUT",
@ -529,8 +530,8 @@ public final class TimeZoneNames_it extends TimeZoneNamesBundle {
"Ora estiva delle Filippine", "PHST"}}, "Ora estiva delle Filippine", "PHST"}},
{"Asia/Muscat", GST}, {"Asia/Muscat", GST},
{"Asia/Nicosia", EET}, {"Asia/Nicosia", EET},
{"Asia/Novosibirsk", new String[] {"Ora di Novosibirsk", "NOVT", {"Asia/Novokuznetsk", NOVT},
"Ora estiva di Novosibirsk", "NOVST"}}, {"Asia/Novosibirsk", NOVT},
{"Asia/Oral", new String[] {"Ora di Oral", "ORAT", {"Asia/Oral", new String[] {"Ora di Oral", "ORAT",
"Ora estiva di Oral", "ORAST"}}, "Ora estiva di Oral", "ORAST"}},
{"Asia/Omsk", new String[] {"Ora di Omsk", "OMST", {"Asia/Omsk", new String[] {"Ora di Omsk", "OMST",

View File

@ -141,6 +141,8 @@ public final class TimeZoneNames_ja extends TimeZoneNamesBundle {
"\u30de\u30ec\u30fc\u30b7\u30a2\u590f\u6642\u9593", "MYST"}; "\u30de\u30ec\u30fc\u30b7\u30a2\u590f\u6642\u9593", "MYST"};
String NORONHA[] = new String[] {"\u30d5\u30a7\u30eb\u30ca\u30f3\u30c9\u30fb\u30c7\u30fb\u30ce\u30ed\u30fc\u30cb\u30e3\u6642\u9593", "FNT", String NORONHA[] = new String[] {"\u30d5\u30a7\u30eb\u30ca\u30f3\u30c9\u30fb\u30c7\u30fb\u30ce\u30ed\u30fc\u30cb\u30e3\u6642\u9593", "FNT",
"\u30d5\u30a7\u30eb\u30ca\u30f3\u30c9\u30fb\u30c7\u30fb\u30ce\u30ed\u30fc\u30cb\u30e3\u590f\u6642\u9593", "FNST"}; "\u30d5\u30a7\u30eb\u30ca\u30f3\u30c9\u30fb\u30c7\u30fb\u30ce\u30ed\u30fc\u30cb\u30e3\u590f\u6642\u9593", "FNST"};
String NOVT[] = new String[] {"\u30ce\u30dc\u30b7\u30d3\u30eb\u30b9\u30af\u6642\u9593", "NOVT",
"\u30ce\u30dc\u30b7\u30d3\u30eb\u30b9\u30af\u590f\u6642\u9593", "NOVST"};
String NPT[] = new String[] {"\u30cd\u30d1\u30fc\u30eb\u6642\u9593", "NPT", String NPT[] = new String[] {"\u30cd\u30d1\u30fc\u30eb\u6642\u9593", "NPT",
"\u30cd\u30d1\u30fc\u30eb\u590f\u6642\u9593", "NPST"}; "\u30cd\u30d1\u30fc\u30eb\u590f\u6642\u9593", "NPST"};
String NST[] = new String[] {"\u30cb\u30e5\u30fc\u30d5\u30a1\u30f3\u30c9\u30e9\u30f3\u30c9\u6a19\u6e96\u6642", "NST", String NST[] = new String[] {"\u30cb\u30e5\u30fc\u30d5\u30a1\u30f3\u30c9\u30e9\u30f3\u30c9\u6a19\u6e96\u6642", "NST",
@ -441,7 +443,6 @@ public final class TimeZoneNames_ja extends TimeZoneNamesBundle {
{"America/Winnipeg", CST}, {"America/Winnipeg", CST},
{"America/Yakutat", AKST}, {"America/Yakutat", AKST},
{"America/Yellowknife", MST}, {"America/Yellowknife", MST},
{"Antarctica/Casey", WST_AUS},
{"Antarctica/Davis", new String[] {"\u30c7\u30a4\u30d3\u30b9\u6642\u9593", "DAVT", {"Antarctica/Davis", new String[] {"\u30c7\u30a4\u30d3\u30b9\u6642\u9593", "DAVT",
"\u30c7\u30a4\u30d3\u30b9\u590f\u6642\u9593", "DAVST"}}, "\u30c7\u30a4\u30d3\u30b9\u590f\u6642\u9593", "DAVST"}},
{"Antarctica/DumontDUrville", new String[] {"\u30c7\u30e5\u30e2\u30f3\u30c7\u30e5\u30eb\u30f4\u30a3\u30eb\u6642\u9593", "DDUT", {"Antarctica/DumontDUrville", new String[] {"\u30c7\u30e5\u30e2\u30f3\u30c7\u30e5\u30eb\u30f4\u30a3\u30eb\u6642\u9593", "DDUT",
@ -529,8 +530,8 @@ public final class TimeZoneNames_ja extends TimeZoneNamesBundle {
"\u30d5\u30a3\u30ea\u30d4\u30f3\u590f\u6642\u9593", "PHST"}}, "\u30d5\u30a3\u30ea\u30d4\u30f3\u590f\u6642\u9593", "PHST"}},
{"Asia/Muscat", GST}, {"Asia/Muscat", GST},
{"Asia/Nicosia", EET}, {"Asia/Nicosia", EET},
{"Asia/Novosibirsk", new String[] {"\u30ce\u30dc\u30b7\u30d3\u30eb\u30b9\u30af\u6642\u9593", "NOVT", {"Asia/Novokuznetsk", NOVT},
"\u30ce\u30dc\u30b7\u30d3\u30eb\u30b9\u30af\u590f\u6642\u9593", "NOVST"}}, {"Asia/Novosibirsk", NOVT},
{"Asia/Oral", new String[] {"\u30aa\u30e9\u30eb\u6642\u9593", "ORAT", {"Asia/Oral", new String[] {"\u30aa\u30e9\u30eb\u6642\u9593", "ORAT",
"\u30aa\u30e9\u30eb\u590f\u6642\u9593", "ORAST"}}, "\u30aa\u30e9\u30eb\u590f\u6642\u9593", "ORAST"}},
{"Asia/Omsk", new String[] {"\u30aa\u30e0\u30b9\u30af\u6642\u9593", "OMST", {"Asia/Omsk", new String[] {"\u30aa\u30e0\u30b9\u30af\u6642\u9593", "OMST",

View File

@ -141,6 +141,8 @@ public final class TimeZoneNames_ko extends TimeZoneNamesBundle {
"\ub9d0\ub808\uc774\uc2dc\uc544 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "MYST"}; "\ub9d0\ub808\uc774\uc2dc\uc544 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "MYST"};
String NORONHA[] = new String[] {"Fernando de Noronha \uc2dc\uac04", "FNT", String NORONHA[] = new String[] {"Fernando de Noronha \uc2dc\uac04", "FNT",
"Fernando de Noronha \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "FNST"}; "Fernando de Noronha \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "FNST"};
String NOVT[] = new String[] {"\ub178\ube0c\uc2dc\ube4c\uc2a4\ud06c \uc2dc\uac04", "NOVT",
"\ub178\ube0c\uc2dc\ube4c\uc2a4\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "NOVST"};
String NPT[] = new String[] {"\ub124\ud314 \uc2dc\uac04", "NPT", String NPT[] = new String[] {"\ub124\ud314 \uc2dc\uac04", "NPT",
"\ub124\ud314 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "NPST"}; "\ub124\ud314 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "NPST"};
String NST[] = new String[] {"\ub274\ud380\ub4e4\ub79c\ub4dc \ud45c\uc900\uc2dc", "NST", String NST[] = new String[] {"\ub274\ud380\ub4e4\ub79c\ub4dc \ud45c\uc900\uc2dc", "NST",
@ -441,7 +443,6 @@ public final class TimeZoneNames_ko extends TimeZoneNamesBundle {
{"America/Winnipeg", CST}, {"America/Winnipeg", CST},
{"America/Yakutat", AKST}, {"America/Yakutat", AKST},
{"America/Yellowknife", MST}, {"America/Yellowknife", MST},
{"Antarctica/Casey", WST_AUS},
{"Antarctica/Davis", new String[] {"Davis \uc2dc\uac04", "DAVT", {"Antarctica/Davis", new String[] {"Davis \uc2dc\uac04", "DAVT",
"Davis \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "DAVST"}}, "Davis \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "DAVST"}},
{"Antarctica/DumontDUrville", new String[] {"\ub4a4\ubabd \ub4a4\ub974\ube4c \uc2dc\uac04", "DDUT", {"Antarctica/DumontDUrville", new String[] {"\ub4a4\ubabd \ub4a4\ub974\ube4c \uc2dc\uac04", "DDUT",
@ -529,8 +530,8 @@ public final class TimeZoneNames_ko extends TimeZoneNamesBundle {
"\ud544\ub9ac\ud540 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "PHST"}}, "\ud544\ub9ac\ud540 \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "PHST"}},
{"Asia/Muscat", GST}, {"Asia/Muscat", GST},
{"Asia/Nicosia", EET}, {"Asia/Nicosia", EET},
{"Asia/Novosibirsk", new String[] {"\ub178\ube0c\uc2dc\ube4c\uc2a4\ud06c \uc2dc\uac04", "NOVT", {"Asia/Novokuznetsk", NOVT},
"\ub178\ube0c\uc2dc\ube4c\uc2a4\ud06c \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "NOVST"}}, {"Asia/Novosibirsk", NOVT},
{"Asia/Oral", new String[] {"Oral \ud45c\uc900\uc2dc", "ORAT", {"Asia/Oral", new String[] {"Oral \ud45c\uc900\uc2dc", "ORAT",
"Oral \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ORAST"}}, "Oral \uc77c\uad11\uc808\uc57d\uc2dc\uac04", "ORAST"}},
{"Asia/Omsk", new String[] {"Omsk \uc2dc\uac04", "OMST", {"Asia/Omsk", new String[] {"Omsk \uc2dc\uac04", "OMST",

View File

@ -141,6 +141,8 @@ public final class TimeZoneNames_sv extends TimeZoneNamesBundle {
"Malaysia, sommartid", "MYST"}; "Malaysia, sommartid", "MYST"};
String NORONHA[] = new String[] {"Fernando de Noronha, normaltid", "FNT", String NORONHA[] = new String[] {"Fernando de Noronha, normaltid", "FNT",
"Fernando de Noronha, sommartid", "FNST"}; "Fernando de Noronha, sommartid", "FNST"};
String NOVT[] = new String[] {"Novosibirsk, normaltid", "NOVT",
"Novosibirsk, sommartid", "NOVST"};
String NPT[] = new String[] {"Nepal, normaltid", "NPT", String NPT[] = new String[] {"Nepal, normaltid", "NPT",
"Nepal, sommartid", "NPST"}; "Nepal, sommartid", "NPST"};
String NST[] = new String[] {"Newfoundland, normaltid", "NST", String NST[] = new String[] {"Newfoundland, normaltid", "NST",
@ -441,7 +443,6 @@ public final class TimeZoneNames_sv extends TimeZoneNamesBundle {
{"America/Winnipeg", CST}, {"America/Winnipeg", CST},
{"America/Yakutat", AKST}, {"America/Yakutat", AKST},
{"America/Yellowknife", MST}, {"America/Yellowknife", MST},
{"Antarctica/Casey", WST_AUS},
{"Antarctica/Davis", new String[] {"Davis, normaltid", "DAVT", {"Antarctica/Davis", new String[] {"Davis, normaltid", "DAVT",
"Davis, sommartid", "DAVST"}}, "Davis, sommartid", "DAVST"}},
{"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville, normaltid", "DDUT", {"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville, normaltid", "DDUT",
@ -529,8 +530,8 @@ public final class TimeZoneNames_sv extends TimeZoneNamesBundle {
"Filippinerna, sommartid", "PHST"}}, "Filippinerna, sommartid", "PHST"}},
{"Asia/Muscat", GST}, {"Asia/Muscat", GST},
{"Asia/Nicosia", EET}, {"Asia/Nicosia", EET},
{"Asia/Novosibirsk", new String[] {"Novosibirsk, normaltid", "NOVT", {"Asia/Novokuznetsk", NOVT},
"Novosibirsk, sommartid", "NOVST"}}, {"Asia/Novosibirsk", NOVT},
{"Asia/Oral", new String[] {"Oral, normaltid", "ORAT", {"Asia/Oral", new String[] {"Oral, normaltid", "ORAT",
"Oral, sommartid", "ORAST"}}, "Oral, sommartid", "ORAST"}},
{"Asia/Omsk", new String[] {"Omsk, normaltid", "OMST", {"Asia/Omsk", new String[] {"Omsk, normaltid", "OMST",

View File

@ -141,6 +141,8 @@ public final class TimeZoneNames_zh_CN extends TimeZoneNamesBundle {
"\u9a6c\u6765\u897f\u4e9a\u590f\u4ee4\u65f6", "MYST"}; "\u9a6c\u6765\u897f\u4e9a\u590f\u4ee4\u65f6", "MYST"};
String NORONHA[] = new String[] {"\u8d39\u5c14\u5357\u591a\u5fb7\u8bfa\u7f57\u5c3c\u4e9a\u65f6\u95f4", "FNT", String NORONHA[] = new String[] {"\u8d39\u5c14\u5357\u591a\u5fb7\u8bfa\u7f57\u5c3c\u4e9a\u65f6\u95f4", "FNT",
"\u8d39\u5c14\u5357\u591a\u5fb7\u8bfa\u7f57\u5c3c\u4e9a\u590f\u4ee4\u65f6", "FNST"}; "\u8d39\u5c14\u5357\u591a\u5fb7\u8bfa\u7f57\u5c3c\u4e9a\u590f\u4ee4\u65f6", "FNST"};
String NOVT[] = new String[] {"Novosibirsk \u65f6\u95f4", "NOVT",
"Novosibirsk \u590f\u4ee4\u65f6", "NOVST"};
String NPT[] = new String[] {"\u5c3c\u6cca\u5c14\u65f6\u95f4", "NPT", String NPT[] = new String[] {"\u5c3c\u6cca\u5c14\u65f6\u95f4", "NPT",
"\u5c3c\u6cca\u5c14\u590f\u4ee4\u65f6", "NPST"}; "\u5c3c\u6cca\u5c14\u590f\u4ee4\u65f6", "NPST"};
String NST[] = new String[] {"\u7ebd\u82ac\u5170\u6807\u51c6\u65f6\u95f4", "NST", String NST[] = new String[] {"\u7ebd\u82ac\u5170\u6807\u51c6\u65f6\u95f4", "NST",
@ -441,7 +443,6 @@ public final class TimeZoneNames_zh_CN extends TimeZoneNamesBundle {
{"America/Winnipeg", CST}, {"America/Winnipeg", CST},
{"America/Yakutat", AKST}, {"America/Yakutat", AKST},
{"America/Yellowknife", MST}, {"America/Yellowknife", MST},
{"Antarctica/Casey", WST_AUS},
{"Antarctica/Davis", new String[] {"\u6234\u7ef4\u65af\u65f6\u95f4", "DAVT", {"Antarctica/Davis", new String[] {"\u6234\u7ef4\u65af\u65f6\u95f4", "DAVT",
"\u6234\u7ef4\u65af\u590f\u4ee4\u65f6", "DAVST"}}, "\u6234\u7ef4\u65af\u590f\u4ee4\u65f6", "DAVST"}},
{"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville \u65f6\u95f4", "DDUT", {"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville \u65f6\u95f4", "DDUT",
@ -529,8 +530,8 @@ public final class TimeZoneNames_zh_CN extends TimeZoneNamesBundle {
"\u83f2\u5f8b\u5bbe\u590f\u4ee4\u65f6", "PHST"}}, "\u83f2\u5f8b\u5bbe\u590f\u4ee4\u65f6", "PHST"}},
{"Asia/Muscat", GST}, {"Asia/Muscat", GST},
{"Asia/Nicosia", EET}, {"Asia/Nicosia", EET},
{"Asia/Novosibirsk", new String[] {"Novosibirsk \u65f6\u95f4", "NOVT", {"Asia/Novokuznetsk", NOVT},
"Novosibirsk \u590f\u4ee4\u65f6", "NOVST"}}, {"Asia/Novosibirsk", NOVT},
{"Asia/Oral", new String[] {"Oral \u65f6\u95f4", "ORAT", {"Asia/Oral", new String[] {"Oral \u65f6\u95f4", "ORAT",
"Oral \u590f\u4ee4\u65f6", "ORAST"}}, "Oral \u590f\u4ee4\u65f6", "ORAST"}},
{"Asia/Omsk", new String[] {"\u9102\u6728\u65af\u514b\u65f6\u95f4", "OMST", {"Asia/Omsk", new String[] {"\u9102\u6728\u65af\u514b\u65f6\u95f4", "OMST",

View File

@ -141,6 +141,8 @@ public final class TimeZoneNames_zh_TW extends TimeZoneNamesBundle {
"\u99ac\u4f86\u897f\u4e9e\u590f\u4ee4\u6642\u9593", "MYST"}; "\u99ac\u4f86\u897f\u4e9e\u590f\u4ee4\u6642\u9593", "MYST"};
String NORONHA[] = new String[] {"\u8cbb\u723e\u5357\u591a-\u8fea\u8afe\u7f85\u5c3c\u4e9e\u6642\u9593", "FNT", String NORONHA[] = new String[] {"\u8cbb\u723e\u5357\u591a-\u8fea\u8afe\u7f85\u5c3c\u4e9e\u6642\u9593", "FNT",
"\u8cbb\u723e\u5357\u591a-\u8fea\u8afe\u7f85\u5c3c\u4e9e\u590f\u4ee4\u6642\u9593", "FNST"}; "\u8cbb\u723e\u5357\u591a-\u8fea\u8afe\u7f85\u5c3c\u4e9e\u590f\u4ee4\u6642\u9593", "FNST"};
String NOVT[] = new String[] {"Novosibirsk \u6642\u9593", "NOVT",
"Novosibirsk \u590f\u4ee4\u6642\u9593", "NOVST"};
String NPT[] = new String[] {"\u5c3c\u6cca\u723e\u6642\u9593", "NPT", String NPT[] = new String[] {"\u5c3c\u6cca\u723e\u6642\u9593", "NPT",
"\u5c3c\u6cca\u723e\u590f\u4ee4\u6642\u9593", "NPST"}; "\u5c3c\u6cca\u723e\u590f\u4ee4\u6642\u9593", "NPST"};
String NST[] = new String[] {"\u7d10\u82ac\u862d\u6a19\u6e96\u6642\u9593", "NST", String NST[] = new String[] {"\u7d10\u82ac\u862d\u6a19\u6e96\u6642\u9593", "NST",
@ -441,7 +443,6 @@ public final class TimeZoneNames_zh_TW extends TimeZoneNamesBundle {
{"America/Winnipeg", CST}, {"America/Winnipeg", CST},
{"America/Yakutat", AKST}, {"America/Yakutat", AKST},
{"America/Yellowknife", MST}, {"America/Yellowknife", MST},
{"Antarctica/Casey", WST_AUS},
{"Antarctica/Davis", new String[] {"\u81fa\u7dad\u65af\u6642\u9593", "DAVT", {"Antarctica/Davis", new String[] {"\u81fa\u7dad\u65af\u6642\u9593", "DAVT",
"\u81fa\u7dad\u65af\u590f\u4ee4\u6642\u9593", "DAVST"}}, "\u81fa\u7dad\u65af\u590f\u4ee4\u6642\u9593", "DAVST"}},
{"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville \u6642\u9593", "DDUT", {"Antarctica/DumontDUrville", new String[] {"Dumont-d'Urville \u6642\u9593", "DDUT",
@ -529,8 +530,8 @@ public final class TimeZoneNames_zh_TW extends TimeZoneNamesBundle {
"\u83f2\u5f8b\u8cd3\u590f\u4ee4\u6642\u9593", "PHST"}}, "\u83f2\u5f8b\u8cd3\u590f\u4ee4\u6642\u9593", "PHST"}},
{"Asia/Muscat", GST}, {"Asia/Muscat", GST},
{"Asia/Nicosia", EET}, {"Asia/Nicosia", EET},
{"Asia/Novosibirsk", new String[] {"Novosibirsk \u6642\u9593", "NOVT", {"Asia/Novokuznetsk", NOVT},
"Novosibirsk \u590f\u4ee4\u6642\u9593", "NOVST"}}, {"Asia/Novosibirsk", NOVT},
{"Asia/Oral", new String[] {"\u6b50\u4f5b\u6642\u9593", "ORAT", {"Asia/Oral", new String[] {"\u6b50\u4f5b\u6642\u9593", "ORAT",
"\u6b50\u4f5b\u590f\u4ee4\u6642\u9593", "ORAST"}}, "\u6b50\u4f5b\u590f\u4ee4\u6642\u9593", "ORAST"}},
{"Asia/Omsk", new String[] {"\u6b50\u59c6\u65af\u514b (Omsk) \u6642\u9593", "OMST", {"Asia/Omsk", new String[] {"\u6b50\u59c6\u65af\u514b (Omsk) \u6642\u9593", "OMST",

View File

@ -1460,6 +1460,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_initJPEGImageReader
JNU_ThrowByName( env, JNU_ThrowByName( env,
"java/lang/OutOfMemoryError", "java/lang/OutOfMemoryError",
"Initializing Reader"); "Initializing Reader");
free(cinfo);
return 0; return 0;
} }
@ -1496,6 +1497,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_initJPEGImageReader
JNU_ThrowByName(env, JNU_ThrowByName(env,
"java/lang/OutOfMemoryError", "java/lang/OutOfMemoryError",
"Initializing Reader"); "Initializing Reader");
imageio_dispose((j_common_ptr)cinfo);
return 0; return 0;
} }
cinfo->src->bytes_in_buffer = 0; cinfo->src->bytes_in_buffer = 0;
@ -1512,6 +1514,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_initJPEGImageReader
JNU_ThrowByName( env, JNU_ThrowByName( env,
"java/lang/OutOfMemoryError", "java/lang/OutOfMemoryError",
"Initializing Reader"); "Initializing Reader");
imageio_dispose((j_common_ptr)cinfo);
return 0; return 0;
} }
return (jlong) ret; return (jlong) ret;
@ -2450,8 +2453,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_initJPEGImageWriter
JNU_ThrowByName( env, JNU_ThrowByName( env,
"java/lang/OutOfMemoryError", "java/lang/OutOfMemoryError",
"Initializing Writer"); "Initializing Writer");
free(cinfo); imageio_dispose((j_common_ptr)cinfo);
free(jerr);
return 0; return 0;
} }
@ -2469,8 +2471,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageWriter_initJPEGImageWriter
JNU_ThrowByName( env, JNU_ThrowByName( env,
"java/lang/OutOfMemoryError", "java/lang/OutOfMemoryError",
"Initializing Writer"); "Initializing Writer");
free(cinfo); imageio_dispose((j_common_ptr)cinfo);
free(jerr);
return 0; return 0;
} }
return (jlong) ret; return (jlong) ret;

View File

@ -960,21 +960,15 @@ Java_sun_awt_image_ImagingLib_transformRaster(JNIEnv *env, jobject this,
mlib_filter filter; mlib_filter filter;
unsigned int *dP; unsigned int *dP;
if ((srcRasterP = (RasterS_t *) calloc(1, sizeof(RasterS_t))) == NULL) {
JNU_ThrowOutOfMemoryError(env, "Out of memory");
return -1;
}
if ((dstRasterP = (RasterS_t *) calloc(1, sizeof(RasterS_t))) == NULL) {
JNU_ThrowOutOfMemoryError(env, "Out of memory");
free(srcRasterP);
return -1;
}
/* This function requires a lot of local refs ??? Is 64 enough ??? */ /* This function requires a lot of local refs ??? Is 64 enough ??? */
if ((*env)->EnsureLocalCapacity(env, 64) < 0) if ((*env)->EnsureLocalCapacity(env, 64) < 0)
return 0; return 0;
if (s_nomlib) return 0;
if (s_timeIt) {
(*start_timer)(3600);
}
switch(interpType) { switch(interpType) {
case java_awt_image_AffineTransformOp_TYPE_BILINEAR: case java_awt_image_AffineTransformOp_TYPE_BILINEAR:
filter = MLIB_BILINEAR; filter = MLIB_BILINEAR;
@ -990,9 +984,15 @@ Java_sun_awt_image_ImagingLib_transformRaster(JNIEnv *env, jobject this,
return -1; return -1;
} }
if (s_nomlib) return 0; if ((srcRasterP = (RasterS_t *) calloc(1, sizeof(RasterS_t))) == NULL) {
if (s_timeIt) { JNU_ThrowOutOfMemoryError(env, "Out of memory");
(*start_timer)(3600); return -1;
}
if ((dstRasterP = (RasterS_t *) calloc(1, sizeof(RasterS_t))) == NULL) {
JNU_ThrowOutOfMemoryError(env, "Out of memory");
free(srcRasterP);
return -1;
} }
if ((*env)->GetArrayLength(env, jmatrix) < 6) { if ((*env)->GetArrayLength(env, jmatrix) < 6) {
@ -1215,6 +1215,9 @@ Java_sun_awt_image_ImagingLib_lookupByteBI(JNIEnv *env, jobject this,
} }
if (tbl == NULL || table == NULL || jtable == NULL) { if (tbl == NULL || table == NULL || jtable == NULL) {
if (tbl != NULL) free(tbl);
if (table != NULL) free(table);
if (jtable != NULL) free(jtable);
awt_freeParsedImage(srcImageP, TRUE); awt_freeParsedImage(srcImageP, TRUE);
awt_freeParsedImage(dstImageP, TRUE); awt_freeParsedImage(dstImageP, TRUE);
JNU_ThrowNullPointerException(env, "NULL LUT"); JNU_ThrowNullPointerException(env, "NULL LUT");
@ -1224,6 +1227,11 @@ Java_sun_awt_image_ImagingLib_lookupByteBI(JNIEnv *env, jobject this,
for (i=0; i < jlen; i++) { for (i=0; i < jlen; i++) {
jtable[i] = (*env)->GetObjectArrayElement(env, jtableArrays, i); jtable[i] = (*env)->GetObjectArrayElement(env, jtableArrays, i);
if (jtable[i] == NULL) { if (jtable[i] == NULL) {
free(tbl);
free(table);
free(jtable);
awt_freeParsedImage(srcImageP, TRUE);
awt_freeParsedImage(dstImageP, TRUE);
return 0; return 0;
} }
} }
@ -1232,6 +1240,9 @@ Java_sun_awt_image_ImagingLib_lookupByteBI(JNIEnv *env, jobject this,
FALSE, &hint); FALSE, &hint);
if (nbands < 1) { if (nbands < 1) {
/* Can't handle any custom images */ /* Can't handle any custom images */
free(tbl);
free(table);
free(jtable);
awt_freeParsedImage(srcImageP, TRUE); awt_freeParsedImage(srcImageP, TRUE);
awt_freeParsedImage(dstImageP, TRUE); awt_freeParsedImage(dstImageP, TRUE);
return 0; return 0;
@ -1240,12 +1251,18 @@ Java_sun_awt_image_ImagingLib_lookupByteBI(JNIEnv *env, jobject this,
/* Allocate the arrays */ /* Allocate the arrays */
if (allocateArray(env, srcImageP, &src, &sdata, TRUE, FALSE, FALSE) < 0) { if (allocateArray(env, srcImageP, &src, &sdata, TRUE, FALSE, FALSE) < 0) {
/* Must be some problem */ /* Must be some problem */
free(tbl);
free(table);
free(jtable);
awt_freeParsedImage(srcImageP, TRUE); awt_freeParsedImage(srcImageP, TRUE);
awt_freeParsedImage(dstImageP, TRUE); awt_freeParsedImage(dstImageP, TRUE);
return 0; return 0;
} }
if (allocateArray(env, dstImageP, &dst, &ddata, FALSE, FALSE, FALSE) < 0) { if (allocateArray(env, dstImageP, &dst, &ddata, FALSE, FALSE, FALSE) < 0) {
/* Must be some problem */ /* Must be some problem */
free(tbl);
free(table);
free(jtable);
freeArray(env, srcImageP, src, sdata, NULL, NULL, NULL); freeArray(env, srcImageP, src, sdata, NULL, NULL, NULL);
awt_freeParsedImage(srcImageP, TRUE); awt_freeParsedImage(srcImageP, TRUE);
awt_freeParsedImage(dstImageP, TRUE); awt_freeParsedImage(dstImageP, TRUE);
@ -1284,6 +1301,9 @@ Java_sun_awt_image_ImagingLib_lookupByteBI(JNIEnv *env, jobject this,
(jbyte *) table[j], (jbyte *) table[j],
JNI_ABORT); JNI_ABORT);
} }
free(tbl);
free(table);
free(jtable);
freeArray(env, srcImageP, src, sdata, NULL, NULL, NULL); freeArray(env, srcImageP, src, sdata, NULL, NULL, NULL);
awt_freeParsedImage(srcImageP, TRUE); awt_freeParsedImage(srcImageP, TRUE);
awt_freeParsedImage(dstImageP, TRUE); awt_freeParsedImage(dstImageP, TRUE);
@ -1413,12 +1433,15 @@ Java_sun_awt_image_ImagingLib_lookupByteRaster(JNIEnv *env,
/* Parse the source raster - reject custom images */ /* Parse the source raster - reject custom images */
if ((status = awt_parseRaster(env, jsrc, srcRasterP)) <= 0) { if ((status = awt_parseRaster(env, jsrc, srcRasterP)) <= 0) {
free(srcRasterP);
free(dstRasterP);
return 0; return 0;
} }
/* Parse the destination image - reject custom images */ /* Parse the destination image - reject custom images */
if ((status = awt_parseRaster(env, jdst, dstRasterP)) <= 0) { if ((status = awt_parseRaster(env, jdst, dstRasterP)) <= 0) {
awt_freeParsedRaster(srcRasterP, TRUE); awt_freeParsedRaster(srcRasterP, TRUE);
free(dstRasterP);
return 0; return 0;
} }

View File

@ -102,9 +102,21 @@ Java_sun_font_FreetypeFontScaler_initIDs(
} }
static void freeNativeResources(JNIEnv *env, FTScalerInfo* scalerInfo) { static void freeNativeResources(JNIEnv *env, FTScalerInfo* scalerInfo) {
void *stream;
if (scalerInfo == NULL) if (scalerInfo == NULL)
return; return;
//apparently Done_Face will only close the stream
// but will not relase the memory of stream structure.
// We need to free it explicitly to avoid leak.
//Direct access to the stream field might be not ideal solution as
// it is considred to be "private".
//Alternatively we could have stored pointer to the structure
// in the scalerInfo but this will increase size of the structure
// for no good reason
stream = scalerInfo->face->stream;
FT_Done_Face(scalerInfo->face); FT_Done_Face(scalerInfo->face);
FT_Done_FreeType(scalerInfo->library); FT_Done_FreeType(scalerInfo->library);
@ -116,6 +128,10 @@ static void freeNativeResources(JNIEnv *env, FTScalerInfo* scalerInfo) {
free(scalerInfo->fontData); free(scalerInfo->fontData);
} }
if (stream != NULL) {
free(stream);
}
free(scalerInfo); free(scalerInfo);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -51,9 +51,9 @@
* two data models and cohabitation of jre/jdk bits with both data * two data models and cohabitation of jre/jdk bits with both data
* models is supported, then DUAL_MODE is defined. When DUAL_MODE is * models is supported, then DUAL_MODE is defined. When DUAL_MODE is
* defined, the architecture names for the narrow and wide version of * defined, the architecture names for the narrow and wide version of
* the architecture are defined in LIBARCH64NAME and LIBARCH32NAME. Currently * the architecture are defined in LIBARCH64NAME and LIBARCH32NAME.
* only Solaris on sparc/sparcv9 and i586/amd64 is DUAL_MODE; linux * Currently only Solaris on sparc/sparcv9 and i586/amd64 is DUAL_MODE;
* i586/amd64 could be defined as DUAL_MODE but that is not the * linux i586/amd64 could be defined as DUAL_MODE but that is not the
* current policy. * current policy.
*/ */
@ -103,49 +103,56 @@ static char *execname = NULL;
* platform independent routine SelectVersion. This may result in * platform independent routine SelectVersion. This may result in
* the exec of the specified launcher version. * the exec of the specified launcher version.
* *
* Typically, the launcher execs at least once to ensure a suitable * Previously the launcher modified the LD_LIBRARY_PATH appropriately for the
* LD_LIBRARY_PATH is in effect for the process. The first exec * desired data model path, regardless if data models matched or not. The
* screens out all the data model options; leaving the choice of data * launcher subsequently exec'ed the desired executable, in order to make the
* model implicit in the binary selected to run. However, in case no * LD_LIBRARY_PATH path available for the runtime linker. This is no longer the
* exec is done, the data model options are screened out before the vm * case, the launcher dlopens the target libjvm.so. All other required
* is invoked. * libraries are loaded by the runtime linker, by virtue of the $ORIGIN paths
* baked into the shared libraries, by the build infrastructure at compile time.
* *
* incoming argv ------------------------------ * Main
* | | * (incoming argv)
* \|/ |
* CheckJVMType |
* (removes -client, -server, etc.) |
* \|/
* CreateExecutionEnvironment
* (removes -d32 and -d64,
* determines desired data model,
* sets up LD_LIBRARY_PATH,
* and exec's)
* |
* --------------------------------------------
* | * |
* \|/ * \|/
* exec child 1 incoming argv ----------------- * SelectVersion
* (selects the JRE version, note: not data model)
* |
* \|/
* CreateExecutionEnvironment
* (determines desired data model)
* |
* |
* \|/
* Have Desired Model ? --> NO --> Is Dual-Mode ? --> NO --> Exit(with error)
* | |
* | | * | |
* \|/ |
* CheckJVMType |
* (removes -client, -server, etc.) |
* | \|/ * | \|/
* | CreateExecutionEnvironment * | YES
* | (verifies desired data model * | |
* | is running and acceptable * | |
* | LD_LIBRARY_PATH; * | \|/
* | no-op in child) * | CheckJvmType
* | (removes -client, -server etc.)
* | |
* | |
* \|/ \|/
* YES (find the desired executable and exec child)
* | |
* | |
* \|/ \|/
* CheckJvmType Main
* (removes -client, -server, etc.)
* |
* | * |
* \|/ * \|/
* TranslateDashJArgs... * TranslateDashJArgs...
* (Prepare to pass args to vm) * (Prepare to pass args to vm)
* | * |
* | * |
* |
* \|/ * \|/
* ParseArguments * ParseArguments
* (ignores -d32 and -d64, * (removes -d32 and -d64 if any,
* processes version options, * processes version options,
* creates argument list for vm, * creates argument list for vm,
* etc.) * etc.)
@ -199,17 +206,13 @@ CreateExecutionEnvironment(int *_argcp,
/* Compute/set the name of the executable */ /* Compute/set the name of the executable */
SetExecname(*_argvp); SetExecname(*_argvp);
/* Set the LD_LIBRARY_PATH environment variable, check data model /* Check data model flags, and exec process, if needed */
flags, and exec process, if needed */
{ {
char *arch = (char *)GetArch(); /* like sparc or sparcv9 */ char *arch = (char *)GetArch(); /* like sparc or sparcv9 */
char * jvmtype = NULL; char * jvmtype = NULL;
int argc = *_argcp; int argc = *_argcp;
char **argv = original_argv; char **argv = original_argv;
char *runpath = NULL; /* existing effective LD_LIBRARY_PATH
setting */
int running = CURRENT_DATA_MODEL; int running = CURRENT_DATA_MODEL;
int wanted = running; /* What data mode is being int wanted = running; /* What data mode is being
@ -217,18 +220,8 @@ CreateExecutionEnvironment(int *_argcp,
fine unless another model fine unless another model
is asked for */ is asked for */
char* new_runpath = NULL; /* desired new LD_LIBRARY_PATH string */
char* newpath = NULL; /* path on new LD_LIBRARY_PATH */
char* lastslash = NULL;
char** newenvp = NULL; /* current environment */
char** newargv = NULL; char** newargv = NULL;
int newargc = 0; int newargc = 0;
#ifdef __solaris__
char* dmpath = NULL; /* data model specific LD_LIBRARY_PATH,
Solaris only */
#endif
/* /*
* Starting in 1.5, all unix platforms accept the -d32 and -d64 * Starting in 1.5, all unix platforms accept the -d32 and -d64
@ -306,6 +299,11 @@ CreateExecutionEnvironment(int *_argcp,
JLI_ReportErrorMessage(CFG_ERROR8, jvmtype, jvmpath); JLI_ReportErrorMessage(CFG_ERROR8, jvmtype, jvmpath);
exit(4); exit(4);
} }
/*
* we seem to have everything we need, so without further ado
* we return back.
*/
return;
} else { /* do the same speculatively or exit */ } else { /* do the same speculatively or exit */
#ifdef DUAL_MODE #ifdef DUAL_MODE
if (running != wanted) { if (running != wanted) {
@ -335,190 +333,6 @@ CreateExecutionEnvironment(int *_argcp,
#endif #endif
} }
/*
* We will set the LD_LIBRARY_PATH as follows:
*
* o $JVMPATH (directory portion only)
* o $JRE/lib/$LIBARCHNAME
* o $JRE/../lib/$LIBARCHNAME
*
* followed by the user's previous effective LD_LIBRARY_PATH, if
* any.
*/
#ifdef __solaris__
/*
* Starting in Solaris 7, ld.so.1 supports three LD_LIBRARY_PATH
* variables:
*
* 1. LD_LIBRARY_PATH -- used for 32 and 64 bit searches if
* data-model specific variables are not set.
*
* 2. LD_LIBRARY_PATH_64 -- overrides and replaces LD_LIBRARY_PATH
* for 64-bit binaries.
*
* 3. LD_LIBRARY_PATH_32 -- overrides and replaces LD_LIBRARY_PATH
* for 32-bit binaries.
*
* The vm uses LD_LIBRARY_PATH to set the java.library.path system
* property. To shield the vm from the complication of multiple
* LD_LIBRARY_PATH variables, if the appropriate data model
* specific variable is set, we will act as if LD_LIBRARY_PATH had
* the value of the data model specific variant and the data model
* specific variant will be unset. Note that the variable for the
* *wanted* data model must be used (if it is set), not simply the
* current running data model.
*/
switch(wanted) {
case 0:
if(running == 32) {
dmpath = getenv("LD_LIBRARY_PATH_32");
wanted = 32;
}
else {
dmpath = getenv("LD_LIBRARY_PATH_64");
wanted = 64;
}
break;
case 32:
dmpath = getenv("LD_LIBRARY_PATH_32");
break;
case 64:
dmpath = getenv("LD_LIBRARY_PATH_64");
break;
default:
JLI_ReportErrorMessage(JRE_ERROR3, __LINE__);
exit(1); /* unknown value in wanted */
break;
}
/*
* If dmpath is NULL, the relevant data model specific variable is
* not set and normal LD_LIBRARY_PATH should be used.
*/
if( dmpath == NULL) {
runpath = getenv("LD_LIBRARY_PATH");
}
else {
runpath = dmpath;
}
#else
/*
* If not on Solaris, assume only a single LD_LIBRARY_PATH
* variable.
*/
runpath = getenv("LD_LIBRARY_PATH");
#endif /* __solaris__ */
#ifdef __linux
/*
* On linux, if a binary is running as sgid or suid, glibc sets
* LD_LIBRARY_PATH to the empty string for security purposes. (In
* contrast, on Solaris the LD_LIBRARY_PATH variable for a
* privileged binary does not lose its settings; but the dynamic
* linker does apply more scrutiny to the path.) The launcher uses
* the value of LD_LIBRARY_PATH to prevent an exec loop.
* Therefore, if we are running sgid or suid, this function's
* setting of LD_LIBRARY_PATH will be ineffective and we should
* return from the function now. Getting the right libraries to
* be found must be handled through other mechanisms.
*/
if((getgid() != getegid()) || (getuid() != geteuid()) ) {
return;
}
#endif
/* runpath contains current effective LD_LIBRARY_PATH setting */
jvmpath = JLI_StringDup(jvmpath);
new_runpath = JLI_MemAlloc( ((runpath!=NULL)?JLI_StrLen(runpath):0) +
2*JLI_StrLen(jrepath) + 2*JLI_StrLen(arch) +
JLI_StrLen(jvmpath) + 52);
newpath = new_runpath + JLI_StrLen("LD_LIBRARY_PATH=");
/*
* Create desired LD_LIBRARY_PATH value for target data model.
*/
{
/* remove the name of the .so from the JVM path */
lastslash = JLI_StrRChr(jvmpath, '/');
if (lastslash)
*lastslash = '\0';
/* jvmpath, ((running != wanted)?((wanted==64)?"/"LIBARCH64NAME:"/.."):""), */
sprintf(new_runpath, "LD_LIBRARY_PATH="
"%s:"
"%s/lib/%s:"
"%s/../lib/%s",
jvmpath,
#ifdef DUAL_MODE
jrepath, GetArchPath(wanted),
jrepath, GetArchPath(wanted)
#else
jrepath, arch,
jrepath, arch
#endif
);
/*
* Check to make sure that the prefix of the current path is the
* desired environment variable setting.
*/
if (runpath != NULL &&
JLI_StrNCmp(newpath, runpath, JLI_StrLen(newpath))==0 &&
(runpath[JLI_StrLen(newpath)] == 0 || runpath[JLI_StrLen(newpath)] == ':') &&
(running == wanted) /* data model does not have to be changed */
#ifdef __solaris__
&& (dmpath == NULL) /* data model specific variables not set */
#endif
) {
return;
}
}
/*
* Place the desired environment setting onto the prefix of
* LD_LIBRARY_PATH. Note that this prevents any possible infinite
* loop of execv() because we test for the prefix, above.
*/
if (runpath != 0) {
JLI_StrCat(new_runpath, ":");
JLI_StrCat(new_runpath, runpath);
}
if( putenv(new_runpath) != 0) {
exit(1); /* problem allocating memory; LD_LIBRARY_PATH not set
properly */
}
/*
* Unix systems document that they look at LD_LIBRARY_PATH only
* once at startup, so we have to re-exec the current executable
* to get the changed environment variable to have an effect.
*/
#ifdef __solaris__
/*
* If dmpath is not NULL, remove the data model specific string
* in the environment for the exec'ed child.
*/
if( dmpath != NULL)
(void)UnsetEnv((wanted==32)?"LD_LIBRARY_PATH_32":"LD_LIBRARY_PATH_64");
#endif
newenvp = environ;
{ {
char *newexec = execname; char *newexec = execname;
#ifdef DUAL_MODE #ifdef DUAL_MODE
@ -549,17 +363,16 @@ CreateExecutionEnvironment(int *_argcp,
argv[0] = newexec; argv[0] = newexec;
} }
#endif #endif
JLI_TraceLauncher("TRACER_MARKER:About to EXEC\n");
(void)fflush(stdout); (void)fflush(stdout);
(void)fflush(stderr); (void)fflush(stderr);
execve(newexec, argv, newenvp); execv(newexec, argv);
JLI_ReportErrorMessageSys(JRE_ERROR4, newexec); JLI_ReportErrorMessageSys(JRE_ERROR4, newexec);
#ifdef DUAL_MODE #ifdef DUAL_MODE
if (running != wanted) { if (running != wanted) {
JLI_ReportErrorMessage(JRE_ERROR5, wanted, running); JLI_ReportErrorMessage(JRE_ERROR5, wanted, running);
# ifdef __solaris__ # ifdef __solaris__
# ifdef __sparc # ifdef __sparc
JLI_ReportErrorMessage(JRE_ERROR6); JLI_ReportErrorMessage(JRE_ERROR6);
# else # else
@ -570,13 +383,11 @@ CreateExecutionEnvironment(int *_argcp,
#endif #endif
} }
exit(1); exit(1);
} }
} }
/* /*
* On Solaris VM choosing is done by the launcher (java.c). * On Solaris VM choosing is done by the launcher (java.c).
*/ */
@ -1123,6 +934,7 @@ ExecJRE(char *jre, char **argv)
printf(" %s", argv[i]); printf(" %s", argv[i]);
printf("\n"); printf("\n");
} }
JLI_TraceLauncher("TRACER_MARKER:About to EXEC\n");
(void)fflush(stdout); (void)fflush(stdout);
(void)fflush(stderr); (void)fflush(stderr);
execv(wanted, argv); execv(wanted, argv);

View File

@ -534,71 +534,71 @@ final class XDropTargetRegistry {
return entry.getSite(x, y); return entry.getSite(x, y);
} }
/*
* Note: this method should be called under AWT lock.
*/
public void registerDropSite(long window) { public void registerDropSite(long window) {
assert XToolkit.isAWTLockHeldByCurrentThread();
if (window == 0) { if (window == 0) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
XDropTargetEventProcessor.activate(); XDropTargetEventProcessor.activate();
XToolkit.awtLock(); long toplevel = getToplevelWindow(window);
try {
long toplevel = getToplevelWindow(window);
/* /*
* No window with WM_STATE property is found. * No window with WM_STATE property is found.
* Since the window can be a plugin window reparented to the browser * Since the window can be a plugin window reparented to the browser
* toplevel, we cannot determine which window will eventually have * toplevel, we cannot determine which window will eventually have
* WM_STATE property set. So we schedule a timer callback that will * WM_STATE property set. So we schedule a timer callback that will
* periodically attempt to find an ancestor with WM_STATE and * periodically attempt to find an ancestor with WM_STATE and
* register the drop site appropriately. * register the drop site appropriately.
*/ */
if (toplevel == 0) { if (toplevel == 0) {
addDelayedRegistrationEntry(window); addDelayedRegistrationEntry(window);
return; return;
}
if (toplevel == window) {
Iterator dropTargetProtocols =
XDragAndDropProtocols.getDropTargetProtocols();
while (dropTargetProtocols.hasNext()) {
XDropTargetProtocol dropTargetProtocol =
(XDropTargetProtocol)dropTargetProtocols.next();
dropTargetProtocol.registerDropTarget(toplevel);
} }
} else {
if (toplevel == window) { registerEmbeddedDropSite(toplevel, window);
Iterator dropTargetProtocols =
XDragAndDropProtocols.getDropTargetProtocols();
while (dropTargetProtocols.hasNext()) {
XDropTargetProtocol dropTargetProtocol =
(XDropTargetProtocol)dropTargetProtocols.next();
dropTargetProtocol.registerDropTarget(toplevel);
}
} else {
registerEmbeddedDropSite(toplevel, window);
}
} finally {
XToolkit.awtUnlock();
} }
} }
/*
* Note: this method should be called under AWT lock.
*/
public void unregisterDropSite(long window) { public void unregisterDropSite(long window) {
assert XToolkit.isAWTLockHeldByCurrentThread();
if (window == 0) { if (window == 0) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
XToolkit.awtLock(); long toplevel = getToplevelWindow(window);
try {
long toplevel = getToplevelWindow(window);
if (toplevel == window) { if (toplevel == window) {
Iterator dropProtocols = Iterator dropProtocols =
XDragAndDropProtocols.getDropTargetProtocols(); XDragAndDropProtocols.getDropTargetProtocols();
removeDelayedRegistrationEntry(window); removeDelayedRegistrationEntry(window);
while (dropProtocols.hasNext()) { while (dropProtocols.hasNext()) {
XDropTargetProtocol dropProtocol = (XDropTargetProtocol)dropProtocols.next(); XDropTargetProtocol dropProtocol = (XDropTargetProtocol)dropProtocols.next();
dropProtocol.unregisterDropTarget(window); dropProtocol.unregisterDropTarget(window);
}
} else {
unregisterEmbeddedDropSite(toplevel, window);
} }
} finally { } else {
XToolkit.awtUnlock(); unregisterEmbeddedDropSite(toplevel, window);
} }
} }

View File

@ -1509,4 +1509,24 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer {
return new XAtomList(); return new XAtomList();
} }
/**
* Indicates if the window is currently in the FSEM.
* Synchronization: state lock.
*/
private boolean fullScreenExclusiveModeState = false;
// Implementation of the X11ComponentPeer
@Override
public void setFullScreenExclusiveModeState(boolean state) {
synchronized (getStateLock()) {
fullScreenExclusiveModeState = state;
}
}
public final boolean isFullScreenExclusiveMode() {
synchronized (getStateLock()) {
return fullScreenExclusiveModeState;
}
}
} }

View File

@ -1079,31 +1079,39 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
updateSecurityWarningVisibility(); updateSecurityWarningVisibility();
} }
@Override
public void setFullScreenExclusiveModeState(boolean state) {
super.setFullScreenExclusiveModeState(state);
updateSecurityWarningVisibility();
}
public void updateSecurityWarningVisibility() { public void updateSecurityWarningVisibility() {
if (warningWindow == null) { if (warningWindow == null) {
return; return;
} }
boolean show = false;
int state = getWMState();
if (!isVisible()) { if (!isVisible()) {
return; // The warning window should already be hidden. return; // The warning window should already be hidden.
} }
// getWMState() always returns 0 (Withdrawn) for simple windows. Hence boolean show = false;
// we ignore the state for such windows.
if (isVisible() && (state == XUtilConstants.NormalState || isSimpleWindow())) {
if (XKeyboardFocusManagerPeer.getCurrentNativeFocusedWindow() ==
getTarget())
{
show = true;
}
if (isMouseAbove() || warningWindow.isMouseAbove()) if (!isFullScreenExclusiveMode()) {
{ int state = getWMState();
show = true;
// getWMState() always returns 0 (Withdrawn) for simple windows. Hence
// we ignore the state for such windows.
if (isVisible() && (state == XUtilConstants.NormalState || isSimpleWindow())) {
if (XKeyboardFocusManagerPeer.getCurrentNativeFocusedWindow() ==
getTarget())
{
show = true;
}
if (isMouseAbove() || warningWindow.isMouseAbove())
{
show = true;
}
} }
} }
@ -1756,25 +1764,36 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
} }
} }
// should be synchronized on awtLock
private int dropTargetCount = 0; private int dropTargetCount = 0;
public synchronized void addDropTarget() { public void addDropTarget() {
if (dropTargetCount == 0) { XToolkit.awtLock();
long window = getWindow(); try {
if (window != 0) { if (dropTargetCount == 0) {
XDropTargetRegistry.getRegistry().registerDropSite(window); long window = getWindow();
if (window != 0) {
XDropTargetRegistry.getRegistry().registerDropSite(window);
}
} }
dropTargetCount++;
} finally {
XToolkit.awtUnlock();
} }
dropTargetCount++;
} }
public synchronized void removeDropTarget() { public void removeDropTarget() {
dropTargetCount--; XToolkit.awtLock();
if (dropTargetCount == 0) { try {
long window = getWindow(); dropTargetCount--;
if (window != 0) { if (dropTargetCount == 0) {
XDropTargetRegistry.getRegistry().unregisterDropSite(window); long window = getWindow();
if (window != 0) {
XDropTargetRegistry.getRegistry().unregisterDropSite(window);
}
} }
} finally {
XToolkit.awtUnlock();
} }
} }
void addRootPropertyEventDispatcher() { void addRootPropertyEventDispatcher() {
@ -1837,13 +1856,18 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
} }
} }
protected synchronized void updateDropTarget() { protected void updateDropTarget() {
if (dropTargetCount > 0) { XToolkit.awtLock();
long window = getWindow(); try {
if (window != 0) { if (dropTargetCount > 0) {
XDropTargetRegistry.getRegistry().unregisterDropSite(window); long window = getWindow();
XDropTargetRegistry.getRegistry().registerDropSite(window); if (window != 0) {
XDropTargetRegistry.getRegistry().unregisterDropSite(window);
XDropTargetRegistry.getRegistry().registerDropSite(window);
}
} }
} finally {
XToolkit.awtUnlock();
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved. * Copyright 2003-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -39,4 +39,5 @@ public interface X11ComponentPeer {
Rectangle getBounds(); Rectangle getBounds();
Graphics getGraphics(); Graphics getGraphics();
Object getTarget(); Object getTarget();
void setFullScreenExclusiveModeState(boolean state);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -306,12 +306,14 @@ public class X11GraphicsDevice
X11ComponentPeer peer = (X11ComponentPeer)w.getPeer(); X11ComponentPeer peer = (X11ComponentPeer)w.getPeer();
if (peer != null) { if (peer != null) {
enterFullScreenExclusive(peer.getContentWindow()); enterFullScreenExclusive(peer.getContentWindow());
peer.setFullScreenExclusiveModeState(true);
} }
} }
private static void exitFullScreenExclusive(Window w) { private static void exitFullScreenExclusive(Window w) {
X11ComponentPeer peer = (X11ComponentPeer)w.getPeer(); X11ComponentPeer peer = (X11ComponentPeer)w.getPeer();
if (peer != null) { if (peer != null) {
peer.setFullScreenExclusiveModeState(false);
exitFullScreenExclusive(peer.getContentWindow()); exitFullScreenExclusive(peer.getContentWindow());
} }
} }

View File

@ -388,7 +388,10 @@ public abstract class X11SurfaceData extends SurfaceData {
// if a GlyphVector overrides the AA setting. // if a GlyphVector overrides the AA setting.
// We use getRenderLoops() rather than setting solidloops // We use getRenderLoops() rather than setting solidloops
// directly so that we get the appropriate loops in XOR mode. // directly so that we get the appropriate loops in XOR mode.
sg2d.loops = getRenderLoops(sg2d); if (sg2d.loops == null) {
// assert(some pipe will always be a LoopBasedPipe)
sg2d.loops = getRenderLoops(sg2d);
}
} else { } else {
super.validatePipe(sg2d); super.validatePipe(sg2d);
} }

View File

@ -1654,6 +1654,7 @@ Java_sun_awt_X11GraphicsEnvironment_getXineramaCenterPoint(JNIEnv *env,
#ifndef HEADLESS #ifndef HEADLESS
#define BIT_DEPTH_MULTI java_awt_DisplayMode_BIT_DEPTH_MULTI #define BIT_DEPTH_MULTI java_awt_DisplayMode_BIT_DEPTH_MULTI
#define REFRESH_RATE_UNKNOWN java_awt_DisplayMode_REFRESH_RATE_UNKNOWN
typedef Status typedef Status
(*XRRQueryVersionType) (Display *dpy, int *major_versionp, int *minor_versionp); (*XRRQueryVersionType) (Display *dpy, int *major_versionp, int *minor_versionp);
@ -1680,6 +1681,9 @@ typedef Status
Rotation rotation, Rotation rotation,
short rate, short rate,
Time timestamp); Time timestamp);
typedef Rotation
(*XRRConfigRotationsType)(XRRScreenConfiguration *config,
Rotation *current_rotation);
static XRRQueryVersionType awt_XRRQueryVersion; static XRRQueryVersionType awt_XRRQueryVersion;
static XRRGetScreenInfoType awt_XRRGetScreenInfo; static XRRGetScreenInfoType awt_XRRGetScreenInfo;
@ -1689,6 +1693,7 @@ static XRRConfigCurrentRateType awt_XRRConfigCurrentRate;
static XRRConfigSizesType awt_XRRConfigSizes; static XRRConfigSizesType awt_XRRConfigSizes;
static XRRConfigCurrentConfigurationType awt_XRRConfigCurrentConfiguration; static XRRConfigCurrentConfigurationType awt_XRRConfigCurrentConfiguration;
static XRRSetScreenConfigAndRateType awt_XRRSetScreenConfigAndRate; static XRRSetScreenConfigAndRateType awt_XRRSetScreenConfigAndRate;
static XRRConfigRotationsType awt_XRRConfigRotations;
#define LOAD_XRANDR_FUNC(f) \ #define LOAD_XRANDR_FUNC(f) \
do { \ do { \
@ -1755,6 +1760,7 @@ X11GD_InitXrandrFuncs(JNIEnv *env)
LOAD_XRANDR_FUNC(XRRConfigSizes); LOAD_XRANDR_FUNC(XRRConfigSizes);
LOAD_XRANDR_FUNC(XRRConfigCurrentConfiguration); LOAD_XRANDR_FUNC(XRRConfigCurrentConfiguration);
LOAD_XRANDR_FUNC(XRRSetScreenConfigAndRate); LOAD_XRANDR_FUNC(XRRSetScreenConfigAndRate);
LOAD_XRANDR_FUNC(XRRConfigRotations);
return JNI_TRUE; return JNI_TRUE;
} }
@ -1765,6 +1771,7 @@ X11GD_CreateDisplayMode(JNIEnv *env, jint width, jint height,
{ {
jclass displayModeClass; jclass displayModeClass;
jmethodID cid; jmethodID cid;
jint validRefreshRate = refreshRate;
displayModeClass = (*env)->FindClass(env, "java/awt/DisplayMode"); displayModeClass = (*env)->FindClass(env, "java/awt/DisplayMode");
if (JNU_IsNull(env, displayModeClass)) { if (JNU_IsNull(env, displayModeClass)) {
@ -1780,8 +1787,13 @@ X11GD_CreateDisplayMode(JNIEnv *env, jint width, jint height,
return NULL; return NULL;
} }
// early versions of xrandr may report "empty" rates (6880694)
if (validRefreshRate <= 0) {
validRefreshRate = REFRESH_RATE_UNKNOWN;
}
return (*env)->NewObject(env, displayModeClass, cid, return (*env)->NewObject(env, displayModeClass, cid,
width, height, bitDepth, refreshRate); width, height, bitDepth, validRefreshRate);
} }
static void static void
@ -1926,8 +1938,7 @@ Java_sun_awt_X11GraphicsDevice_getCurrentDisplayMode
curRate = awt_XRRConfigCurrentRate(config); curRate = awt_XRRConfigCurrentRate(config);
if ((sizes != NULL) && if ((sizes != NULL) &&
(curSizeIndex < nsizes) && (curSizeIndex < nsizes))
(curRate > 0))
{ {
XRRScreenSize curSize = sizes[curSizeIndex]; XRRScreenSize curSize = sizes[curSizeIndex];
displayMode = X11GD_CreateDisplayMode(env, displayMode = X11GD_CreateDisplayMode(env,
@ -2004,6 +2015,7 @@ Java_sun_awt_X11GraphicsDevice_configDisplayMode
jboolean success = JNI_FALSE; jboolean success = JNI_FALSE;
XRRScreenConfiguration *config; XRRScreenConfiguration *config;
Drawable root; Drawable root;
Rotation currentRotation = RR_Rotate_0;
AWT_LOCK(); AWT_LOCK();
@ -2015,6 +2027,7 @@ Java_sun_awt_X11GraphicsDevice_configDisplayMode
short chosenRate = -1; short chosenRate = -1;
int nsizes; int nsizes;
XRRScreenSize *sizes = awt_XRRConfigSizes(config, &nsizes); XRRScreenSize *sizes = awt_XRRConfigSizes(config, &nsizes);
awt_XRRConfigRotations(config, &currentRotation);
if (sizes != NULL) { if (sizes != NULL) {
int i, j; int i, j;
@ -2048,7 +2061,7 @@ Java_sun_awt_X11GraphicsDevice_configDisplayMode
Status status = Status status =
awt_XRRSetScreenConfigAndRate(awt_display, config, root, awt_XRRSetScreenConfigAndRate(awt_display, config, root,
chosenSizeIndex, chosenSizeIndex,
RR_Rotate_0, currentRotation,
chosenRate, chosenRate,
CurrentTime); CurrentTime);

View File

@ -42,6 +42,10 @@
#include <sys/ipc.h> #include <sys/ipc.h>
#include <sys/shm.h> #include <sys/shm.h>
#include <X11/extensions/XShm.h> #include <X11/extensions/XShm.h>
#ifndef X_ShmAttach
#include <X11/Xmd.h>
#include <X11/extensions/shmproto.h>
#endif
extern int XShmQueryExtension(); extern int XShmQueryExtension();

View File

@ -637,13 +637,13 @@ gboolean gtk2_load()
if (gtk_modules_env && strstr (gtk_modules_env, "atk-bridge") || if (gtk_modules_env && strstr (gtk_modules_env, "atk-bridge") ||
gtk_modules_env && strstr (gtk_modules_env, "gail")) gtk_modules_env && strstr (gtk_modules_env, "gail"))
{ {
gchar *tmp_env = strdup (gtk_modules_env);
/* the new env will be smaller than the old one */ /* the new env will be smaller than the old one */
gchar *s, *new_env = malloc (sizeof(ENV_PREFIX)+strlen (gtk_modules_env)); gchar *s, *new_env = malloc (sizeof(ENV_PREFIX)+strlen (gtk_modules_env));
if (new_env != NULL ) if (new_env != NULL )
{ {
/* careful, strtok modifies its args */ /* careful, strtok modifies its args */
gchar *tmp_env = strdup (gtk_modules_env);
strcpy(new_env, ENV_PREFIX); strcpy(new_env, ENV_PREFIX);
/* strip out 'atk-bridge' and 'gail' */ /* strip out 'atk-bridge' and 'gail' */

View File

@ -677,7 +677,7 @@ JNIEXPORT jstring JNICALL Java_sun_awt_X11_XToolkit_getEnv
jstring ret = NULL; jstring ret = NULL;
keystr = JNU_GetStringPlatformChars(env, key, NULL); keystr = JNU_GetStringPlatformChars(env, key, NULL);
if (key) { if (keystr) {
ptr = getenv(keystr); ptr = getenv(keystr);
if (ptr) { if (ptr) {
ret = JNU_NewStringPlatform(env, (const char *) ptr); ret = JNU_NewStringPlatform(env, (const char *) ptr);

View File

@ -353,6 +353,7 @@ public class Win32GraphicsDevice extends GraphicsDevice implements
} }
WWindowPeer peer = (WWindowPeer)old.getPeer(); WWindowPeer peer = (WWindowPeer)old.getPeer();
if (peer != null) { if (peer != null) {
peer.setFullScreenExclusiveModeState(false);
// we used to destroy the buffers on exiting fs mode, this // we used to destroy the buffers on exiting fs mode, this
// is no longer needed since fs change will cause a surface // is no longer needed since fs change will cause a surface
// data replacement // data replacement
@ -370,12 +371,15 @@ public class Win32GraphicsDevice extends GraphicsDevice implements
addFSWindowListener(w); addFSWindowListener(w);
// Enter full screen exclusive mode. // Enter full screen exclusive mode.
WWindowPeer peer = (WWindowPeer)w.getPeer(); WWindowPeer peer = (WWindowPeer)w.getPeer();
synchronized(peer) { if (peer != null) {
enterFullScreenExclusive(screen, peer); synchronized(peer) {
// Note: removed replaceSurfaceData() call because enterFullScreenExclusive(screen, peer);
// changing the window size or making it visible // Note: removed replaceSurfaceData() call because
// will cause this anyway, and both of these events happen // changing the window size or making it visible
// as part of switching into fullscreen mode. // will cause this anyway, and both of these events happen
// as part of switching into fullscreen mode.
}
peer.setFullScreenExclusiveModeState(true);
} }
// fix for 4868278 // fix for 4868278

View File

@ -524,7 +524,7 @@ final class Win32ShellFolder2 extends ShellFolder {
// NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details // NOTE: this method uses COM and must be called on the 'COM thread'. See ComInvoker for the details
private static native int compareIDs(long pParentIShellFolder, long pidl1, long pidl2); private static native int compareIDs(long pParentIShellFolder, long pidl1, long pidl2);
private Boolean cachedIsFileSystem; private volatile Boolean cachedIsFileSystem;
/** /**
* @return Whether this is a file system shell folder * @return Whether this is a file system shell folder
@ -693,29 +693,32 @@ final class Win32ShellFolder2 extends ShellFolder {
ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>(); ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>();
long pEnumObjects = getEnumObjects(includeHiddenFiles); long pEnumObjects = getEnumObjects(includeHiddenFiles);
if (pEnumObjects != 0) { if (pEnumObjects != 0) {
long childPIDL; try {
int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR; long childPIDL;
do { int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR;
childPIDL = getNextChild(pEnumObjects); do {
boolean releasePIDL = true; childPIDL = getNextChild(pEnumObjects);
if (childPIDL != 0 && boolean releasePIDL = true;
(getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) { if (childPIDL != 0 &&
Win32ShellFolder2 childFolder; (getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) {
if (Win32ShellFolder2.this.equals(desktop) Win32ShellFolder2 childFolder;
&& personal != null if (Win32ShellFolder2.this.equals(desktop)
&& pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) { && personal != null
childFolder = personal; && pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) {
} else { childFolder = personal;
childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL); } else {
releasePIDL = false; childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL);
releasePIDL = false;
}
list.add(childFolder);
} }
list.add(childFolder); if (releasePIDL) {
} releasePIDL(childPIDL);
if (releasePIDL) { }
releasePIDL(childPIDL); } while (childPIDL != 0 && !Thread.currentThread().isInterrupted());
} } finally {
} while (childPIDL != 0 && !Thread.currentThread().isInterrupted()); releaseEnumObjects(pEnumObjects);
releaseEnumObjects(pEnumObjects); }
} }
return Thread.currentThread().isInterrupted() return Thread.currentThread().isInterrupted()
? new File[0] ? new File[0]
@ -759,7 +762,7 @@ final class Win32ShellFolder2 extends ShellFolder {
}, InterruptedException.class); }, InterruptedException.class);
} }
private Boolean cachedIsLink; private volatile Boolean cachedIsLink;
/** /**
* @return Whether this shell folder is a link * @return Whether this shell folder is a link

View File

@ -79,9 +79,12 @@ public class Win32ShellFolderManager2 extends ShellFolderManager {
// Shouldn't happen but watch for it anyway // Shouldn't happen but watch for it anyway
throw new FileNotFoundException("File " + file.getAbsolutePath() + " not found"); throw new FileNotFoundException("File " + file.getAbsolutePath() + " not found");
} }
Win32ShellFolder2 folder = createShellFolderFromRelativePIDL(parent, pIDL);
Win32ShellFolder2.releasePIDL(pIDL); try {
return folder; return createShellFolderFromRelativePIDL(parent, pIDL);
} finally {
Win32ShellFolder2.releasePIDL(pIDL);
}
} }
static Win32ShellFolder2 createShellFolderFromRelativePIDL(Win32ShellFolder2 parent, long pIDL) static Win32ShellFolder2 createShellFolderFromRelativePIDL(Win32ShellFolder2 parent, long pIDL)
@ -269,7 +272,7 @@ public class Win32ShellFolderManager2 extends ShellFolderManager {
Arrays.sort(secondLevelFolders); Arrays.sort(secondLevelFolders);
for (File secondLevelFolder : secondLevelFolders) { for (File secondLevelFolder : secondLevelFolders) {
Win32ShellFolder2 folder = (Win32ShellFolder2) secondLevelFolder; Win32ShellFolder2 folder = (Win32ShellFolder2) secondLevelFolder;
if (!folder.isFileSystem() || folder.isDirectory()) { if (!folder.isFileSystem() || (folder.isDirectory() && !folder.isLink())) {
folders.add(folder); folders.add(folder);
// Add third level for "My Computer" // Add third level for "My Computer"
if (folder.equals(drives)) { if (folder.equals(drives)) {

View File

@ -550,8 +550,34 @@ public abstract class WComponentPeer extends WObjectPeer
final static Font defaultFont = new Font(Font.DIALOG, Font.PLAIN, 12); final static Font defaultFont = new Font(Font.DIALOG, Font.PLAIN, 12);
public Graphics getGraphics() { public Graphics getGraphics() {
if (isDisposed()) {
return null;
}
Component target = (Component)getTarget();
Window window = SunToolkit.getContainingWindow(target);
if (window != null && !window.isOpaque()) {
// Non-opaque windows do not support heavyweight children.
// Redirect all painting to the Window's Graphics instead.
// The caller is responsible for calling the
// WindowPeer.updateWindow() after painting has finished.
int x = 0, y = 0;
for (Component c = target; c != window; c = c.getParent()) {
x += c.getX();
y += c.getY();
}
Graphics g =
((WWindowPeer)window.getPeer()).getTranslucentGraphics();
g.translate(x, y);
g.clipRect(0, 0, target.getWidth(), target.getHeight());
return g;
}
SurfaceData surfaceData = this.surfaceData; SurfaceData surfaceData = this.surfaceData;
if (!isDisposed() && surfaceData != null) { if (surfaceData != null) {
/* Fix for bug 4746122. Color and Font shouldn't be null */ /* Fix for bug 4746122. Color and Font shouldn't be null */
Color bgColor = background; Color bgColor = background;
if (bgColor == null) { if (bgColor == null) {

Some files were not shown because too many files have changed in this diff Show More