diff --git a/.hgtags-top-repo b/.hgtags-top-repo
index 335c439b58f..97e4ff1601b 100644
--- a/.hgtags-top-repo
+++ b/.hgtags-top-repo
@@ -11,3 +11,4 @@ bb1ef4ee3d2c8cbf43a37d372325a7952be590b9 jdk7-b33
46a989ab932992b2084b946eeb322fa99b9fee6c jdk7-b34
143c1abedb7d3095eff0f9ee5fec9bf48e3490fc jdk7-b35
4b4f5fea8d7d0743f0c30d91fcd9bf9d96e5d2ad jdk7-b36
+744554f5a3290e11c71cd2ddb1aff49e431f9ed0 jdk7-b37
diff --git a/corba/.hgtags b/corba/.hgtags
index dcc46deaaef..296a27ee08e 100644
--- a/corba/.hgtags
+++ b/corba/.hgtags
@@ -11,3 +11,4 @@ ef6af34d75a7b44e77083f1d4ee47631fa09d3b4 jdk7-b31
0a812b9824e5d17b073765d1505594b49ff88a10 jdk7-b34
3867c4d14a5bfdbb37c97b4874ccb0ee5343111c jdk7-b35
0723891eb8d1c27e67c54163af0b4cea05a4e036 jdk7-b36
+59d5848bdedebe91cc2753acce78911bcb4a66db jdk7-b37
diff --git a/corba/make/common/Defs-windows.gmk b/corba/make/common/Defs-windows.gmk
index c5de04c03cb..aa863f64782 100644
--- a/corba/make/common/Defs-windows.gmk
+++ b/corba/make/common/Defs-windows.gmk
@@ -58,11 +58,24 @@ PLATFORM_INCLUDE = $(INCLUDEDIR)/$(PLATFORM_INCLUDE_NAME)
# The following DLL's are considered MS runtime libraries and should
# not to be REBASEd, see deploy/make/common/Release.gmk.
-# msvcrt.dll, msvcr71.dll: Microsoft runtimes
+# msvcrt.dll, msvcrnn.dll [msvcr71 or msvcr80 or msvcr90] : Microsoft runtimes
MS_RUNTIME_LIBRARIES = msvcrt.dll
+MSVCRNN_DLL =
ifeq ($(ARCH_DATA_MODEL), 32)
ifeq ($(COMPILER_VERSION), VS2003)
- MS_RUNTIME_LIBRARIES += msvcr71.dll
+ MSVCRNN_DLL = msvcr71.dll
+ MSVCPNN_DLL = msvcp71.dll
+ MS_RUNTIME_LIBRARIES += $(MSVCRNN_DLL)
+ endif
+ ifeq ($(COMPILER_VERSION), VS2005)
+ MSVCRNN_DLL = msvcr80.dll
+ MSVCPNN_DLL = msvcp80.dll
+ MS_RUNTIME_LIBRARIES += $(MSVCRNN_DLL)
+ endif
+ ifeq ($(COMPILER_VERSION), VS2008)
+ MSVCRNN_DLL = msvcr90.dll
+ MSVCPNN_DLL = msvcp90.dll
+ MS_RUNTIME_LIBRARIES += $(MSVCRNN_DLL)
endif
endif
@@ -148,6 +161,20 @@ ifeq ($(CC_VERSION),msvc)
CC_LOWER_OPT = -O1
endif
endif
+ ifeq ($(COMPILER_VERSION), VS2008)
+ # Automatic precompiled header option to use (if COMPILE_APPROACH=batch)
+ AUTOMATIC_PCH_OPTION =
+ GX_OPTION = -EHsc
+ ifeq ($(ARCH_DATA_MODEL), 32)
+ CC_HIGHEST_OPT = -O2
+ CC_HIGHER_OPT = -O1
+ CC_LOWER_OPT = -O1
+ else
+ CC_HIGHEST_OPT = -O2
+ CC_HIGHER_OPT = -O1
+ CC_LOWER_OPT = -O1
+ endif
+ endif
CC_NO_OPT = -Od
else # CC_VERSION
# GCC not supported, but left for historical reference...
@@ -179,7 +206,7 @@ endif
# -MTd Use static debug version (better than -MDd, no runtime issues)
# -D_DEBUG Change use of malloc/free/etc to use special debug ones (-MTd)
#
-# NOTE: We also will use /D _STATIC_CPPLIB so we don't need msvcp71.dll
+# NOTE: We also will use /D _STATIC_CPPLIB so we don't need msvcpnn.dll
#
ifeq ($(MS_RUNTIME_STATIC),true)
MS_RUNTIME_OPTION=-MT
@@ -217,7 +244,7 @@ ifeq ($(CC_VERSION),msvc)
# -YX -Fp/.../foobar.pch Use precompiled headers (try someday?)
# -nologo Don't print out startup message
# /D _STATIC_CPPLIB
- # Use static link for the C++ runtime (so msvcp71.dll not needed)
+ # Use static link for the C++ runtime (so msvcpnn.dll not needed)
#
CFLAGS_COMMON += -Zi -nologo
CFLAGS_OPT = $(POPT)
diff --git a/corba/make/common/shared/Compiler-msvc.gmk b/corba/make/common/shared/Compiler-msvc.gmk
index fbb8e8a5664..e42dce91a40 100644
--- a/corba/make/common/shared/Compiler-msvc.gmk
+++ b/corba/make/common/shared/Compiler-msvc.gmk
@@ -47,24 +47,17 @@ ifeq ($(PLATFORM), windows)
# unset any GNU Make settings of MFLAGS and MAKEFLAGS which may mess up nmake
NMAKE = MFLAGS= MAKEFLAGS= $(COMPILER_PATH)nmake -nologo
+ # Compiler version and type (Always get word after "Version")
+ CC_VER := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(SED) 's/.*\(Version.*\)/\1/' | $(NAWK) '{print $$2}')
+
# SDK-64 and MSVC6 put REBASE.EXE in a different places - go figure...
ifeq ($(ARCH_DATA_MODEL), 32)
- CC_VER := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(NAWK) '{print $$8}')
LINK_VER := $(shell $(LINK) | $(HEAD) -n 1 | $(NAWK) '{print $$6}')
- CC_TYPE := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(NAWK) '{print $$5}')
CC_MAJORVER :=$(call MajorVersion,$(CC_VER))
- REQUIRED_CCTYPE = Optimizing
- REQUIRED_CC_VER = 13.10.3077
- REQUIRED_LINK_VER = 7.10.3077
- ifeq ($(CC_MAJORVER), 12)
- # This should be: CC_VER=12.00.8168 LINK_VER=6.00.8447
- COMPILER_NAME=Visual C++ 6.0 Professional + VC6-SP 3
- COMPILER_VERSION=VC6
- REBASE = $(COMPILER_PATH)rebase
- MTL = $(COMPILER_PATH)midl
- endif
ifeq ($(CC_MAJORVER), 13)
# This should be: CC_VER=13.10.3077 LINK_VER=7.10.3077
+ REQUIRED_CC_VER = 13.10.3077
+ REQUIRED_LINK_VER = 7.10.3077
COMPILER_NAME=Visual Studio .NET 2003 Professional C++
COMPILER_VERSION=VS2003
REBASE = $(COMPILER_PATH)../../Common7/Tools/Bin/rebase
@@ -74,9 +67,10 @@ ifeq ($(PLATFORM), windows)
endif
endif
ifeq ($(CC_MAJORVER), 14)
- # This should be: CC_VER=14.00.0000 LINK_VER=8.00.0000
- # NOTE: This compiler has not been tried yet on 32bit systems
- COMPILER_NAME=Visual Studio .NET 2005
+ # This should be: CC_VER=14.00.50727.42 LINK_VER=8.00.50727.42
+ REQUIRED_CC_VER = 14.00.50727.42
+ REQUIRED_LINK_VER = 8.00.50727.42
+ COMPILER_NAME=Visual Studio 8
COMPILER_VERSION=VS2005
REBASE = $(COMPILER_PATH)../../Common8/Tools/Bin/rebase
MTL = $(COMPILER_PATH)../../Common8/Tools/Bin/midl
@@ -84,10 +78,22 @@ ifeq ($(PLATFORM), windows)
COMPILER_PATH := $(error COMPILER_PATH cannot be empty here)
endif
endif
+ ifeq ($(CC_MAJORVER), 15)
+ # This should be: CC_VER=15.00.21022.08 LINK_VER=9.00.21022.08
+ REQUIRED_CC_VER = 15.00.21022.08
+ REQUIRED_LINK_VER = 9.00.21022.08
+ COMPILER_NAME=Visual Studio 9
+ COMPILER_VERSION=VS2008
+ #rebase and midl moved out of Visual Studio into the SDK:
+ REBASE = $(MSDEVTOOLS_PATH)/rebase
+ MTL = $(MSDEVTOOLS_PATH)/midl.exe
+ ifndef COMPILER_PATH
+ COMPILER_PATH := $(error COMPILER_PATH cannot be empty here)
+ endif
+ endif
else
- CC_VER := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(NAWK) '{print $$7}')
+ # else ARCH_DATA_MODEL is 64
LINK_VER := $(shell $(LINK) | $(HEAD) -n 1 | $(NAWK) '{print $$6}')
- CC_TYPE := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(NAWK) '{print $$4}')
CC_MAJORVER :=$(call MajorVersion,$(CC_VER))
CC_MINORVER :=$(call MinorVersion,$(CC_VER))
CC_MICROVER :=$(call MicroVersion,$(CC_VER))
diff --git a/hotspot/.hgtags b/hotspot/.hgtags
index cf2a234e561..7cf7d998708 100644
--- a/hotspot/.hgtags
+++ b/hotspot/.hgtags
@@ -11,3 +11,4 @@ b727c32788a906c04839516ae7443a085185a300 jdk7-b32
5251a9cd8eb8743eee647365bee1c8afdc131556 jdk7-b34
5fa96a5a7e76da7c8dad12486293a0456c2c116c jdk7-b35
e91159f921a58af3698e6479ea1fc5818da66d09 jdk7-b36
+9ee9cf798b59e7d51f8c0a686959f313867a55d6 jdk7-b37
diff --git a/jdk/.hgtags b/jdk/.hgtags
index eca6adeb6fc..8a91ce7fabc 100644
--- a/jdk/.hgtags
+++ b/jdk/.hgtags
@@ -11,3 +11,4 @@ fa4c0a6cdd25d97d4e6f5d7aa180bcbb0e0d56af jdk7-b33
434055a0716ee44bca712ebca02fc04b20e6e288 jdk7-b34
cf4894b78ceb966326e93bf221db0c2d14d59218 jdk7-b35
134fd1a656ea85acd1f97f6700f75029b9b472a0 jdk7-b36
+14f50aee4989b75934d385c56a83da0c23d2f68b jdk7-b37
diff --git a/jdk/make/com/sun/Makefile b/jdk/make/com/sun/Makefile
index 0328f120d31..188e73670ad 100644
--- a/jdk/make/com/sun/Makefile
+++ b/jdk/make/com/sun/Makefile
@@ -41,7 +41,7 @@ endif
# Omit mirror since it's built with the apt tool.
SUBDIRS = $(SCRIPT_SUBDIR) image security crypto/provider jndi jmx \
java inputmethods org xml rowset net/httpserver net/ssl demo \
- tools jarsigner tracing
+ tools jarsigner tracing servicetag
all build clean clobber::
$(SUBDIRS-loop)
diff --git a/jdk/make/com/sun/servicetag/Makefile b/jdk/make/com/sun/servicetag/Makefile
new file mode 100644
index 00000000000..e7914e8278e
--- /dev/null
+++ b/jdk/make/com/sun/servicetag/Makefile
@@ -0,0 +1,80 @@
+# Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation. Sun designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Sun in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+# CA 95054 USA or visit www.sun.com if you need additional information or
+# have any questions.
+
+BUILDDIR = ../../..
+PACKAGE = com.sun.servicetag
+PRODUCT = sun
+include $(BUILDDIR)/common/Defs.gmk
+
+#
+# Files to compile
+#
+AUTO_FILES_JAVA_DIRS = com/sun/servicetag
+
+#
+# Rules
+#
+include $(BUILDDIR)/common/Classes.gmk
+
+SERVICETAG_LIBDIR = $(LIBDIR)/servicetag
+SERVICETAG_RESOURCES_DIR = $(CLASSDESTDIR)/com/sun/servicetag/resources
+FILES_copy = $(SERVICETAG_RESOURCES_DIR)/product_registration.xsd \
+ $(SERVICETAG_RESOURCES_DIR)/register.html \
+ $(SERVICETAG_RESOURCES_DIR)/register_ja.html \
+ $(SERVICETAG_RESOURCES_DIR)/register_zh_CN.html \
+ $(SERVICETAG_LIBDIR)/jdk_header.png
+
+# Add all properties files to the FILES_copy list
+SWORDFISH_properties := $(shell \
+ $(CD) $(SHARE_SRC)/classes/com/sun/servicetag/resources; \
+ $(FIND) . -name 'javase_*_swordfish.properties' -print ; \
+ )
+FILES_copy += $(shell \
+ for f in $(SWORDFISH_properties) ; do \
+ echo $(SERVICETAG_RESOURCES_DIR)/$$f ; \
+ done \
+)
+
+
+#
+#OTHER_JAVACFLAGS += -Xlint:unchecked
+
+build: install-servicetag-lib copy-files
+
+copy-files: $(FILES_copy)
+
+$(CLASSBINDIR)/%: $(SHARE_SRC)/classes/%
+ $(install-file)
+
+$(SERVICETAG_LIBDIR)/jdk_header.png: $(SHARE_SRC)/classes/com/sun/servicetag/resources/jdk_header.png
+ $(install-file)
+ $(CHMOD) 444 $@
+
+install-servicetag-lib:
+ @$(RM) -rf $(SERVICETAG_LIBDIR)
+ $(MKDIR) $(SERVICETAG_LIBDIR)
+
+clean clobber::
+ @$(RM) $(FILES_copy)
+
+.PHONY: copy-files
diff --git a/jdk/make/java/java/FILES_java.gmk b/jdk/make/java/java/FILES_java.gmk
index 577c58d9b5b..3117af8461f 100644
--- a/jdk/make/java/java/FILES_java.gmk
+++ b/jdk/make/java/java/FILES_java.gmk
@@ -209,6 +209,7 @@ JAVA_JAVA_java = \
sun/util/TimeZoneNameUtility.java \
sun/util/calendar/ZoneInfo.java \
sun/util/calendar/ZoneInfoFile.java \
+ sun/util/calendar/TzIDOldMapping.java \
java/util/TooManyListenersException.java \
java/util/Comparator.java \
java/util/Collections.java \
diff --git a/jdk/make/javax/swing/Makefile b/jdk/make/javax/swing/Makefile
index c2056a45ce2..e112e609cd9 100644
--- a/jdk/make/javax/swing/Makefile
+++ b/jdk/make/javax/swing/Makefile
@@ -33,7 +33,7 @@ include $(BUILDDIR)/common/Defs.gmk
# Files
#
include FILES.gmk
-AUTO_FILES_JAVA_DIRS = javax/swing sun/swing
+AUTO_FILES_JAVA_DIRS = javax/swing sun/swing com/sun/java/swing
AUTO_JAVA_PRUNE = plaf
SUBDIRS = html32dtd plaf
diff --git a/jdk/make/sun/javazic/tzdata/VERSION b/jdk/make/sun/javazic/tzdata/VERSION
index 95ed6ee539e..2f4f9df808f 100644
--- a/jdk/make/sun/javazic/tzdata/VERSION
+++ b/jdk/make/sun/javazic/tzdata/VERSION
@@ -21,4 +21,4 @@
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#
-tzdata2007h
+tzdata2008e
diff --git a/jdk/make/sun/javazic/tzdata/africa b/jdk/make/sun/javazic/tzdata/africa
index f1f4b5f1b7a..8141f080997 100644
--- a/jdk/make/sun/javazic/tzdata/africa
+++ b/jdk/make/sun/javazic/tzdata/africa
@@ -409,9 +409,63 @@ Zone Africa/Nouakchott -1:03:48 - LMT 1912
0:00 - GMT
# Mauritius
+
+# From Steffen Thorsen (2008-06-25):
+# Mauritius plans to observe DST from 2008-11-01 to 2009-03-31 on a trial
+# basis....
+# It seems that Mauritius observed daylight saving time from 1982-10-10 to
+# 1983-03-20 as well, but that was not successful....
+# http://www.timeanddate.com/news/time/mauritius-daylight-saving-time.html
+
+# From Alex Krivenyshev (2008-06-25):
+# http://economicdevelopment.gov.mu/portal/site/Mainhomepage/menuitem.a42b24128104d9845dabddd154508a0c/?content_id=0a7cee8b5d69a110VgnVCM1000000a04a8c0RCRD
+
+# From Arthur David Olson (2008-06-30):
+# The www.timeanddate.com article cited by Steffen Thorsen notes that "A
+# final decision has yet to be made on the times that daylight saving
+# would begin and end on these dates." As a place holder, use midnight.
+
+# From Paul Eggert (2008-06-30):
+# Follow Thorsen on DST in 1982/1983, instead of Shanks & Pottenger.
+
+# From Steffen Thorsen (2008-07-10):
+# According to
+#
+# http://www.lexpress.mu/display_article.php?news_id=111216
+#
+# (in French), Mauritius will start and end their DST a few days earlier
+# than previously announced (2008-11-01 to 2009-03-31). The new start
+# date is 2008-10-26 at 02:00 and the new end date is 2009-03-27 (no time
+# given, but it is probably at either 2 or 3 wall clock time).
+#
+# A little strange though, since the article says that they moved the date
+# to align itself with Europe and USA which also change time on that date,
+# but that means they have not paid attention to what happened in
+# USA/Canada last year (DST ends first Sunday in November). I also wonder
+# why that they end on a Friday, instead of aligning with Europe which
+# changes two days later.
+
+# From Alex Krivenyshev (2008-07-11):
+# Seems that English language article "The revival of daylight saving
+# time: Energy conservation?"-# No. 16578 (07/11/2008) was originally
+# published on Monday, June 30, 2008...
+#
+# I guess that article in French "Le gouvernement avance l'introduction
+# de l'heure d'ete" stating that DST in Mauritius starting on October 26
+# and ending on March 27, 2009 is the most recent one.
+# ...
+#
+# http://www.worldtimezone.com/dst_news/dst_news_mauritius02.html
+#
+
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Mauritius 1982 only - Oct 10 0:00 1:00 S
+Rule Mauritius 1983 only - Mar 21 0:00 0 -
+Rule Mauritius 2008 only - Oct 26 2:00s 1:00 S
+Rule Mauritius 2009 only - Mar 27 2:00s 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis
- 4:00 - MUT # Mauritius Time
+ 4:00 Mauritius MU%sT # Mauritius Time
# Agalega Is, Rodriguez
# no information; probably like Indian/Mauritius
@@ -422,6 +476,77 @@ Zone Indian/Mayotte 3:00:56 - LMT 1911 Jul # Mamoutzou
# Morocco
# See the `europe' file for Spanish Morocco (Africa/Ceuta).
+
+# From Alex Krivenyshev (2008-05-09):
+# Here is an article that Morocco plan to introduce Daylight Saving Time between
+# 1 June, 2008 and 27 September, 2008.
+#
+# "... Morocco is to save energy by adjusting its clock during summer so it will
+# be one hour ahead of GMT between 1 June and 27 September, according to
+# Communication Minister and Gov ernment Spokesman, Khalid Naciri...."
+#
+#
+# http://www.worldtimezone.net/dst_news/dst_news_morocco01.html
+#
+# OR
+#
+# http://en.afrik.com/news11892.html
+#
+
+# From Alex Krivenyshev (2008-05-09):
+# The Morocco time change can be confirmed on Morocco web site Maghreb Arabe Presse:
+#
+# http://www.map.ma/eng/sections/box3/morocco_shifts_to_da/view
+#
+#
+# Morocco shifts to daylight time on June 1st through September 27, Govt.
+# spokesman.
+
+# From Patrice Scattolin (2008-05-09):
+# According to this article:
+#
+# http://www.avmaroc.com/actualite/heure-dete-comment-a127896.html
+#
+# (and republished here:
+#
+# http://www.actu.ma/heure-dete-comment_i127896_0.html
+#
+# )
+# the changes occurs at midnight:
+#
+# saturday night may 31st at midnight (which in french is to be
+# intrepreted as the night between saturday and sunday)
+# sunday night the 28th at midnight
+#
+# Seeing that the 28th is monday, I am guessing that she intends to say
+# the midnight of the 28th which is the midnight between sunday and
+# monday, which jives with other sources that say that it's inclusive
+# june1st to sept 27th.
+#
+# The decision was taken by decree *2-08-224 *but I can't find the decree
+# published on the web.
+#
+# It's also confirmed here:
+#
+# http://www.maroc.ma/NR/exeres/FACF141F-D910-44B0-B7FA-6E03733425D1.htm
+#
+# on a government portal as being between june 1st and sept 27th (not yet
+# posted in english).
+#
+# The following google query will generate many relevant hits:
+#
+# http://www.google.com/search?hl=en&q=Conseil+de+gouvernement+maroc+heure+avance&btnG=Search
+#
+
+# From Alex Krivenyshev (2008-05-09):
+# Is Western Sahara (part which administrated by Morocco) going to follow
+# Morocco DST changes? Any information? What about other part of
+# Western Sahara - under administration of POLISARIO Front (also named
+# SADR Saharawi Arab Democratic Republic)?
+
+# From Arthur David Olson (2008-05-09):
+# XXX--guess that it is only Morocco for now; guess only 2008 for now.
+
# RULE NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Morocco 1939 only - Sep 12 0:00 1:00 S
Rule Morocco 1939 only - Nov 19 0:00 0 -
@@ -438,11 +563,13 @@ Rule Morocco 1976 only - Aug 1 0:00 0 -
Rule Morocco 1977 only - Sep 28 0:00 0 -
Rule Morocco 1978 only - Jun 1 0:00 1:00 S
Rule Morocco 1978 only - Aug 4 0:00 0 -
+Rule Morocco 2008 only - Jun 1 0:00 1:00 S
+Rule Morocco 2008 only - Sep 28 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26
0:00 Morocco WE%sT 1984 Mar 16
1:00 - CET 1986
- 0:00 - WET
+ 0:00 Morocco WE%sT
# Western Sahara
Zone Africa/El_Aaiun -0:52:48 - LMT 1934 Jan
-1:00 - WAT 1976 Apr 14
diff --git a/jdk/make/sun/javazic/tzdata/asia b/jdk/make/sun/javazic/tzdata/asia
index bec343b7796..be581970001 100644
--- a/jdk/make/sun/javazic/tzdata/asia
+++ b/jdk/make/sun/javazic/tzdata/asia
@@ -251,6 +251,28 @@ Rule PRC 1987 1991 - Apr Sun>=10 0:00 1:00 D
# (could be true), for the moment I am assuming that those two
# counties are mistakes in the astro.com data.
+# From Paul Eggert (2008-02-11):
+# I just now checked Google News for western news sources that talk
+# about China's single time zone, and couldn't find anything before 1986
+# talking about China being in one time zone. (That article was: Jim
+# Mann, "A clumsy embrace for another western custom: China on daylight
+# time--sort of", Los Angeles Times, 1986-05-05. By the way, this
+# article confirms the tz database's data claiming that China began
+# observing daylight saving time in 1986.
+#
+# From Thomas S. Mullaney (2008-02-11):
+# I think you're combining two subjects that need to treated
+# separately: daylight savings (which, you're correct, wasn't
+# implemented until the 1980s) and the unified time zone centered near
+# Beijing (which was implemented in 1949). Briefly, there was also a
+# "Lhasa Time" in Tibet and "Urumqi Time" in Xinjiang. The first was
+# ceased, and the second eventually recognized (again, in the 1980s).
+#
+# From Paul Eggert (2008-06-30):
+# There seems to be a good chance China switched to a single time zone in 1949
+# rather than in 1980 as Shanks & Pottenger have it, but we don't have a
+# reliable documentary source saying so yet, so for now we still go with
+# Shanks & Pottenger.
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
# Changbai Time ("Long-white Time", Long-white = Heilongjiang area)
@@ -468,13 +490,13 @@ Zone Asia/Dili 8:22:20 - LMT 1912
# India
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Asia/Calcutta 5:53:28 - LMT 1880 # Kolkata
+Zone Asia/Kolkata 5:53:28 - LMT 1880 # Kolkata
5:53:20 - HMT 1941 Oct # Howrah Mean Time?
6:30 - BURT 1942 May 15 # Burma Time
5:30 - IST 1942 Sep
5:30 1:00 IST 1945 Oct 15
5:30 - IST
-# The following are like Asia/Calcutta:
+# The following are like Asia/Kolkata:
# Andaman Is
# Lakshadweep (Laccadive, Minicoy and Amindivi Is)
# Nicobar Is
@@ -599,6 +621,15 @@ Zone Asia/Jayapura 9:22:48 - LMT 1932 Nov
# daylight saving time ...
# http://uk.reuters.com/article/oilRpt/idUKBLA65048420070916
#
+# From Roozbeh Pournader (2007-11-05):
+# This is quoted from Official Gazette of the Islamic Republic of
+# Iran, Volume 63, Number 18242, dated Tuesday 1386/6/24
+# [2007-10-16]. I am doing the best translation I can:...
+# The official time of the country will be moved forward for one hour
+# on the 24 hours of the first day of the month of Farvardin and will
+# be changed back to its previous state on the 24 hours of the
+# thirtieth day of Shahrivar.
+#
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Iran 1978 1980 - Mar 21 0:00 1:00 D
Rule Iran 1978 only - Oct 21 0:00 0 S
@@ -673,6 +704,21 @@ Zone Asia/Tehran 3:25:44 - LMT 1916
#
# So we'll ignore the Economist's claim.
+# From Steffen Thorsen (2008-03-10):
+# The cabinet in Iraq abolished DST last week, according to the following
+# news sources (in Arabic):
+#
+# http://www.aljeeran.net/wesima_articles/news-20080305-98602.html
+#
+#
+# http://www.aswataliraq.info/look/article.tpl?id=2047&IdLanguage=17&IdPublication=4&NrArticle=71743&NrIssue=1&NrSection=10
+#
+#
+# We have published a short article in English about the change:
+#
+# http://www.timeanddate.com/news/time/iraq-dumps-daylight-saving.html
+#
+
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Iraq 1982 only - May 1 0:00 1:00 D
Rule Iraq 1982 1984 - Oct 1 0:00 0 S
@@ -683,8 +729,8 @@ Rule Iraq 1986 1990 - Mar lastSun 1:00s 1:00 D
# IATA SSIM (1991/1996) says Apr 1 12:01am UTC; guess the `:01' is a typo.
# Shanks & Pottenger say Iraq did not observe DST 1992/1997; ignore this.
#
-Rule Iraq 1991 max - Apr 1 3:00s 1:00 D
-Rule Iraq 1991 max - Oct 1 3:00s 0 S
+Rule Iraq 1991 2007 - Apr 1 3:00s 1:00 D
+Rule Iraq 1991 2007 - Oct 1 3:00s 0 S
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Baghdad 2:57:40 - LMT 1890
2:57:36 - BMT 1918 # Baghdad Mean Time?
@@ -1374,6 +1420,42 @@ Zone Indian/Maldives 4:54:00 - LMT 1880 # Male
# They decided not to adopt daylight-saving time....
# http://www.mongolnews.mn/index.php?module=unuudur&sec=view&id=15742
+# From Deborah Goldsmith (2008-03-30):
+# We received a bug report claiming that the tz database UTC offset for
+# Asia/Choibalsan (GMT+09:00) is incorrect, and that it should be GMT
+# +08:00 instead. Different sources appear to disagree with the tz
+# database on this, e.g.:
+#
+#
+# http://www.timeanddate.com/worldclock/city.html?n=1026
+#
+#
+# http://www.worldtimeserver.com/current_time_in_MN.aspx
+#
+#
+# both say GMT+08:00.
+
+# From Steffen Thorsen (2008-03-31):
+# eznis airways, which operates several domestic flights, has a flight
+# schedule here:
+#
+# http://www.eznis.com/Container.jsp?id=112
+#
+# (click the English flag for English)
+#
+# There it appears that flights between Choibalsan and Ulaanbatar arrive
+# about 1:35 - 1:50 hours later in local clock time, no matter the
+# direction, while Ulaanbaatar-Khvod takes 2 hours in the Eastern
+# direction and 3:35 back, which indicates that Ulaanbatar and Khvod are
+# in different time zones (like we know about), while Choibalsan and
+# Ulaanbatar are in the same time zone (correction needed).
+
+# From Arthur David Olson (2008-05-19):
+# Assume that Choibalsan is indeed offset by 8:00.
+# XXX--in the absence of better information, assume that transition
+# was at the start of 2008-03-31 (the day of Steffen Thorsen's report);
+# this is almost surely wrong.
+
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Mongol 1983 1984 - Apr 1 0:00 1:00 S
Rule Mongol 1983 only - Oct 1 0:00 0 -
@@ -1409,7 +1491,8 @@ Zone Asia/Ulaanbaatar 7:07:32 - LMT 1905 Aug
Zone Asia/Choibalsan 7:38:00 - LMT 1905 Aug
7:00 - ULAT 1978
8:00 - ULAT 1983 Apr
- 9:00 Mongol CHO%sT # Choibalsan Time
+ 9:00 Mongol CHO%sT 2008 Mar 31 # Choibalsan Time
+ 8:00 Mongol CHO%sT
# Nepal
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -1459,10 +1542,32 @@ Zone Asia/Muscat 3:54:20 - LMT 1920
# The minister told a news conference that the experiment had rather
# shown 8 per cent higher consumption of electricity.
+# From Alex Krivenyshev (2008-05-15):
+#
+# Here is an article that Pakistan plan to introduce Daylight Saving Time
+# on June 1, 2008 for 3 months.
+#
+# "... The federal cabinet on Wednesday announced a new conservation plan to help
+# reduce load shedding by approving the closure of commercial centres at 9pm and
+# moving clocks forward by one hour for the next three months.
+# ...."
+#
+#
+# http://www.worldtimezone.net/dst_news/dst_news_pakistan01.html
+#
+# OR
+#
+# http://www.dailytimes.com.pk/default.asp?page=2008%5C05%5C15%5Cstory_15-5-2008_pg1_4
+#
+
+# From Arthur David Olson (2008-05-19):
+# XXX--midnight transitions is a guess; 2008 only is a guess.
# 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 - Oct Sun>=2 0:01 0 -
+Rule Pakistan 2008 only - Jun 1 0:00 1:00 S
+Rule Pakistan 2008 only - Sep 1 0:00 0 -
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Karachi 4:28:12 - LMT 1907
5:30 - IST 1942 Sep
@@ -1700,7 +1805,7 @@ Zone Asia/Singapore 6:55:25 - LMT 1901 Jan 1
# kept their clocks set five and a half hours ahead of Greenwich Mean
# Time (GMT), in line with neighbor India.
# From Paul Eggert (2006-04-18):
-# People who live in regions under Tamil control can use TZ='Asia/Calcutta',
+# People who live in regions under Tamil control can use [TZ='Asia/Kolkata'],
# as that zone has agreed with the Tamil areas since our cutoff date of 1970.
# From K Sethu (2006-04-25):
@@ -1790,10 +1895,62 @@ Rule Syria 2006 only - Sep 22 0:00 0 -
# From Paul Eggert (2007-03-29):
# Today the AP reported "Syria will switch to summertime at midnight Thursday."
# http://www.iht.com/articles/ap/2007/03/29/africa/ME-GEN-Syria-Time-Change.php
-# For lack of better info, assume the rule changed to "last Friday in March"
-# this year.
-Rule Syria 2007 max - Mar lastFri 0:00 1:00 S
-Rule Syria 2007 max - Oct 1 0:00 0 -
+Rule Syria 2007 only - Mar lastFri 0:00 1:00 S
+# From Jesper Norgard (2007-10-27):
+# The sister center ICARDA of my work CIMMYT is confirming that Syria DST will
+# not take place 1.st November at 0:00 o'clock but 1.st November at 24:00 or
+# rather Midnight between Thursday and Friday. This does make more sence than
+# having it between Wednesday and Thursday (two workdays in Syria) since the
+# weekend in Syria is not Saturday and Sunday, but Friday and Saturday. So now
+# it is implemented at midnight of the last workday before weekend...
+#
+# From Steffen Thorsen (2007-10-27):
+# Jesper Norgaard Welen wrote:
+#
+# > "Winter local time in Syria will be observed at midnight of Thursday 1
+# > November 2007, and the clock will be put back 1 hour."
+#
+# I found confirmation on this in this gov.sy-article (Arabic):
+# http://wehda.alwehda.gov.sy/_print_veiw.asp?FileName=12521710520070926111247
+#
+# which using Google's translate tools says:
+# Council of Ministers also approved the commencement of work on
+# identifying the winter time as of Friday, 2/11/2007 where the 60th
+# minute delay at midnight Thursday 1/11/2007.
+Rule Syria 2007 only - Nov Fri>=1 0:00 0 -
+
+# From Stephen Colebourne (2008-03-17):
+# For everyone's info, I saw an IATA time zone change for [Syria] for
+# this month (March 2008) in the last day or so...This is the data IATA
+# are now using:
+# Country Time Standard --- DST Start --- --- DST End --- DST
+# Name Zone Variation Time Date Time Date
+# Variation
+# Syrian Arab
+# Republic SY +0200 2200 03APR08 2100 30SEP08 +0300
+# 2200 02APR09 2100 30SEP09 +0300
+# 2200 01APR10 2100 30SEP10 +0300
+
+# From Arthur David Olson (2008-03-17):
+# Here's a link to English-language coverage by the Syrian Arab News
+# Agency (SANA)...
+#
+# http://www.sana.sy/eng/21/2008/03/11/165173.htm
+# ...which reads (in part) "The Cabinet approved the suggestion of the
+# Ministry of Electricity to begin daylight savings time on Friday April
+# 4th, advancing clocks one hour ahead on midnight of Thursday April 3rd."
+# Since Syria is two hours east of UTC, the 2200 and 2100 transition times
+# shown above match up with midnight in Syria.
+
+# From Arthur David Olson (2008-03-18):
+# My buest guess at a Syrian rule is "the Friday nearest April 1";
+# coding that involves either using a "Mar Fri>=29" construct that old time zone
+# compilers can't handle or having multiple Rules (a la Israel).
+# For now, use "Apr Fri>=1", and go with IATA on a uniform Sep 30 end.
+
+Rule Syria 2008 max - Apr Fri>=1 0:00 1:00 S
+Rule Syria 2008 max - Oct 1 0:00 0 -
+
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Asia/Damascus 2:25:12 - LMT 1920 # Dimashq
2:00 Syria EE%sT
@@ -1847,13 +2004,13 @@ Zone Asia/Tashkent 4:37:12 - LMT 1924 May 2
# Vietnam
-# From Paul Eggert (1993-11-18):
-# Saigon's official name is Thanh-Pho Ho Chi Minh, but it's too long.
-# We'll stick with the traditional name for now.
+# From Arthur David Olson (2008-03-18):
+# The English-language name of Vietnam's most populous city is "Ho Chi Min City";
+# we use Ho_Chi_Minh below to avoid a name of more than 14 characters.
# From Shanks & Pottenger:
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
-Zone Asia/Saigon 7:06:40 - LMT 1906 Jun 9
+Zone Asia/Ho_Chi_Minh 7:06:40 - LMT 1906 Jun 9
7:06:20 - SMT 1911 Mar 11 0:01 # Saigon MT?
7:00 - ICT 1912 May
8:00 - ICT 1931 May
diff --git a/jdk/make/sun/javazic/tzdata/australasia b/jdk/make/sun/javazic/tzdata/australasia
index eee5c0b5478..823550415e0 100644
--- a/jdk/make/sun/javazic/tzdata/australasia
+++ b/jdk/make/sun/javazic/tzdata/australasia
@@ -1368,7 +1368,7 @@ Zone Pacific/Wallis 12:15:20 - LMT 1901
# * Tonga will introduce DST in November
#
# I was given this link by John Letts:
-#
+#
# http://news.bbc.co.uk/hi/english/world/asia-pacific/newsid_424000/424764.stm
#
#
@@ -1378,7 +1378,7 @@ Zone Pacific/Wallis 12:15:20 - LMT 1901
# (12 + 1 hour DST).
# From Arthur David Olson (1999-09-20):
-# According to
# http://www.tongaonline.com/news/sept1799.html
# :
# "Daylight Savings Time will take effect on Oct. 2 through April 15, 2000
diff --git a/jdk/make/sun/javazic/tzdata/backward b/jdk/make/sun/javazic/tzdata/backward
index 0e64882a465..85522740f41 100644
--- a/jdk/make/sun/javazic/tzdata/backward
+++ b/jdk/make/sun/javazic/tzdata/backward
@@ -46,12 +46,15 @@ Link America/St_Thomas America/Virgin
Link Asia/Ashgabat Asia/Ashkhabad
Link Asia/Chongqing Asia/Chungking
Link Asia/Dhaka Asia/Dacca
+Link Asia/Kolkata Asia/Calcutta
Link Asia/Macau Asia/Macao
Link Asia/Jerusalem Asia/Tel_Aviv
+Link Asia/Ho_Chi_Minh Asia/Saigon
Link Asia/Thimphu Asia/Thimbu
Link Asia/Makassar Asia/Ujung_Pandang
Link Asia/Ulaanbaatar Asia/Ulan_Bator
Link Atlantic/Faroe Atlantic/Faeroe
+Link Europe/Oslo Atlantic/Jan_Mayen
Link Australia/Sydney Australia/ACT
Link Australia/Sydney Australia/Canberra
Link Australia/Lord_Howe Australia/LHI
diff --git a/jdk/make/sun/javazic/tzdata/europe b/jdk/make/sun/javazic/tzdata/europe
index 16fedf8036d..30724328383 100644
--- a/jdk/make/sun/javazic/tzdata/europe
+++ b/jdk/make/sun/javazic/tzdata/europe
@@ -479,7 +479,7 @@ Rule EU 1979 1995 - Sep lastSun 1:00u 0 -
Rule EU 1981 max - Mar lastSun 1:00u 1:00 S
Rule EU 1996 max - Oct lastSun 1:00u 0 -
# The most recent directive covers the years starting in 2002. See:
-#
# Directive 2000/84/EC of the European Parliament and of the Council
# of 19 January 2001 on summer-time arrangements.
#
@@ -502,9 +502,48 @@ Rule C-Eur 1940 only - Apr 1 2:00s 1:00 S
Rule C-Eur 1942 only - Nov 2 2:00s 0 -
Rule C-Eur 1943 only - Mar 29 2:00s 1:00 S
Rule C-Eur 1943 only - Oct 4 2:00s 0 -
-Rule C-Eur 1944 only - Apr 3 2:00s 1:00 S
+Rule C-Eur 1944 1945 - Apr Mon>=1 2:00s 1:00 S
# Whitman gives 1944 Oct 7; go with Shanks & Pottenger.
Rule C-Eur 1944 only - Oct 2 2:00s 0 -
+# From Jesper Norgaard Welen (2008-07-13):
+#
+# I found what is probably a typo of 2:00 which should perhaps be 2:00s
+# in the C-Eur rule from tz database version 2008d (this part was
+# corrected in version 2008d). The circumstancial evidence is simply the
+# tz database itself, as seen below:
+#
+# Zone Europe/Paris 0:09:21 - LMT 1891 Mar 15 0:01
+# 0:00 France WE%sT 1945 Sep 16 3:00
+#
+# Zone Europe/Monaco 0:29:32 - LMT 1891 Mar 15
+# 0:00 France WE%sT 1945 Sep 16 3:00
+#
+# Zone Europe/Belgrade 1:22:00 - LMT 1884
+# 1:00 1:00 CEST 1945 Sep 16 2:00s
+#
+# Rule France 1945 only - Sep 16 3:00 0 -
+# Rule Belgium 1945 only - Sep 16 2:00s 0 -
+# Rule Neth 1945 only - Sep 16 2:00s 0 -
+#
+# The rule line to be changed is:
+#
+# Rule C-Eur 1945 only - Sep 16 2:00 0 -
+#
+# It seems that Paris, Monaco, Rule France, Rule Belgium all agree on
+# 2:00 standard time, e.g. 3:00 local time. However there are no
+# countries that use C-Eur rules in September 1945, so the only items
+# affected are apparently these ficticious zones that translates acronyms
+# CET and MET:
+#
+# Zone CET 1:00 C-Eur CE%sT
+# Zone MET 1:00 C-Eur ME%sT
+#
+# It this is right then the corrected version would look like:
+#
+# Rule C-Eur 1945 only - Sep 16 2:00s 0 -
+#
+# A small step for mankind though 8-)
+Rule C-Eur 1945 only - Sep 16 2:00s 0 -
Rule C-Eur 1977 1980 - Apr Sun>=1 2:00s 1:00 S
Rule C-Eur 1977 only - Sep lastSun 2:00s 0 -
Rule C-Eur 1978 only - Oct 1 2:00s 0 -
@@ -747,7 +786,8 @@ Rule Bulg 1981 only - Sep 27 2:00 0 -
Zone Europe/Sofia 1:33:16 - LMT 1880
1:56:56 - IMT 1894 Nov 30 # Istanbul MT?
2:00 - EET 1942 Nov 2 3:00
- 1:00 C-Eur CE%sT 1945 Apr 2 3:00
+ 1:00 C-Eur CE%sT 1945
+ 1:00 - CET 1945 Apr 2 3:00
2:00 - EET 1979 Mar 31 23:00
2:00 Bulg EE%sT 1982 Sep 26 2:00
2:00 C-Eur EE%sT 1991
@@ -1115,33 +1155,40 @@ Zone Europe/Paris 0:09:21 - LMT 1891 Mar 15 0:01
# [See tz-link.htm for the URL.]
# From Joerg Schilling (2002-10-23):
-# In 1945, Berlin was switched to Moscow Summer time (GMT+4) by
+# In 1945, Berlin was switched to Moscow Summer time (GMT+4) by
+#
# General [Nikolai] Bersarin .
# From Paul Eggert (2003-03-08):
#
+# http://www.parlament-berlin.de/pds-fraktion.nsf/727459127c8b66ee8525662300459099/defc77cb784f180ac1256c2b0030274b/$FILE/bersarint.pdf
+#
# says that Bersarin issued an order to use Moscow time on May 20.
# However, Moscow did not observe daylight saving in 1945, so
# this was equivalent to CEMT (GMT+3), not GMT+4.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Germany 1945 only - Apr 2 2:00s 1:00 S
-Rule Germany 1945 only - May 24 2:00 2:00 M # Midsummer
-Rule Germany 1945 only - Sep 24 3:00 1:00 S
-Rule Germany 1945 only - Nov 18 2:00s 0 -
Rule Germany 1946 only - Apr 14 2:00s 1:00 S
Rule Germany 1946 only - Oct 7 2:00s 0 -
Rule Germany 1947 1949 - Oct Sun>=1 2:00s 0 -
-Rule Germany 1947 only - Apr 6 2:00s 1:00 S
+# http://www.ptb.de/de/org/4/44/441/salt.htm says the following transition
+# occurred at 3:00 MEZ, not the 2:00 MEZ given in Shanks & Pottenger.
+# Go with the PTB.
+Rule Germany 1947 only - Apr 6 3:00s 1:00 S
Rule Germany 1947 only - May 11 2:00s 2:00 M
Rule Germany 1947 only - Jun 29 3:00 1:00 S
Rule Germany 1948 only - Apr 18 2:00s 1:00 S
Rule Germany 1949 only - Apr 10 2:00s 1:00 S
+
+Rule SovietZone 1945 only - May 24 2:00 2:00 M # Midsummer
+Rule SovietZone 1945 only - Sep 24 3:00 1:00 S
+Rule SovietZone 1945 only - Nov 18 2:00s 0 -
+
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Europe/Berlin 0:53:28 - LMT 1893 Apr
- 1:00 C-Eur CE%sT 1945 Apr 2 2:00
+ 1:00 C-Eur CE%sT 1945 May 24 2:00
+ 1:00 SovietZone CE%sT 1946
1:00 Germany CE%sT 1980
1:00 EU CE%sT
@@ -1218,7 +1265,7 @@ Rule Hungary 1980 only - Apr 6 1:00 1:00 S
Zone Europe/Budapest 1:16:20 - LMT 1890 Oct
1:00 C-Eur CE%sT 1918
1:00 Hungary CE%sT 1941 Apr 6 2:00
- 1:00 C-Eur CE%sT 1945 May 1 23:00
+ 1:00 C-Eur CE%sT 1945
1:00 Hungary CE%sT 1980 Sep 28 2:00s
1:00 EU CE%sT
@@ -1736,7 +1783,6 @@ Zone Europe/Oslo 0:43:00 - LMT 1895 Jan 1
# come up with more definitive info about the timekeeping during the
# war years it's probably best just do do the following for now:
Link Europe/Oslo Arctic/Longyearbyen
-Link Europe/Oslo Atlantic/Jan_Mayen
# Poland
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
@@ -2136,7 +2182,8 @@ Zone Asia/Anadyr 11:49:56 - LMT 1924 May 2
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Europe/Belgrade 1:22:00 - LMT 1884
1:00 - CET 1941 Apr 18 23:00
- 1:00 C-Eur CE%sT 1945 May 8 2:00s
+ 1:00 C-Eur CE%sT 1945
+ 1:00 - CET 1945 May 8 2:00s
1:00 1:00 CEST 1945 Sep 16 2:00s
# Metod Kozelj reports that the legal date of
# transition to EU rules was 1982-11-27, for all of Yugoslavia at the time.
diff --git a/jdk/make/sun/javazic/tzdata/iso3166.tab b/jdk/make/sun/javazic/tzdata/iso3166.tab
index d976eb1a1a6..6931ee04a71 100644
--- a/jdk/make/sun/javazic/tzdata/iso3166.tab
+++ b/jdk/make/sun/javazic/tzdata/iso3166.tab
@@ -28,7 +28,7 @@
#
# This file contains a table with the following columns:
# 1. ISO 3166-1 alpha-2 country code, current as of
-# ISO 3166-1 Newsletter No. V-12 (2006-09-26). See:
+# ISO 3166-1 Newsletter VI-1 (2007-09-21). See:
#
# ISO 3166 Maintenance agency (ISO 3166/MA)
# .
@@ -69,6 +69,7 @@ BG Bulgaria
BH Bahrain
BI Burundi
BJ Benin
+BL St Barthelemy
BM Bermuda
BN Brunei
BO Bolivia
@@ -181,6 +182,7 @@ MA Morocco
MC Monaco
MD Moldova
ME Montenegro
+MF St Martin (French part)
MG Madagascar
MH Marshall Islands
MK Macedonia
diff --git a/jdk/make/sun/javazic/tzdata/leapseconds b/jdk/make/sun/javazic/tzdata/leapseconds
index 77d28dae9dd..4526cddf5b6 100644
--- a/jdk/make/sun/javazic/tzdata/leapseconds
+++ b/jdk/make/sun/javazic/tzdata/leapseconds
@@ -66,8 +66,10 @@ Leap 1995 Dec 31 23:59:60 + S
Leap 1997 Jun 30 23:59:60 + S
Leap 1998 Dec 31 23:59:60 + S
Leap 2005 Dec 31 23:59:60 + S
+Leap 2008 Dec 31 23:59:60 + S
# INTERNATIONAL EARTH ROTATION AND REFERENCE SYSTEMS SERVICE (IERS)
+#
# SERVICE INTERNATIONAL DE LA ROTATION TERRESTRE ET DES SYSTEMES DE REFERENCE
#
# SERVICE DE LA ROTATION TERRESTRE
@@ -75,30 +77,38 @@ Leap 2005 Dec 31 23:59:60 + S
# 61, Av. de l'Observatoire 75014 PARIS (France)
# Tel. : 33 (0) 1 40 51 22 26
# FAX : 33 (0) 1 40 51 22 91
-# Internet : services.iers@obspm.fr
+# e-mail : services.iers@obspm.fr
+# http://hpiers.obspm.fr/eop-pc
#
-# Paris, 28 June 2007
+# Paris, 4 July 2008
#
-# Bulletin C 34
+# Bulletin C 36
#
# To authorities responsible
# for the measurement and
# distribution of time
#
-# INFORMATION ON UTC - TAI
+# UTC TIME STEP
+# on the 1st of January 2009
#
-# NO positive leap second will be introduced at the end of December 2007.
-# The difference between Coordinated Universal Time UTC and the
-# International Atomic Time TAI is :
+# A positive leap second will be introduced at the end of December 2008.
+# The sequence of dates of the UTC second markers will be:
#
-# from 2006 January 1, 0h UTC, until further notice : UTC-TAI = -33 s
+# 2008 December 31, 23h 59m 59s
+# 2008 December 31, 23h 59m 60s
+# 2009 January 1, 0h 0m 0s
+#
+# The difference between UTC and the International Atomic Time TAI is:
+#
+# from 2006 January 1, 0h UTC, to 2009 January 1 0h UTC : UTC-TAI = - 33s
+# from 2009 January 1, 0h UTC, until further notice : UTC-TAI = - 34s
#
# Leap seconds can be introduced in UTC at the end of the months of December
-# or June, depending on the evolution of UT1-TAI. Bulletin C is mailed every
-# six months, either to announce a time step in UTC, or to confirm that there
+# or June, depending on the evolution of UT1-TAI. Bulletin C is mailed every
+# six months, either to announce a time step in UTC or to confirm that there
# will be no time step at the next possible date.
#
# Daniel GAMBIS
-# Director
+# Head
# Earth Orientation Center of IERS
# Observatoire de Paris, France
diff --git a/jdk/make/sun/javazic/tzdata/northamerica b/jdk/make/sun/javazic/tzdata/northamerica
index ab5bb5b2153..6e0317277b7 100644
--- a/jdk/make/sun/javazic/tzdata/northamerica
+++ b/jdk/make/sun/javazic/tzdata/northamerica
@@ -2098,8 +2098,8 @@ Zone America/Antigua -4:07:12 - LMT 1912 Mar 2
# http://www.jonesbahamas.com/?c=45&a=10412
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
-Rule Bahamas 1964 2006 - Oct lastSun 2:00 0 S
-Rule Bahamas 1964 1986 - Apr lastSun 2:00 1:00 D
+Rule Bahamas 1964 1975 - Oct lastSun 2:00 0 S
+Rule Bahamas 1964 1975 - Apr lastSun 2:00 1:00 D
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Nassau -5:09:24 - LMT 1912 Mar 2
-5:00 Bahamas E%sT 1976
@@ -2209,6 +2209,69 @@ Zone America/Costa_Rica -5:36:20 - LMT 1890 # San Jose
# says Cuban clocks will advance at midnight on March 10.
# For lack of better information, assume Cuba will use US rules,
# except that it switches at midnight standard time as usual.
+#
+# From Steffen Thorsen (2007-10-25):
+# Carlos Alberto Fonseca Arauz informed me that Cuba will end DST one week
+# earlier - on the last Sunday of October, just like in 2006.
+#
+# He supplied these references:
+#
+# http://www.prensalatina.com.mx/article.asp?ID=%7B4CC32C1B-A9F7-42FB-8A07-8631AFC923AF%7D&language=ES
+# http://actualidad.terra.es/sociedad/articulo/cuba_llama_ahorrar_energia_cambio_1957044.htm
+#
+# From Alex Kryvenishev (2007-10-25):
+# Here is also article from Granma (Cuba):
+#
+# [Regira] el Horario Normal desde el [proximo] domingo 28 de octubre
+# http://www.granma.cubaweb.cu/2007/10/24/nacional/artic07.html
+#
+# http://www.worldtimezone.com/dst_news/dst_news_cuba03.html
+
+# From Arthur David Olson (2008-03-09):
+# I'm in Maryland which is now observing United States Eastern Daylight
+# Time. At 9:44 local time I used RealPlayer to listen to
+#
+# http://media.enet.cu/radioreloj
+# , a Cuban information station, and heard
+# the time announced as "ocho cuarenta y cuatro" ("eight forty-four"),
+# indicating that Cuba is still on standard time.
+
+# From Steffen Thorsen (2008-03-12):
+# It seems that Cuba will start DST on Sunday, 2007-03-16...
+# It was announced yesterday, according to this source (in Spanish):
+#
+# http://www.nnc.cubaweb.cu/marzo-2008/cien-1-11-3-08.htm
+#
+#
+# Some more background information is posted here:
+#
+# http://www.timeanddate.com/news/time/cuba-starts-dst-march-16.html
+#
+#
+# The article also says that Cuba has been observing DST since 1963,
+# while Shanks (and tzdata) has 1965 as the first date (except in the
+# 1940's). Many other web pages in Cuba also claim that it has been
+# observed since 1963, but with the exception of 1970 - an exception
+# which is not present in tzdata/Shanks. So there is a chance we need to
+# change some historic records as well.
+#
+# One example:
+#
+# http://www.radiohc.cu/espanol/noticias/mar07/11mar/hor.htm
+#
+
+# From Jesper Norgaard Welen (2008-03-13):
+# The Cuban time change has just been confirmed on the most authoritative
+# web site, the Granma. Please check out
+#
+# http://www.granma.cubaweb.cu/2008/03/13/nacional/artic10.html
+#
+#
+# Basically as expected after Steffen Thorsens information, the change
+# will take place midnight between Saturday and Sunday.
+
+# From Arthur David Olson (2008-03-12):
+# Assume Sun>=15 (third Sunday) going forward.
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Cuba 1928 only - Jun 10 0:00 1:00 D
@@ -2240,9 +2303,9 @@ Rule Cuba 1997 only - Oct 12 0:00s 0 S
Rule Cuba 1998 1999 - Mar lastSun 0:00s 1:00 D
Rule Cuba 1998 2003 - Oct lastSun 0:00s 0 S
Rule Cuba 2000 2006 - Apr Sun>=1 0:00s 1:00 D
-Rule Cuba 2006 only - Oct lastSun 0:00s 0 S
-Rule Cuba 2007 max - Mar Sun>=8 0:00s 1:00 D
-Rule Cuba 2007 max - Nov Sun>=1 0:00s 0 S
+Rule Cuba 2006 max - Oct lastSun 0:00s 0 S
+Rule Cuba 2007 only - Mar Sun>=8 0:00s 1:00 D
+Rule Cuba 2008 max - Mar Sun>=15 0:00s 1:00 D
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Havana -5:29:28 - LMT 1890
@@ -2309,6 +2372,10 @@ Zone America/Grenada -4:07:00 - LMT 1911 Jul # St George's
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Guadeloupe -4:06:08 - LMT 1911 Jun 8 # Pointe a Pitre
-4:00 - AST
+# St Barthelemy
+Link America/Guadeloupe America/St_Barthelemy
+# St Martin (French part)
+Link America/Guadeloupe America/Marigot
# Guatemala
#
diff --git a/jdk/make/sun/javazic/tzdata/southamerica b/jdk/make/sun/javazic/tzdata/southamerica
index a147a1b0870..06a8d130e39 100644
--- a/jdk/make/sun/javazic/tzdata/southamerica
+++ b/jdk/make/sun/javazic/tzdata/southamerica
@@ -127,7 +127,11 @@ Rule Arg 1989 1992 - Oct Sun>=15 0:00 1:00 S
# which did not result in the switch of a time zone, as they stayed 9 hours
# from the International Date Line.
Rule Arg 1999 only - Oct Sun>=1 0:00 1:00 S
-Rule Arg 2000 only - Mar Sun>=1 0:00 0 -
+# From Paul Eggert (2007-12-28):
+# DST was set to expire on March 5, not March 3, but since it was converted
+# to standard time on March 3 it's more convenient for us to pretend that
+# it ended on March 3.
+Rule Arg 2000 only - Mar 3 0:00 0 -
#
# From Peter Gradelski via Steffen Thorsen (2000-03-01):
# We just checked with our Sao Paulo office and they say the government of
@@ -162,6 +166,30 @@ Rule Arg 2000 only - Mar Sun>=1 0:00 0 -
# This kind of things had always been done this way in Argentina.
# We are still -03:00 all year round in all of the country.
#
+# From Steffen Thorsen (2007-12-21):
+# A user (Leonardo Chaim) reported that Argentina will adopt DST....
+# all of the country (all Zone-entries) are affected. News reports like
+# http://www.lanacion.com.ar/opinion/nota.asp?nota_id=973037 indicate
+# that Argentina will use DST next year as well, from October to
+# March, although exact rules are not given.
+#
+# From Jesper Norgaard Welen (2007-12-26)
+# The last hurdle of Argentina DST is over, the proposal was approved in
+# the lower chamber too (Deputados) with a vote 192 for and 2 against.
+# By the way thanks to Mariano Absatz and Daniel Mario Vega for the link to
+# the original scanned proposal, where the dates and the zero hours are
+# clear and unambiguous...This is the article about final approval:
+#
+# http://www.lanacion.com.ar/politica/nota.asp?nota_id=973996
+#
+#
+# From Paul Eggert (2007-12-22):
+# For dates after mid-2008, the following rules are my guesses and
+# are quite possibly wrong, but are more likely than no DST at all.
+Rule Arg 2007 only - Dec 30 0:00 1:00 S
+Rule Arg 2008 max - Mar Sun>=15 0:00 0 -
+Rule Arg 2008 max - Oct Sun>=1 0:00 1:00 S
+
# From Mariano Absatz (2004-05-21):
# Today it was officially published that the Province of Mendoza is changing
# its timezone this winter... starting tomorrow night....
@@ -222,10 +250,80 @@ Rule Arg 2000 only - Mar Sun>=1 0:00 0 -
# http://www.sanjuan.gov.ar/prensa/archivo/000426.html
# http://www.sanjuan.gov.ar/prensa/archivo/000441.html
+# From Alex Krivenyshev (2008-01-17):
+# Here are articles that Argentina Province San Luis is planning to end DST
+# as earlier as upcoming Monday January 21, 2008 or February 2008:
+#
+# Provincia argentina retrasa reloj y marca diferencia con resto del pais
+# (Argentine Province delayed clock and mark difference with the rest of the
+# country)
+#
+# http://cl.invertia.com/noticias/noticia.aspx?idNoticia=200801171849_EFE_ET4373&idtel
+#
+#
+# Es inminente que en San Luis atrasen una hora los relojes
+# (It is imminent in San Luis clocks one hour delay)
+#
+# http://www.lagaceta.com.ar/vernotae.asp?id_nota=253414
+#
+#
+#
+# http://www.worldtimezone.net/dst_news/dst_news_argentina02.html
+#
+
+# From Jesper Norgaard Welen (2008-01-18):
+# The page of the San Luis provincial government
+#
+# http://www.sanluis.gov.ar/notas.asp?idCanal=0&id=22812
+#
+# confirms what Alex Krivenyshev has earlier sent to the tz
+# emailing list about that San Luis plans to return to standard
+# time much earlier than the rest of the country. It also
+# confirms that upon request the provinces San Juan and Mendoza
+# refused to follow San Luis in this change.
+#
+# The change is supposed to take place Monday the 21.st at 0:00
+# hours. As far as I understand it if this goes ahead, we need
+# a new timezone for San Luis (although there are also documented
+# independent changes in the southamerica file of San Luis in
+# 1990 and 1991 which has not been confirmed).
+
+# From Jesper Norgaard Welen (2008-01-25):
+# Unfortunately the below page has become defunct, about the San Luis
+# time change. Perhaps because it now is part of a group of pages "Most
+# important pages of 2008."
+#
+# You can use
+#
+# http://www.sanluis.gov.ar/notas.asp?idCanal=8141&id=22834
+#
+# instead it seems. Or use "Buscador" from the main page of the San Luis
+# government, and fill in "huso" and click OK, and you will get 3 pages
+# from which the first one is identical to the above.
+
+# From Mariano Absatz (2008-01-28):
+# I can confirm that the Province of San Luis (and so far only that
+# province) decided to go back to UTC-3 effective midnight Jan 20th 2008
+# (that is, Monday 21st at 0:00 is the time the clocks were delayed back
+# 1 hour), and they intend to keep UTC-3 as their timezone all year round
+# (that is, unless they change their mind any minute now).
+#
+# So we'll have to add yet another city to 'southamerica' (I think San
+# Luis city is the mos populated city in the Province, so it'd be
+# America/Argentina/San_Luis... of course I can't remember if San Luis's
+# history of particular changes goes along with Mendoza or San Juan :-(
+# (I only remember not being able to collect hard facts about San Luis
+# back in 2004, when these provinces changed to UTC-4 for a few days, I
+# mailed them personally and never got an answer).
+
+# From Paul Eggert (2008-06-30):
# Unless otherwise specified, data are from Shanks & Pottenger through 1992,
# from the IATA otherwise. As noted below, Shanks & Pottenger say that
-# America/Cordoba split into 6 subregions during 1991/1992, but we
-# haven't verified this yet so for now we'll keep it a single region.
+# America/Cordoba split into 6 subregions during 1991/1992, one of which
+# was America/San_Luis, but we haven't verified this yet so for now we'll
+# keep America/Cordoba a single region rather than splitting it into the
+# other 5 subregions.
+
#
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
#
@@ -236,18 +334,16 @@ Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31
-4:00 Arg AR%sT 1969 Oct 5
-3:00 Arg AR%sT 1999 Oct 3
-4:00 Arg AR%sT 2000 Mar 3
- -3:00 - ART
+ -3:00 Arg AR%sT
#
# Santa Fe (SF), Entre Rios (ER), Corrientes (CN), Misiones (MN), Chaco (CC),
# Formosa (FM), Salta (SA), Santiago del Estero (SE), Cordoba (CB),
-# San Luis (SL), La Pampa (LP), Neuquen (NQ), Rio Negro (RN)
+# La Pampa (LP), Neuquen (NQ), Rio Negro (RN)
#
# Shanks & Pottenger also make the following claims, which we haven't verified:
# - Formosa switched to -3:00 on 1991-01-07.
# - Misiones switched to -3:00 on 1990-12-29.
# - Chaco switched to -3:00 on 1991-01-04.
-# - San Luis switched to -4:00 on 1990-03-14, then to -3:00 on 1990-10-15,
-# then to -4:00 on 1991-03-01, then to -3:00 on 1991-06-01.
# - Santiago del Estero switched to -4:00 on 1991-04-01,
# then to -3:00 on 1991-04-26.
#
@@ -259,7 +355,7 @@ Zone America/Argentina/Cordoba -4:16:48 - LMT 1894 Oct 31
-4:00 - WART 1991 Oct 20
-3:00 Arg AR%sT 1999 Oct 3
-4:00 Arg AR%sT 2000 Mar 3
- -3:00 - ART
+ -3:00 Arg AR%sT
#
# Tucuman (TM)
Zone America/Argentina/Tucuman -4:20:52 - LMT 1894 Oct 31
@@ -272,7 +368,7 @@ Zone America/Argentina/Tucuman -4:20:52 - LMT 1894 Oct 31
-4:00 Arg AR%sT 2000 Mar 3
-3:00 - ART 2004 Jun 1
-4:00 - WART 2004 Jun 13
- -3:00 - ART
+ -3:00 Arg AR%sT
#
# La Rioja (LR)
Zone America/Argentina/La_Rioja -4:27:24 - LMT 1894 Oct 31
@@ -285,7 +381,7 @@ Zone America/Argentina/La_Rioja -4:27:24 - LMT 1894 Oct 31
-4:00 Arg AR%sT 2000 Mar 3
-3:00 - ART 2004 Jun 1
-4:00 - WART 2004 Jun 20
- -3:00 - ART
+ -3:00 Arg AR%sT
#
# San Juan (SJ)
Zone America/Argentina/San_Juan -4:34:04 - LMT 1894 Oct 31
@@ -298,7 +394,7 @@ Zone America/Argentina/San_Juan -4:34:04 - LMT 1894 Oct 31
-4:00 Arg AR%sT 2000 Mar 3
-3:00 - ART 2004 May 31
-4:00 - WART 2004 Jul 25
- -3:00 - ART
+ -3:00 Arg AR%sT
#
# Jujuy (JY)
Zone America/Argentina/Jujuy -4:21:12 - LMT 1894 Oct 31
@@ -312,7 +408,7 @@ Zone America/Argentina/Jujuy -4:21:12 - LMT 1894 Oct 31
-3:00 1:00 ARST 1992
-3:00 Arg AR%sT 1999 Oct 3
-4:00 Arg AR%sT 2000 Mar 3
- -3:00 - ART
+ -3:00 Arg AR%sT
#
# Catamarca (CT), Chubut (CH)
Zone America/Argentina/Catamarca -4:23:08 - LMT 1894 Oct 31
@@ -325,7 +421,7 @@ Zone America/Argentina/Catamarca -4:23:08 - LMT 1894 Oct 31
-4:00 Arg AR%sT 2000 Mar 3
-3:00 - ART 2004 Jun 1
-4:00 - WART 2004 Jun 20
- -3:00 - ART
+ -3:00 Arg AR%sT
#
# Mendoza (MZ)
Zone America/Argentina/Mendoza -4:35:16 - LMT 1894 Oct 31
@@ -342,6 +438,23 @@ Zone America/Argentina/Mendoza -4:35:16 - LMT 1894 Oct 31
-4:00 Arg AR%sT 2000 Mar 3
-3:00 - ART 2004 May 23
-4:00 - WART 2004 Sep 26
+ -3:00 Arg AR%sT
+#
+# San Luis (SL)
+Zone America/Argentina/San_Luis -4:25:24 - LMT 1894 Oct 31
+ -4:16:48 - CMT 1920 May
+ -4:00 - ART 1930 Dec
+ -4:00 Arg AR%sT 1969 Oct 5
+ -3:00 Arg AR%sT 1990
+ -3:00 1:00 ARST 1990 Mar 14
+ -4:00 - WART 1990 Oct 15
+ -4:00 1:00 WARST 1991 Mar 1
+ -4:00 - WART 1991 Jun 1
+ -3:00 - ART 1999 Oct 3
+ -4:00 1:00 WARST 2000 Mar 3
+ -3:00 - ART 2004 May 31
+ -4:00 - WART 2004 Jul 25
+ -3:00 Arg AR%sT 2008 Jan 21
-3:00 - ART
#
# Santa Cruz (SC)
@@ -353,7 +466,7 @@ Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31
-4:00 Arg AR%sT 2000 Mar 3
-3:00 - ART 2004 Jun 1
-4:00 - WART 2004 Jun 20
- -3:00 - ART
+ -3:00 Arg AR%sT
#
# Tierra del Fuego, Antartida e Islas del Atlantico Sur (TF)
Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31
@@ -364,7 +477,7 @@ Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31
-4:00 Arg AR%sT 2000 Mar 3
-3:00 - ART 2004 May 30
-4:00 - WART 2004 Jun 20
- -3:00 - ART
+ -3:00 Arg AR%sT
# Aruba
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -450,6 +563,50 @@ Zone America/La_Paz -4:32:36 - LMT 1890
# Brazil will start DST on 2007-10-14 00:00 and end on 2008-02-17 00:00:
# http://www.mme.gov.br/site/news/detail.do;jsessionid=BBA06811AFCAAC28F0285210913513DA?newsId=13975
+# From Paul Schulze (2008-06-24):
+# ...by law number 11.662 of April 24, 2008 (published in the "Diario
+# Oficial da Uniao"...) in Brazil there are changes in the timezones,
+# effective today (00:00am at June 24, 2008) as follows:
+#
+# a) The timezone UTC+5 is e[x]tinguished, with all the Acre state and the
+# part of the Amazonas state that had this timezone now being put to the
+# timezone UTC+4
+# b) The whole Para state now is put at timezone UTC+3, instead of just
+# part of it, as was before.
+#
+# This change follows a proposal of senator Tiao Viana of Acre state, that
+# proposed it due to concerns about open television channels displaying
+# programs inappropriate to youths in the states that had the timezone
+# UTC+5 too early in the night. In the occasion, some more corrections
+# were proposed, trying to unify the timezones of any given state. This
+# change modifies timezone rules defined in decree 2.784 of 18 June,
+# 1913.
+
+# From Rodrigo Severo (2008-06-24):
+# Just correcting the URL:
+#
+# https://www.in.gov.br/imprensa/visualiza/index.jsp?jornal=3Ddo&secao=3D1&pagina=3D1&data=3D25/04/2008
+#
+#
+# As a result of the above Decree I believe the America/Rio_Branco
+# timezone shall be modified from UTC-5 to UTC-4 and a new timezone shall
+# be created to represent the the west side of the Para State. I
+# suggest this new timezone be called Santarem as the most
+# important/populated city in the affected area.
+#
+# This new timezone would be the same as the Rio_Branco timezone up to
+# the 2008/06/24 change which would be to UTC-3 instead of UTC-4.
+
+# From Alex Krivenyshev (2008-06-24):
+# This is a quick reference page for New and Old Brazil Time Zones map.
+#
+# http://www.worldtimezone.com/brazil-time-new-old.php
+#
+#
+# - 4 time zones replaced by 3 time zones-eliminating time zone UTC- 05
+# (state Acre and the part of the Amazonas will be UTC/GMT- 04) - western
+# part of Par state is moving to one timezone UTC- 03 (from UTC -04).
+
# From Paul Eggert (2002-10-10):
# The official decrees referenced below are mostly taken from
#
@@ -572,13 +729,13 @@ Rule Brazil 2000 only - Feb 27 0:00 0 -
Rule Brazil 2000 2001 - Oct Sun>=8 0:00 1:00 S
Rule Brazil 2001 2006 - Feb Sun>=15 0:00 0 -
# Decree 4,399 (2002-10-01) repeals DST in AL, CE, MA, PB, PE, PI, RN, SE.
-#
+# 4,399
Rule Brazil 2002 only - Nov 3 0:00 1:00 S
# Decree 4,844 (2003-09-24; corrected 2003-09-26) repeals DST in BA, MT, TO.
-#
+# 4,844
Rule Brazil 2003 only - Oct 19 0:00 1:00 S
# Decree 5,223 (2004-10-01) reestablishes DST in MT.
-#
+# 5,223
Rule Brazil 2004 only - Nov 2 0:00 1:00 S
# Decree 5,539 (2005-09-19),
# adopted by the same states as before.
@@ -587,9 +744,8 @@ Rule Brazil 2005 only - Oct 16 0:00 1:00 S
# adopted by the same states as before.
Rule Brazil 2006 only - Nov 5 0:00 1:00 S
Rule Brazil 2007 only - Feb 25 0:00 0 -
-# (Decree number not yet known)
-# http://www.brasil.gov.br/noticias/ultimas_noticias/horario_verao070920/
-# (2007-09-20) after a heads-up from Steffen Thorsen:
+# Decree 6,212 (2007-09-26),
+# adopted by the same states as before.
Rule Brazil 2007 max - Oct Sun>=8 0:00 1:00 S
Rule Brazil 2008 max - Feb Sun>=15 0:00 0 -
# The latest ruleset listed above says that the following states observe DST:
@@ -597,7 +753,6 @@ Rule Brazil 2008 max - Feb Sun>=15 0:00 0 -
# For dates after mid-2008, the above rules with TO="max" are guesses
# and are quite possibly wrong, but are more likely than no DST at all.
-
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
#
# Fernando de Noronha (administratively part of PE)
@@ -623,6 +778,13 @@ Zone America/Belem -3:13:56 - LMT 1914
-3:00 Brazil BR%sT 1988 Sep 12
-3:00 - BRT
#
+# west Para (PA)
+# West Para includes Altamira, Oribidos, Prainha, Oriximina, and Santarem.
+Zone America/Santarem -3:38:48 - LMT 1914
+ -4:00 Brazil AM%sT 1988 Sep 12
+ -4:00 - AMT 2008 Jun 24 00:00
+ -3:00 - BRT
+#
# Maranhao (MA), Piaui (PI), Ceara (CE), Rio Grande do Norte (RN),
# Paraiba (PB)
Zone America/Fortaleza -2:34:00 - LMT 1914
@@ -685,8 +847,7 @@ Zone America/Cuiaba -3:44:20 - LMT 1914
-4:00 - AMT 2004 Oct 1
-4:00 Brazil AM%sT
#
-# west Para (PA), Rondonia (RO)
-# West Para includes Altamira, Oribidos, Prainha, Oriximina, and Santarem.
+# Rondonia (RO)
Zone America/Porto_Velho -4:15:36 - LMT 1914
-4:00 Brazil AM%sT 1988 Sep 12
-4:00 - AMT
@@ -713,13 +874,14 @@ Zone America/Eirunepe -4:39:28 - LMT 1914
-5:00 Brazil AC%sT 1988 Sep 12
-5:00 - ACT 1993 Sep 28
-5:00 Brazil AC%sT 1994 Sep 22
- -5:00 - ACT
+ -5:00 - ACT 2008 Jun 24 00:00
+ -4:00 - AMT
#
# Acre (AC)
Zone America/Rio_Branco -4:31:12 - LMT 1914
-5:00 Brazil AC%sT 1988 Sep 12
- -5:00 - ACT
-
+ -5:00 - ACT 2008 Jun 24 00:00
+ -4:00 - AMT
# Chile
@@ -753,6 +915,26 @@ Zone America/Rio_Branco -4:31:12 - LMT 1914
# America/Santiago. The pre-1980 Pacific/Easter data are dubious,
# but we have no other source.
+# From German Poo-Caaman~o (2008-03-03):
+# Due to drought, Chile extends Daylight Time in three weeks. This
+# is one-time change (Saturday 3/29 at 24:00 for America/Santiago
+# and Saturday 3/29 at 22:00 for Pacific/Easter)
+# The Supreme Decree is located at
+#
+# http://www.shoa.cl/servicios/supremo316.pdf
+#
+# and the instructions for 2008 are located in:
+#
+# http://www.horaoficial.cl/cambio.htm
+# .
+
+# From Jose Miguel Garrido (2008-03-05):
+# ...
+# You could see the announces of the change on
+#
+# http://www.shoa.cl/noticias/2008/04hora/hora.htm
+# .
+
# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
Rule Chile 1927 1932 - Sep 1 0:00 1:00 S
Rule Chile 1928 1932 - Apr 1 0:00 0 -
@@ -783,7 +965,11 @@ Rule Chile 1998 only - Mar Sun>=9 3:00u 0 -
Rule Chile 1998 only - Sep 27 4:00u 1:00 S
Rule Chile 1999 only - Apr 4 3:00u 0 -
Rule Chile 1999 max - Oct Sun>=9 4:00u 1:00 S
-Rule Chile 2000 max - Mar Sun>=9 3:00u 0 -
+Rule Chile 2000 2007 - Mar Sun>=9 3:00u 0 -
+# N.B.: the end of March 29 in Chile is March 30 in Universal time,
+# which is used below in specifying the transition.
+Rule Chile 2008 only - Mar 30 3:00u 0 -
+Rule Chile 2009 max - Mar Sun>=9 3:00u 0 -
# IATA SSIM anomalies: (1992-02) says 1992-03-14;
# (1996-09) says 1998-03-08. Ignore these.
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
@@ -1129,19 +1315,17 @@ Zone America/Montevideo -3:44:44 - LMT 1898 Jun 28
# Venezuela
#
-# From Kiraz Janicke (2007-09-25), in
-# http://www.venezuelanalysis.com/analysis/2645:
-# The proposal ... involves turning the clock back half an hour from
-# +4.00 Greenwich Mean Time (GMT), to +4.30GMT, the time zone
-# Venezuela had until December 31, 1964, when the current time zone
-# was adopted. The change was due to take place on September 17 and
-# then on September 24, but has since been postponed until December
-# 31, to allow for compliance with international organizations, such
-# as the International Office of Weights and Measures.
+# From John Stainforth (2007-11-28):
+# ... the change for Venezuela originally expected for 2007-12-31 has
+# been brought forward to 2007-12-09. The official announcement was
+# published today in the "Gaceta Oficial de la Republica Bolivariana
+# de Venezuela, numero 38.819" (official document for all laws or
+# resolution publication)
+# http://www.globovision.com/news.php?nid=72208
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Caracas -4:27:44 - LMT 1890
-4:27:40 - CMT 1912 Feb 12 # Caracas Mean Time?
-4:30 - VET 1965 # Venezuela Time
- -4:00 - VET 2008
+ -4:00 - VET 2007 Dec 9 03:00
-4:30 - VET
diff --git a/jdk/make/sun/javazic/tzdata/zone.tab b/jdk/make/sun/javazic/tzdata/zone.tab
index b252abd4fd0..a9c686227ec 100644
--- a/jdk/make/sun/javazic/tzdata/zone.tab
+++ b/jdk/make/sun/javazic/tzdata/zone.tab
@@ -64,7 +64,8 @@ AQ -7824+10654 Antarctica/Vostok Vostok Station, S Magnetic Pole
AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville Station, Terre Adelie
AQ -690022+0393524 Antarctica/Syowa Syowa Station, E Ongul I
AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF)
-AR -3124-06411 America/Argentina/Cordoba most locations (CB, CC, CN, ER, FM, LP, MN, NQ, RN, SA, SE, SF, SL)
+AR -3124-06411 America/Argentina/Cordoba most locations (CB, CC, CN, ER, FM, LP, MN, NQ, RN, SA, SE, SF)
+AR -3319-06621 America/Argentina/San_Luis San Luis (SL)
AR -2411-06518 America/Argentina/Jujuy Jujuy (JY)
AR -2649-06513 America/Argentina/Tucuman Tucuman (TM)
AR -2828-06547 America/Argentina/Catamarca Catamarca (CT), Chubut (CH)
@@ -99,6 +100,7 @@ BG +4241+02319 Europe/Sofia
BH +2623+05035 Asia/Bahrain
BI -0323+02922 Africa/Bujumbura
BJ +0629+00237 Africa/Porto-Novo
+BL +1753-06251 America/St_Barthelemy
BM +3217-06446 Atlantic/Bermuda
BN +0456+11455 Asia/Brunei
BO -1630-06809 America/La_Paz
@@ -112,7 +114,8 @@ BR -1259-03831 America/Bahia Bahia
BR -2332-04637 America/Sao_Paulo S & SE Brazil (GO, DF, MG, ES, RJ, SP, PR, SC, RS)
BR -2027-05437 America/Campo_Grande Mato Grosso do Sul
BR -1535-05605 America/Cuiaba Mato Grosso
-BR -0846-06354 America/Porto_Velho W Para, Rondonia
+BR -0226-05452 America/Santarem W Para
+BR -0846-06354 America/Porto_Velho Rondonia
BR +0249-06040 America/Boa_Vista Roraima
BR -0308-06001 America/Manaus E Amazonas
BR -0640-06952 America/Eirunepe W Amazonas
@@ -230,7 +233,7 @@ ID -0232+14042 Asia/Jayapura Irian Jaya & the Moluccas
IE +5320-00615 Europe/Dublin
IL +3146+03514 Asia/Jerusalem
IM +5409-00428 Europe/Isle_of_Man
-IN +2232+08822 Asia/Calcutta
+IN +2232+08822 Asia/Kolkata
IO -0720+07225 Indian/Chagos
IQ +3321+04425 Asia/Baghdad
IR +3540+05126 Asia/Tehran
@@ -272,6 +275,7 @@ MA +3339-00735 Africa/Casablanca
MC +4342+00723 Europe/Monaco
MD +4700+02850 Europe/Chisinau
ME +4226+01916 Europe/Podgorica
+MF +1804-06305 America/Marigot
MG -1855+04731 Indian/Antananarivo
MH +0709+17112 Pacific/Majuro most locations
MH +0905+16720 Pacific/Kwajalein Kwajalein
@@ -361,8 +365,7 @@ SE +5920+01803 Europe/Stockholm
SG +0117+10351 Asia/Singapore
SH -1555-00542 Atlantic/St_Helena
SI +4603+01431 Europe/Ljubljana
-SJ +7800+01600 Arctic/Longyearbyen Svalbard
-SJ +7059-00805 Atlantic/Jan_Mayen Jan Mayen
+SJ +7800+01600 Arctic/Longyearbyen
SK +4809+01707 Europe/Bratislava
SL +0830-01315 Africa/Freetown
SM +4355+01228 Europe/San_Marino
@@ -432,7 +435,7 @@ VC +1309-06114 America/St_Vincent
VE +1030-06656 America/Caracas
VG +1827-06437 America/Tortola
VI +1821-06456 America/St_Thomas
-VN +1045+10640 Asia/Saigon
+VN +1045+10640 Asia/Ho_Chi_Minh
VU -1740+16825 Pacific/Efate
WF -1318-17610 Pacific/Wallis
WS -1350-17144 Pacific/Apia
diff --git a/jdk/make/sun/net/spi/Makefile b/jdk/make/sun/net/spi/Makefile
index 20583bc4eb7..f969b87992a 100644
--- a/jdk/make/sun/net/spi/Makefile
+++ b/jdk/make/sun/net/spi/Makefile
@@ -23,10 +23,6 @@
# have any questions.
#
-#
-# Makefile for building com/sun
-#
-
BUILDDIR = ../../..
include $(BUILDDIR)/common/Defs.gmk
diff --git a/jdk/make/sun/net/spi/nameservice/Makefile b/jdk/make/sun/net/spi/nameservice/Makefile
index b6593c71d55..b0ff374de3d 100644
--- a/jdk/make/sun/net/spi/nameservice/Makefile
+++ b/jdk/make/sun/net/spi/nameservice/Makefile
@@ -23,10 +23,6 @@
# have any questions.
#
-#
-# Makefile for building com/sun
-#
-
BUILDDIR = ../../../..
include $(BUILDDIR)/common/Defs.gmk
diff --git a/jdk/make/sun/net/spi/nameservice/dns/Makefile b/jdk/make/sun/net/spi/nameservice/dns/Makefile
index 87d5e07f464..d86a3c69f00 100644
--- a/jdk/make/sun/net/spi/nameservice/dns/Makefile
+++ b/jdk/make/sun/net/spi/nameservice/dns/Makefile
@@ -24,7 +24,7 @@
#
#
-# Makefile for building JNDI service provider toolkit
+# Makefile for building JNDI DNS name service provider
#
BUILDDIR = ../../../../..
diff --git a/jdk/make/tools/Makefile b/jdk/make/tools/Makefile
index 68dfe8ef333..3803fbc6eda 100644
--- a/jdk/make/tools/Makefile
+++ b/jdk/make/tools/Makefile
@@ -32,7 +32,6 @@ include $(BUILDDIR)/common/Defs.gmk
SUBDIRS = \
addjsum \
- auto_multi \
buildmetaindex \
commentchecker \
compile_font_config \
diff --git a/jdk/make/tools/src/build/tools/automulti/AutoMulti.java b/jdk/make/tools/src/build/tools/automulti/AutoMulti.java
deleted file mode 100644
index a59edc856ca..00000000000
--- a/jdk/make/tools/src/build/tools/automulti/AutoMulti.java
+++ /dev/null
@@ -1,458 +0,0 @@
-/*
- * Copyright 1998-2001 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package build.tools.automulti;
-
-import java.lang.reflect.*;
-import java.util.*;
-import java.io.*;
-
-/**
- * Automatically generates the Multiplexing UI classes
- * for Swing.
- *
- * To use, type 'java AutoMulti ' where
- * is the directory containing the source for Swing's UI classes and
- * is the package prefix to use before ".swing.plaf.multi".
- * For example:
- *
- *
- * cd TEST
- * ../../../../build/solaris-sparc/bin/java AutoMulti ../../../../src/share/classes/javax/swing/plaf javax
- *
- *
- * AutoMulti will scour the plaf directory for *UI.java files and
- * generate Multi*UI.java files that do the multiplexing thing.
- *
- * NOTE: This tool depends upon the existence of and on the
- * compiled classes from being somewhere in the class path.
- *
- * @author Willie Walker
- */
-public class AutoMulti {
- static String importLines;
-
- /**
- * A silly list of parameter names to use. Skips "i" because we use
- * it as a 'for' loop counter. If you want to get fancy, please feel
- * to change how parameter names are obtained. This will break if
- * someone decides to create a UI method that takes more than 8
- * parameters. Which one is a bug (this breaking or having a method
- * with more than eight parameters) is a subjective thing.
- */
- public static String[] paramNames = {"a","b","c","d","e","f","g","h"};
-
- /**
- * Removes the package names (e.g., javax.swing) from the name.
- */
- public static String unqualifyName(String name) {
- StringTokenizer parser = new StringTokenizer(name,".");
- String unqualifiedName = null;
- while (parser.hasMoreTokens()) {
- unqualifiedName = parser.nextToken();
- }
- return removeDollars(unqualifiedName);
- }
-
- /**
- * Strips the extension from the filename.
- */
- public static String stripExtension(String name) {
- StringTokenizer parser = new StringTokenizer(name,".");
- return parser.nextToken();
- }
-
- /**
- * Adds some spaces.
- */
- public static void indent(StringBuffer s, int i) {
- while (i > 0) {
- s.append(" ");
- i--;
- }
- }
-
- /**
- * Spits out all the beginning stuff.
- */
- public static StringBuffer createPreamble(String prefixName) {
- StringBuffer s = new StringBuffer();
- s.append("/*\n");
- s.append(" *\n");
- s.append(" * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.\n");
- s.append(" * \n");
- s.append(" * This software is the proprietary information of Sun Microsystems, Inc. \n");
- s.append(" * Use is subject to license terms.\n");
- s.append(" * \n");
- s.append(" */\n");
- s.append("package " + prefixName + ".swing.plaf.multi;\n");
- s.append("\n");
- return s;
- }
-
- /**
- * Replaces 'Xxx$Yyy' with "Xxx'. Used by addImport because you
- * can't import nested classes directly.
- */
- public static String removeNestedClassName(String s) {
- int dollarPosition = s.indexOf('$');
-
- if (dollarPosition >= 0) { // s contains '$'
- StringBuffer sb = new StringBuffer(s);
- sb.setLength(dollarPosition);
- return sb.toString();
- } else { // no '$'
- return s;
- }
- }
-
- /**
- * Replaces '$' with ".'. Needed for printing inner class names
- * for argument and return types.
- */
- public static String removeDollars(String s) {
- int dollarPosition = s.indexOf('$');
-
- if (dollarPosition >= 0) { // s contains '$'
- StringBuffer sb = new StringBuffer(s);
- while (dollarPosition >= 0) {
- //XXX: will there ever be more than one '$'?
- sb.replace(dollarPosition, dollarPosition+1, ".");
- dollarPosition = sb.indexOf("$", dollarPosition);
- }
- return sb.toString();
- } else { // no $
- return s;
- }
- }
-
- /**
- * Adds an import line to the String.
- */
- public static void addImport(String s, Class theClass) {
- if (!theClass.isPrimitive() && (theClass != Object.class)) {
- String className = removeNestedClassName(theClass.getName());
- String importLine = new String("import " + className + ";\n");
- if (importLines.indexOf(importLine) == -1) {
- importLines += importLine;
- }
- }
- }
-
- /**
- * Spits out the class header information.
- */
- public static void addHeader(StringBuffer s, String className) {
- s.append("/**\n");
- s.append(" * A multiplexing UI used to combine " + className + "
s.\n");
- s.append(" * \n");
- s.append(" * This file was automatically generated by AutoMulti.\n");
- s.append(" *\n");
- s.append(" * @author Otto Multey\n"); // Get it? I crack myself up.
- s.append(" */\n");
- s.append("public class Multi" + className + " extends " + className + " {\n");
- s.append("\n");
- s.append(" /**\n");
- s.append(" * The vector containing the real UIs. This is populated \n");
- s.append(" * in the call to createUI
, and can be obtained by calling\n");
- s.append(" * the getUIs
method. The first element is guaranteed to be the real UI \n");
- s.append(" * obtained from the default look and feel.\n");
- s.append(" */\n");
- s.append(" protected Vector uis = new Vector();\n");
- s.append("\n");
- s.append("////////////////////\n");
- s.append("// Common UI methods\n");
- s.append("////////////////////\n");
- s.append("\n");
- s.append(" /**\n");
- s.append(" * Returns the list of UIs associated with this multiplexing UI. This \n");
- s.append(" * allows processing of the UIs by an application aware of multiplexing \n");
- s.append(" * UIs on components.\n");
- s.append(" */\n");
- s.append(" public ComponentUI[] getUIs() {\n");
- s.append(" return MultiLookAndFeel.uisToArray(uis);\n");
- s.append(" }\n");
- }
-
- /**
- * Prints out the code for a method. This is pretty specific to the
- * Multiplexing UI code, so don't get any fancy ideas.
- */
- public static void addMethod(StringBuffer s, Method m, String origName, String className) {
-
- // Get the method name and the return type. Be a little careful about arrays.
- //
- String methodName = unqualifyName(m.getName());
- String returnType;
- if (!m.getReturnType().isArray()) {
- returnType = unqualifyName(m.getReturnType().toString());
- addImport(importLines,m.getReturnType());
- } else {
- returnType = unqualifyName(m.getReturnType().getComponentType().toString())
- + "[]";
- addImport(importLines,m.getReturnType().getComponentType());
- }
-
- // Print the javadoc
- //
- s.append("\n");
- if (methodName.equals("createUI")) {
- s.append(" /**\n");
- s.append(" * Returns a multiplexing UI instance if any of the auxiliary\n");
- s.append(" * LookAndFeel
s supports this UI. Otherwise, just returns the \n");
- s.append(" * UI object obtained from the default LookAndFeel
.\n");
- s.append(" */\n");
- } else if (!returnType.equals("void")) {
- s.append(" /**\n");
- s.append(" * Invokes the " + methodName + "
method on each UI handled by this object.\n");
- s.append(" * \n");
- s.append(" * @return the value obtained from the first UI, which is\n");
- s.append(" * the UI obtained from the default LookAndFeel
\n");
- s.append(" */\n");
- } else {
- s.append(" /**\n");
- s.append(" * Invokes the " + methodName
- + "
method on each UI handled by this object.\n");
- s.append(" */\n");
- }
-
- // Print the method signature
- //
- s.append(" public");
- if (Modifier.isStatic(m.getModifiers())) {
- s.append(" static");
- }
- s.append(" " + returnType);
- s.append(" " + methodName);
- s.append("(");
-
- Class[] params = m.getParameterTypes();
- Class temp;
- String braces;
- for (int i = 0; i < params.length; i++) {
- if (i > 0) {
- s.append(", ");
- }
- temp = params[i];
- braces = new String("");
- while (temp.isArray()) {
- braces += "[]";
- temp = temp.getComponentType();
- }
- s.append(unqualifyName(temp.getName()) + braces + " " + paramNames[i]);
- addImport(importLines,temp);
- }
- s.append(")");
-
- // Don't forget about exceptions
- //
- Class exceptions[] = m.getExceptionTypes();
- String throwsString = new String("");
-
- if (exceptions.length > 0) {
- s.append("\n");
- indent(s,12);
- s.append("throws ");
- for (int i = 0; i < exceptions.length; i++) {
- if (i > 0) {
- s.append(", ");
- }
- s.append(unqualifyName(exceptions[i].getName()));
- addImport(importLines,exceptions[i]);
- }
- }
- s.append(throwsString + " {\n");
-
- // Now print out the contents of the method. We do a special thing
- // for the createUI method, another thing if the method returns 'void'
- // and a third thing if we don't do either of the first two. If
- // you want to squash this down, feel free.
- //
- if (methodName.equals("createUI")) {
- indent(s,8);
- s.append("ComponentUI mui = new Multi" + origName + "();\n");
- indent(s,8);
- s.append("return MultiLookAndFeel.createUIs(mui,\n");
- indent(s,42);
- s.append("((Multi" + origName +") mui).uis,\n");
- indent(s,42);
- for (int i = 0; i < params.length; i++) {
- if (i > 0) {
- s.append(",");
- }
- s.append(paramNames[i]);
- }
- s.append(");\n");
- } else if (!returnType.equals("void")) {
- indent(s,8);
- s.append(returnType + " returnValue = \n");
- indent(s,12);
- s.append("((" + className + ") (uis.elementAt(0)))."
- + methodName + "(");
- for (int i = 0; i < params.length; i++) {
- if (i > 0) {
- s.append(",");
- }
- s.append(paramNames[i]);
- }
- s.append(");\n");
- indent(s,8);
- s.append("for (int i = 1; i < uis.size(); i++) {\n");
- indent(s,12);
- s.append("((" + className + ") (uis.elementAt(i)))."
- + methodName + "(");
- for (int i = 0; i < params.length; i++) {
- if (i > 0) {
- s.append(",");
- }
- s.append(paramNames[i]);
- }
- s.append(");\n");
- indent(s,8);
- s.append("}\n");
- indent(s,8);
- s.append("return returnValue;\n");
- } else {
- indent(s,8);
- s.append("for (int i = 0; i < uis.size(); i++) {\n");
- indent(s,12);
- s.append("((" + className + ") (uis.elementAt(i)))."
- + methodName + "(");
- for (int i = 0; i < params.length; i++) {
- if (i > 0) {
- s.append(",");
- }
- s.append(paramNames[i]);
- }
- s.append(");\n");
- indent(s,8);
- s.append("}\n");
- }
- indent(s,4);
- s.append("}\n");
- }
-
- /**
- * Takes a plaf class name (e.g., "MenuUI") and generates the corresponding
- * Multiplexing UI Java source code (e.g., "MultiMenuUI.java").
- */
- public static void generateFile(String prefixName, String className) {
- try {
- FileOutputStream fos;
- PrintWriter outFile;
-
- importLines = new String();
- importLines += new String("import java.util.Vector;\n");
-
- StringBuffer body = new StringBuffer();
- Class wee = Class.forName(prefixName + ".swing.plaf." + className);
- String weeName = unqualifyName(wee.getName());
- addImport(importLines,wee);
- while (!weeName.equals("Object")) {
- body.append("\n");
- body.append("////////////////////\n");
- body.append("// " + weeName + " methods\n");
- body.append("////////////////////\n");
- Method[] methods = wee.getDeclaredMethods();
- for (int i=0; i < methods.length; i++) {
- if (Modifier.isPublic(methods[i].getModifiers())) {
- addMethod(body,methods[i],className,weeName);
- }
- }
- wee = wee.getSuperclass();
- weeName = unqualifyName(wee.getName());
- addImport(importLines,wee);
- }
-
- fos = new FileOutputStream("Multi" + className + ".java");
- outFile = new PrintWriter(fos);
- StringBuffer outText = createPreamble(prefixName);
- outText.append(importLines.toString() + "\n");
- addHeader(outText,className);
- outText.append(body.toString());
- outText.append("}\n");
- outFile.write(outText.toString());
- outFile.flush();
- outFile.close();
- } catch (Exception e) {
- System.err.println(e);
- }
- }
-
- /**
- * D'Oh! Something bad happened.
- */
- public static void usage(String s) throws IOException {
- System.err.println("Usage: AutoMulti [com.sun]");
- throw new IllegalArgumentException(s);
- }
-
- /**
- * Takes the plaf directory name and generates the multiplexing UI
- * source code.
- */
- public static void main(String[] args) throws IOException {
-
- if (args.length < 1) {
- usage("");
- }
-
- String dirName = args[0];
- File dir = new File(dirName);
- if (!dir.isDirectory()) {
- System.err.println("No such directory: " + dirName);
- usage("");
- }
-
- String prefixName;
- if (args.length > 1) {
- prefixName = args[1];
- } else {
- prefixName = "com.sun.java";
- }
-
- String plafUIs[] = dir.list(new UIJavaFilter());
- for (int i = 0; i < plafUIs.length; i++) {
- generateFile(prefixName,stripExtension(plafUIs[i]));
- }
- }
-}
-
-/**
- * Only accepts file names of the form *UI.java. The one exception
- * is not accepting ComponentUI.java because we don't need to generate
- * a multiplexing class for it.
- */
-class UIJavaFilter implements FilenameFilter {
- public boolean accept(File dir, String name) {
- if (name.equals("ComponentUI.java")) {
- return false;
- } else if (name.endsWith("UI.java")) {
- return true;
- } else {
- return false;
- }
- }
-}
diff --git a/jdk/make/tools/src/build/tools/automulti/README.txt b/jdk/make/tools/src/build/tools/automulti/README.txt
deleted file mode 100644
index b5de5afe910..00000000000
--- a/jdk/make/tools/src/build/tools/automulti/README.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-AutoMulti is the tool that automatically generates the
-Multi*UI classes for the Multiplexing look and feel.
-Instructions for using it are in AutoMulti.java.
-
-TestALFGenerator is a tool (a variation of AutoMulti)
-that automatically generates an auxiliary look and
-feel that you can use to test the Multiplexing look
-and feel. The TestALF look and feel implements every
-method by printing the message "In the xxx method of
-the TextALFYyyUI class." and, except in the case of
-createUI, returning something meaningless (since,
-except in the case of createUI, the return value is
-ignored).
-
-TestALFLookAndFeel.java is the only non-auto-generated
-file for the TestALF L&F. If you specify a package
-argument to TestALFGenerator, you'll have to change
-the code in TestALFLookAndFeel.java to reflect the
-package name.
-
-To test any application with the TestALF, make sure the
-compiled TestALF classes are in the class path. Then add
-this to the /lib/swing.properties file (which
-you'll probably have to create):
-
-swing.auxiliarylaf=TestALFLookAndFeel
-
-E.g., if you're running SwingSet2 against your solaris
-build, then you'd create/edit the swing.properties file
-in /build/solaris-sparc/lib.
-
-Then run any app. You'll see lots of thrilling "In the
-Xxxx method of the Yyy class" messages. If you get anything
-else (especially an exception), then you've found a bug.
-Probably in the default look and feel.
-
diff --git a/jdk/make/tools/src/build/tools/automulti/TestALFGenerator.java b/jdk/make/tools/src/build/tools/automulti/TestALFGenerator.java
deleted file mode 100644
index 9b07dbc4048..00000000000
--- a/jdk/make/tools/src/build/tools/automulti/TestALFGenerator.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-
-package build.tools.automulti;
-
-import java.lang.reflect.*;
-import java.util.*;
-import java.io.*;
-
-/**
- * Automatically generates an auxiliary look and feel to be
- * used for testing the Multiplexing look and feel.
- *
- * To use, type 'java TestALFGenerator []' where
- * is the directory containing the source for Swing's UI classes.
- * is an optional argument that specifies the package
- * of the TestALF classes. If it's omitted, the classes are in
- * the default package.
- * For example:
- *
- *
- * ../../../../build/solaris-sparc/bin/java TestALFGenerator ../../../../src/share/classes/javax/swing/plaf com.myco.myalaf
- *
- *
- * TestALFGenerator will scour the plaf directory for *UI.java files and
- * generate TestALF*UI.java files.
- *
- * NOTE: This tool depends upon the existence of and on the
- * compiled classes from being somewhere in the class path.
- *
- * @author Willie Walker
- */
-public class TestALFGenerator {
- static String importLines;
- static String packageName;
- static String classPrefix = "TestALF";
-
- /**
- * A silly list of parameter names to use. Skips "i" because we use
- * it as a 'for' loop counter. If you want to get fancy, please feel
- * to change how parameter names are obtained. This will break if
- * someone decides to create a UI method that takes more than 8
- * parameters. Which one is a bug (this breaking or having a method
- * with more than eight parameters) is a subjective thing.
- */
- public static String[] paramNames = {"a","b","c","d","e","f","g","h"};
-
- /**
- * Removes the package names (e.g., javax.swing) from the name.
- */
- public static String unqualifyName(String name) {
- StringTokenizer parser = new StringTokenizer(name,".");
- String unqualifiedName = null;
- while (parser.hasMoreTokens()) {
- unqualifiedName = parser.nextToken();
- }
- return removeDollars(unqualifiedName);
- }
-
- /**
- * Strips the extension from the filename.
- */
- public static String stripExtension(String name) {
- StringTokenizer parser = new StringTokenizer(name,".");
- return parser.nextToken();
- }
-
- /**
- * Adds some spaces.
- */
- public static void indent(StringBuffer s, int i) {
- while (i > 0) {
- s.append(" ");
- i--;
- }
- }
-
- /**
- * Spits out all the beginning stuff.
- */
- public static StringBuffer createPreamble(String prefixName) {
- StringBuffer s = new StringBuffer();
- s.append("/*\n");
- s.append(" *\n");
- s.append(" * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.\n");
- s.append(" * \n");
- s.append(" * This software is the proprietary information of Sun Microsystems, Inc. \n");
- s.append(" * Use is subject to license terms.\n");
- s.append(" * \n");
- s.append(" */\n");
- if (packageName != null) {
- s.append("package " + packageName + ";\n");
- s.append("\n");
- }
- return s;
- }
-
- /**
- * Replaces 'Xxx$Yyy' with "Xxx'. Used by addImport because you
- * can't import nested classes directly.
- */
- public static String removeNestedClassName(String s) {
- int dollarPosition = s.indexOf('$');
-
- if (dollarPosition >= 0) { // s contains '$'
- StringBuffer sb = new StringBuffer(s);
- sb.setLength(dollarPosition);
- return sb.toString();
- } else { // no '$'
- return s;
- }
- }
-
- /**
- * Replaces '$' with ".'. Needed for printing inner class names
- * for argument and return types.
- */
- public static String removeDollars(String s) {
- int dollarPosition = s.indexOf('$');
-
- if (dollarPosition >= 0) { // s contains '$'
- StringBuffer sb = new StringBuffer(s);
- while (dollarPosition >= 0) {
- //XXX: will there ever be more than one '$'?
- sb.replace(dollarPosition, dollarPosition+1, ".");
- dollarPosition = sb.indexOf("$", dollarPosition);
- }
- return sb.toString();
- } else { // no $
- return s;
- }
- }
-
- /**
- * Adds an import line to the String.
- */
- public static void addImport(String s, Class theClass) {
- if (!theClass.isPrimitive() && (theClass != Object.class)) {
- String className = removeNestedClassName(theClass.getName());
- String importLine = new String("import " + className + ";\n");
- if (importLines.indexOf(importLine) == -1) {
- importLines += importLine;
- }
- }
- }
-
- /**
- * Spits out the class header information.
- */
- public static void addHeader(StringBuffer s, String className) {
- s.append("/**\n");
- s.append(" * An auxiliary UI for " + className + "
s.\n");
- s.append(" * \n");
- s.append(" * This file was automatically generated by TestALFGenerator.\n");
- s.append(" *\n");
- s.append(" * @author Otto Multey\n"); // Get it? I crack myself up.
- s.append(" */\n");
- s.append("public class " + classPrefix + className + " extends " + className + " {\n");
- s.append("\n");
- }
-
- /**
- * Prints out the code for a method.
- */
- public static void addMethod(StringBuffer s, Method m, String origName, String className) {
-
- // Get the method name and the return type. Be a little careful about arrays.
- //
- String methodName = unqualifyName(m.getName());
- String returnType;
-
- if (!m.getReturnType().isArray()) {
- returnType = unqualifyName(m.getReturnType().toString());
- addImport(importLines,m.getReturnType());
- } else {
- returnType = unqualifyName(m.getReturnType().getComponentType().toString())
- + "[]";
- addImport(importLines,m.getReturnType().getComponentType());
- }
-
- // Print the javadoc
- //
- s.append("\n");
-
- if (methodName.equals("createUI")) {
- s.append(" /**\n");
- s.append(" * Returns a UI object for this component.\n");
- s.append(" */\n");
- } else {
- s.append(" /**\n");
- s.append(" * Prints a message saying this method has been invoked.\n");
- s.append(" */\n");
- }
-
- // Print the method signature
- //
- s.append(" public");
- if (Modifier.isStatic(m.getModifiers())) {
- s.append(" static");
- }
- s.append(" " + returnType);
- s.append(" " + methodName);
- s.append("(");
-
- Class[] params = m.getParameterTypes();
- Class temp;
- String braces;
- for (int i = 0; i < params.length; i++) {
- if (i > 0) {
- s.append(", ");
- }
- temp = params[i];
- braces = new String("");
- while (temp.isArray()) {
- braces += "[]";
- temp = temp.getComponentType();
- }
- s.append(unqualifyName(temp.getName()) + braces + " " + paramNames[i]);
- addImport(importLines,temp);
- }
- s.append(")");
-
- // Don't forget about exceptions
- //
- Class exceptions[] = m.getExceptionTypes();
- String throwsString = new String("");
-
- if (exceptions.length > 0) {
- s.append("\n");
- indent(s,12);
- s.append("throws ");
- for (int i = 0; i < exceptions.length; i++) {
- if (i > 0) {
- s.append(", ");
- }
- s.append(unqualifyName(exceptions[i].getName()));
- addImport(importLines,exceptions[i]);
- }
- }
- s.append(throwsString + " {\n");
-
- // Now print out the contents of the method.
- indent(s,8);
- s.append("System.out.println(\"In the " + methodName
- + " method of the "
- + classPrefix + origName + " class.\");\n");
- if (methodName.equals("createUI")) {
- indent(s,8);
- s.append("return ui;\n");
- } else {
- // If we have to return something, do so.
- if (!returnType.equals("void")) {
- Class rType = m.getReturnType();
- indent(s,8);
- if (!rType.isPrimitive()) {
- s.append("return null;\n");
- } else if (rType == Boolean.TYPE) {
- s.append("return false;\n");
- } else if (rType == Character.TYPE) {
- s.append("return '0';\n");
- } else { // byte, short, int, long, float, or double
- s.append("return 0;\n");
- }
- }
- }
-
- indent(s,4);
- s.append("}\n");
- }
-
- /**
- * Takes a plaf class name (e.g., "MenuUI") and generates the corresponding
- * TestALF UI Java source code (e.g., "TestALFMenuUI.java").
- */
- public static void generateFile(String prefixName, String className) {
- try {
- FileOutputStream fos;
- PrintWriter outFile;
-
- importLines = new String();
- importLines += new String("import java.util.Vector;\n");
-
- StringBuffer body = new StringBuffer();
- Class wee = Class.forName(prefixName + ".swing.plaf." + className);
- String weeName = unqualifyName(wee.getName());
- String thisClassName = classPrefix + className;
- addImport(importLines,wee);
-
- // Declare and initialize the shared UI object.
- body.append("\n");
- body.append("////////////////////\n");
- body.append("// Shared UI object\n");
- body.append("////////////////////\n");
- body.append("private final static " + thisClassName
- + " ui = new " + thisClassName + "();\n");
-
- while (!weeName.equals("Object")) {
- body.append("\n");
- body.append("////////////////////\n");
- body.append("// " + weeName + " methods\n");
- body.append("////////////////////\n");
- Method[] methods = wee.getDeclaredMethods();
- for (int i=0; i < methods.length; i++) {
- if (Modifier.isPublic(methods[i].getModifiers())) {
- addMethod(body,methods[i],className,weeName);
- }
- }
- wee = wee.getSuperclass();
- weeName = unqualifyName(wee.getName());
- addImport(importLines,wee);
- }
-
- fos = new FileOutputStream(classPrefix + className + ".java");
- outFile = new PrintWriter(fos);
- StringBuffer outText = createPreamble(prefixName);
- outText.append(importLines.toString() + "\n");
- addHeader(outText,className);
- outText.append(body.toString());
- outText.append("}\n");
- outFile.write(outText.toString());
- outFile.flush();
- outFile.close();
- } catch (Exception e) {
- System.err.println(e);
- }
- }
-
- /**
- * D'Oh! Something bad happened.
- */
- public static void usage(String s) throws IOException {
- System.err.println("Usage: java TestALFGenerator []");
- throw new IllegalArgumentException(s);
- }
-
- /**
- * Takes the plaf directory name and generates the TestALF UI
- * source code.
- */
- public static void main(String[] args) throws IOException {
-
- if (args.length < 1) {
- usage("");
- }
-
- String dirName = args[0];
- File dir = new File(dirName);
- if (!dir.isDirectory()) {
- System.err.println("No such directory: " + dirName);
- usage("");
- }
-
- if (args.length > 1) {
- packageName = args[1];
- }
-
- String plafUIs[] = dir.list(new UIJavaFilter());
- for (int i = 0; i < plafUIs.length; i++) {
- generateFile("javax",stripExtension(plafUIs[i]));
- }
- }
-}
-
-/**
- * Only accepts file names of the form *UI.java. The one exception
- * is not accepting ComponentUI.java because we don't need to generate
- * a TestALF class for it.
- */
-class UIJavaFilter implements FilenameFilter {
- public boolean accept(File dir, String name) {
- if (name.equals("ComponentUI.java")) {
- return false;
- } else if (name.endsWith("UI.java")) {
- return true;
- } else {
- return false;
- }
- }
-}
diff --git a/jdk/make/tools/src/build/tools/automulti/TestALFLookAndFeel.java b/jdk/make/tools/src/build/tools/automulti/TestALFLookAndFeel.java
deleted file mode 100644
index aadab48cac1..00000000000
--- a/jdk/make/tools/src/build/tools/automulti/TestALFLookAndFeel.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- */
-//package com.myco.myalaf; //search for myalaf for other refs to package name
-
-
-package build.tools.automulti;
-
-import java.util.Vector;
-import java.lang.reflect.Method;
-import javax.swing.*;
-import javax.swing.plaf.*;
-
-/**
- * An auxiliary look and feel used for testing the Multiplexing
- * look and feel.
- *
- *
- * @see UIManager#addAuxiliaryLookAndFeel
- * @see javax.swing.plaf.multi
- *
- * @author Kathy Walrath
- * @author Will Walker
- */
-public class TestALFLookAndFeel extends LookAndFeel {
-
-//////////////////////////////
-// LookAndFeel methods
-//////////////////////////////
-
- /**
- * Returns a string, suitable for use in menus,
- * that identifies this look and feel.
- *
- * @return a string such as "Test Auxiliary Look and Feel"
- */
- public String getName() {
- return "Test Auxiliary Look and Feel";
- }
-
- /**
- * Returns a string, suitable for use by applications/services,
- * that identifies this look and feel.
- *
- * @return "TestALF"
- */
- public String getID() {
- return "TestALF";
- }
-
- /**
- * Returns a one-line description of this look and feel.
- *
- * @return a descriptive string such as "Allows multiple UI instances per component instance"
- */
- public String getDescription() {
- return "Allows multiple UI instances per component instance";
- }
-
- /**
- * Returns false
;
- * this look and feel is not native to any platform.
- *
- * @return false
- */
- public boolean isNativeLookAndFeel() {
- return false;
- }
-
- /**
- * Returns true
;
- * every platform permits this look and feel.
- *
- * @return true
- */
- public boolean isSupportedLookAndFeel() {
- return true;
- }
-
- /**
- * Creates, initializes, and returns
- * the look and feel specific defaults.
- * For this look and feel,
- * the defaults consist solely of
- * mappings of UI class IDs
- * (such as "ButtonUI")
- * to ComponentUI
class names
- * (such as "com.myco.myalaf.MultiButtonUI").
- *
- * @return an initialized UIDefaults
object
- * @see javax.swing.JComponent#getUIClassID
- */
- public UIDefaults getDefaults() {
- System.out.println("In the TestALFLookAndFeel getDefaults method.");
- UIDefaults table = new TestALFUIDefaults();
- //String prefix = "com.myco.myalaf.TestALF";
- String prefix = "TestALF";
- Object[] uiDefaults = {
- "ButtonUI", prefix + "ButtonUI",
- "CheckBoxMenuItemUI", prefix + "MenuItemUI",
- "CheckBoxUI", prefix + "ButtonUI",
- "ColorChooserUI", prefix + "ColorChooserUI",
- "ComboBoxUI", prefix + "ComboBoxUI",
- "DesktopIconUI", prefix + "DesktopIconUI",
- "DesktopPaneUI", prefix + "DesktopPaneUI",
- "EditorPaneUI", prefix + "TextUI",
- "FileChooserUI", prefix + "FileChooserUI",
- "FormattedTextFieldUI", prefix + "TextUI",
- "InternalFrameUI", prefix + "InternalFrameUI",
- "LabelUI", prefix + "LabelUI",
- "ListUI", prefix + "ListUI",
- "MenuBarUI", prefix + "MenuBarUI",
- "MenuItemUI", prefix + "MenuItemUI",
- "MenuUI", prefix + "MenuItemUI",
- "OptionPaneUI", prefix + "OptionPaneUI",
- "PanelUI", prefix + "PanelUI",
- "PasswordFieldUI", prefix + "TextUI",
- "PopupMenuSeparatorUI", prefix + "SeparatorUI",
- "PopupMenuUI", prefix + "PopupMenuUI",
- "ProgressBarUI", prefix + "ProgressBarUI",
- "RadioButtonMenuItemUI", prefix + "MenuItemUI",
- "RadioButtonUI", prefix + "ButtonUI",
- "RootPaneUI", prefix + "RootPaneUI",
- "ScrollBarUI", prefix + "ScrollBarUI",
- "ScrollPaneUI", prefix + "ScrollPaneUI",
- "SeparatorUI", prefix + "SeparatorUI",
- "SliderUI", prefix + "SliderUI",
- "SpinnerUI", prefix + "SpinnerUI",
- "SplitPaneUI", prefix + "SplitPaneUI",
- "TabbedPaneUI", prefix + "TabbedPaneUI",
- "TableHeaderUI", prefix + "TableHeaderUI",
- "TableUI", prefix + "TableUI",
- "TextAreaUI", prefix + "TextUI",
- "TextFieldUI", prefix + "TextUI",
- "TextPaneUI", prefix + "TextUI",
- "ToggleButtonUI", prefix + "ButtonUI",
- "ToolBarSeparatorUI", prefix + "SeparatorUI",
- "ToolBarUI", prefix + "ToolBarUI",
- "ToolTipUI", prefix + "ToolTipUI",
- "TreeUI", prefix + "TreeUI",
- "ViewportUI", prefix + "ViewportUI",
- };
-
- table.putDefaults(uiDefaults);
- return table;
- }
-
-}
-
-/**
- * We want the Test auxiliary look and feel to be quiet and fallback
- * gracefully if it cannot find a UI. This class overrides the
- * getUIError method of UIDefaults, which is the method that
- * emits error messages when it cannot find a UI class in the
- * LAF.
- */
-class TestALFUIDefaults extends UIDefaults {
- protected void getUIError(String msg) {
- System.err.println("Test auxiliary L&F: " + msg);
- }
-}
diff --git a/jdk/src/share/bin/emessages.h b/jdk/src/share/bin/emessages.h
index 008cc1f906a..311a8fa61ce 100644
--- a/jdk/src/share/bin/emessages.h
+++ b/jdk/src/share/bin/emessages.h
@@ -50,11 +50,6 @@
#define JAR_ERROR2 "Error: Unable to access jarfile %s"
#define JAR_ERROR3 "Error: Invalid or corrupt jarfile %s"
-#define CLS_ERROR1 "Error: Could not find the main class %s.\n" JNI_ERROR
-#define CLS_ERROR2 "Error: Failed to load Main Class: %s\n%s"
-#define CLS_ERROR3 "Error: No main method found in specified class.\n" GEN_ERROR
-#define CLS_ERROR4 "Error: Main method not public\n" GEN_ERROR
-
#define CFG_WARN1 "Warning: %s VM not supported; %s VM will be used"
#define CFG_WARN2 "Warning: No leading - on line %d of `%s'"
#define CFG_WARN3 "Warning: Missing VM type on line %d of `%s'"
diff --git a/jdk/src/share/bin/java.c b/jdk/src/share/bin/java.c
index 89ae857b136..0feafc1ed41 100644
--- a/jdk/src/share/bin/java.c
+++ b/jdk/src/share/bin/java.c
@@ -102,8 +102,7 @@ static jboolean InitializeJVM(JavaVM **pvm, JNIEnv **penv,
InvocationFunctions *ifn);
static jstring NewPlatformString(JNIEnv *env, char *s);
static jobjectArray NewPlatformStringArray(JNIEnv *env, char **strv, int strc);
-static jclass LoadClass(JNIEnv *env, char *name);
-static jstring GetMainClassName(JNIEnv *env, char *jarname);
+static jclass LoadMainClass(JNIEnv *env, jboolean isJar, char *name);
static void TranslateApplicationArgs(int jargc, const char **jargv, int *pargc, char ***pargv);
static jboolean AddApplicationOptions(int cpathc, const char **cpathv);
@@ -301,6 +300,22 @@ JLI_Launch(int argc, char ** argv, /* main argc, argc */
}
+#define CHECK_EXCEPTION_NULL_LEAVE(e) \
+ if ((*env)->ExceptionOccurred(env)) { \
+ JLI_ReportExceptionDescription(env); \
+ goto leave; \
+ } \
+ if ((e) == NULL) { \
+ JLI_ReportErrorMessage(JNI_ERROR); \
+ goto leave; \
+ }
+
+#define CHECK_EXCEPTION_LEAVE(rv) \
+ if ((*env)->ExceptionOccurred(env)) { \
+ JLI_ReportExceptionDescription(env); \
+ ret = (rv); \
+ goto leave; \
+ }
int JNICALL
JavaMain(void * _args)
@@ -321,9 +336,7 @@ JavaMain(void * _args)
int ret = 0;
jlong start, end;
-
/* Initialize the virtual machine */
-
start = CounterGet();
if (!InitializeJVM(&vm, &env, &ifn)) {
JLI_ReportErrorMessage(JVM_ERROR1);
@@ -332,11 +345,7 @@ JavaMain(void * _args)
if (printVersion || showVersion) {
PrintJavaVersion(env, showVersion);
- if ((*env)->ExceptionOccurred(env)) {
- JLI_ReportExceptionDescription(env);
- JLI_ReportErrorMessage(JNI_ERROR);
- goto leave;
- }
+ CHECK_EXCEPTION_LEAVE(0);
if (printVersion) {
ret = 0;
goto leave;
@@ -346,11 +355,7 @@ JavaMain(void * _args)
/* If the user specified neither a class name nor a JAR file */
if (printXUsage || printUsage || (jarfile == 0 && classname == 0)) {
PrintUsage(env, printXUsage);
- if ((*env)->ExceptionOccurred(env)) {
- JLI_ReportExceptionDescription(env);
- JLI_ReportErrorMessage(JNI_ERROR);
- ret=1;
- }
+ CHECK_EXCEPTION_LEAVE(1);
goto leave;
}
@@ -395,99 +400,25 @@ JavaMain(void * _args)
* the environment (and remove these comments).
*/
if (jarfile != 0) {
- mainClassName = GetMainClassName(env, jarfile);
- if ((*env)->ExceptionOccurred(env)) {
- JLI_ReportExceptionDescription(env);
- JLI_ReportErrorMessage(JNI_ERROR);
- goto leave;
- }
- if (mainClassName == NULL) {
- JLI_ReportErrorMessage(JAR_ERROR1,jarfile, GEN_ERROR);
- goto leave;
- }
- classname = (char *)(*env)->GetStringUTFChars(env, mainClassName, 0);
- if (classname == NULL) {
- JLI_ReportExceptionDescription(env);
- JLI_ReportErrorMessage(JNI_ERROR);
- goto leave;
- }
- mainClass = LoadClass(env, classname);
- if(mainClass == NULL) { /* exception occured */
- JLI_ReportExceptionDescription(env);
- JLI_ReportErrorMessage(CLS_ERROR1, classname);
- goto leave;
- }
- (*env)->ReleaseStringUTFChars(env, mainClassName, classname);
+ mainClass = LoadMainClass(env, JNI_TRUE, jarfile);
} else {
- mainClassName = NewPlatformString(env, classname);
- if (mainClassName == NULL) {
- JLI_ReportErrorMessage(CLS_ERROR2, classname, GEN_ERROR);
- goto leave;
- }
- classname = (char *)(*env)->GetStringUTFChars(env, mainClassName, 0);
- if (classname == NULL) {
- JLI_ReportExceptionDescription(env);
- JLI_ReportErrorMessage(JNI_ERROR);
- goto leave;
- }
- mainClass = LoadClass(env, classname);
- if(mainClass == NULL) { /* exception occured */
- JLI_ReportExceptionDescription(env);
- JLI_ReportErrorMessage(CLS_ERROR1, classname);
- goto leave;
- }
- (*env)->ReleaseStringUTFChars(env, mainClassName, classname);
+ mainClass = LoadMainClass(env, JNI_FALSE, classname);
}
+ CHECK_EXCEPTION_NULL_LEAVE(mainClass);
- /* Get the application's main method */
+ /*
+ * The LoadMainClass not only loads the main class, it will also ensure
+ * that the main method's signature is correct, therefore further checking
+ * is not required. The main method is invoked here so that extraneous java
+ * stacks are not in the application stack trace.
+ */
mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
"([Ljava/lang/String;)V");
- if (mainID == NULL) {
- if ((*env)->ExceptionOccurred(env)) {
- JLI_ReportExceptionDescription(env);
- JLI_ReportErrorMessage(JNI_ERROR);
- } else {
- JLI_ReportErrorMessage(CLS_ERROR3);
- }
- goto leave;
- }
-
- { /* Make sure the main method is public */
- jint mods;
- jmethodID mid;
- jobject obj = (*env)->ToReflectedMethod(env, mainClass,
- mainID, JNI_TRUE);
-
- if( obj == NULL) { /* exception occurred */
- JLI_ReportExceptionDescription(env);
- JLI_ReportErrorMessage(JNI_ERROR);
- goto leave;
- }
-
- mid =
- (*env)->GetMethodID(env,
- (*env)->GetObjectClass(env, obj),
- "getModifiers", "()I");
- if ((*env)->ExceptionOccurred(env)) {
- JLI_ReportExceptionDescription(env);
- JLI_ReportErrorMessage(JNI_ERROR);
- goto leave;
- }
-
- mods = (*env)->CallIntMethod(env, obj, mid);
- if ((mods & 1) == 0) { /* if (!Modifier.isPublic(mods)) ... */
- JLI_ReportErrorMessage(CLS_ERROR4);
- goto leave;
- }
- }
+ CHECK_EXCEPTION_NULL_LEAVE(mainID);
/* Build argument array */
mainArgs = NewPlatformStringArray(env, argv, argc);
- if (mainArgs == NULL) {
- JLI_ReportExceptionDescription(env);
- JLI_ReportErrorMessage(JNI_ERROR);
- goto leave;
- }
+ CHECK_EXCEPTION_NULL_LEAVE(mainArgs);
/* Invoke main method. */
(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);
@@ -498,8 +429,9 @@ JavaMain(void * _args)
*/
ret = (*env)->ExceptionOccurred(env) == NULL ? 0 : 1;
+leave:
/*
- * Detach the main thread so that it appears to have ended when
+ * Always detach the main thread so that it appears to have ended when
* the application's main method exits. This will invoke the
* uncaught exception handler machinery if main threw an
* exception. An uncaught exception handler cannot change the
@@ -508,10 +440,7 @@ JavaMain(void * _args)
if ((*vm)->DetachCurrentThread(vm) != 0) {
JLI_ReportErrorMessage(JVM_ERROR2);
ret = 1;
- goto leave;
}
-
- leave:
/*
* Wait for all non-daemon threads to end, then destroy the VM.
* This will actually create a trivial new Java waiter thread
@@ -525,7 +454,6 @@ JavaMain(void * _args)
return ret;
}
-
/*
* Checks the command line options to find which JVM type was
* specified. If no command line option was given for the JVM type,
@@ -1159,7 +1087,7 @@ static jstring getPlatformEncoding(JNIEnv *env) {
if (propname) {
jclass cls;
jmethodID mid;
- NULL_CHECK0 (cls = (*env)->FindClass(env, "java/lang/System"));
+ NULL_CHECK0 (cls = FindBootStrapClass(env, "java/lang/System"));
NULL_CHECK0 (mid = (*env)->GetStaticMethodID(
env, cls,
"getProperty",
@@ -1174,7 +1102,7 @@ static jstring getPlatformEncoding(JNIEnv *env) {
static jboolean isEncodingSupported(JNIEnv *env, jstring enc) {
jclass cls;
jmethodID mid;
- NULL_CHECK0 (cls = (*env)->FindClass(env, "java/nio/charset/Charset"));
+ NULL_CHECK0 (cls = FindBootStrapClass(env, "java/nio/charset/Charset"));
NULL_CHECK0 (mid = (*env)->GetStaticMethodID(
env, cls,
"isSupported",
@@ -1203,8 +1131,8 @@ NewPlatformString(JNIEnv *env, char *s)
jstring str = 0;
(*env)->SetByteArrayRegion(env, ary, 0, len, (jbyte *)s);
if (!(*env)->ExceptionOccurred(env)) {
+ NULL_CHECK0(cls = FindBootStrapClass(env, "java/lang/String"));
if (isEncodingSupported(env, enc) == JNI_TRUE) {
- NULL_CHECK0(cls = (*env)->FindClass(env, "java/lang/String"));
NULL_CHECK0(mid = (*env)->GetMethodID(env, cls, "",
"([BLjava/lang/String;)V"));
str = (*env)->NewObject(env, cls, mid, ary, enc);
@@ -1215,7 +1143,6 @@ NewPlatformString(JNIEnv *env, char *s)
the encoding name, in which the StringCoding class will
pickup the iso-8859-1 as the fallback converter for us.
*/
- NULL_CHECK0(cls = (*env)->FindClass(env, "java/lang/String"));
NULL_CHECK0(mid = (*env)->GetMethodID(env, cls, "",
"([B)V"));
str = (*env)->NewObject(env, cls, mid, ary);
@@ -1238,7 +1165,7 @@ NewPlatformStringArray(JNIEnv *env, char **strv, int strc)
jarray ary;
int i;
- NULL_CHECK0(cls = (*env)->FindClass(env, "java/lang/String"));
+ NULL_CHECK0(cls = FindBootStrapClass(env, "java/lang/String"));
NULL_CHECK0(ary = (*env)->NewObjectArray(env, strc, cls, 0));
for (i = 0; i < strc; i++) {
jstring str = NewPlatformString(env, *strv++);
@@ -1250,25 +1177,26 @@ NewPlatformStringArray(JNIEnv *env, char **strv, int strc)
}
/*
- * Loads a class, convert the '.' to '/'.
+ * Loads a class and verifies that the main class is present and it is ok to
+ * call it for more details refer to the java implementation.
*/
static jclass
-LoadClass(JNIEnv *env, char *name)
+LoadMainClass(JNIEnv *env, jboolean isJar, char *name)
{
- char *buf = JLI_MemAlloc(JLI_StrLen(name) + 1);
- char *s = buf, *t = name, c;
jclass cls;
+ jmethodID mid;
+ jstring str;
+ jobject result;
jlong start, end;
- if (JLI_IsTraceLauncher())
+ if (JLI_IsTraceLauncher()) {
start = CounterGet();
-
- do {
- c = *t++;
- *s++ = (c == '.') ? '/' : c;
- } while (c != '\0');
- cls = (*env)->FindClass(env, buf);
- JLI_MemFree(buf);
+ }
+ NULL_CHECK0(cls = FindBootStrapClass(env, "sun/launcher/LauncherHelper"));
+ NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls, "checkAndLoadMain",
+ "(ZZLjava/lang/String;)Ljava/lang/Object;"));
+ str = (*env)->NewStringUTF(env, name);
+ result = (*env)->CallStaticObjectMethod(env, cls, mid, JNI_TRUE, isJar, str);
if (JLI_IsTraceLauncher()) {
end = CounterGet();
@@ -1277,49 +1205,9 @@ LoadClass(JNIEnv *env, char *name)
printf("----_JAVA_LAUNCHER_DEBUG----\n");
}
- return cls;
+ return (jclass)result;
}
-
-/*
- * Returns the main class name for the specified jar file.
- */
-static jstring
-GetMainClassName(JNIEnv *env, char *jarname)
-{
-#define MAIN_CLASS "Main-Class"
- jclass cls;
- jmethodID mid;
- jobject jar, man, attr;
- jstring str, result = 0;
-
- NULL_CHECK0(cls = (*env)->FindClass(env, "java/util/jar/JarFile"));
- NULL_CHECK0(mid = (*env)->GetMethodID(env, cls, "",
- "(Ljava/lang/String;)V"));
- NULL_CHECK0(str = NewPlatformString(env, jarname));
- NULL_CHECK0(jar = (*env)->NewObject(env, cls, mid, str));
- NULL_CHECK0(mid = (*env)->GetMethodID(env, cls, "getManifest",
- "()Ljava/util/jar/Manifest;"));
- man = (*env)->CallObjectMethod(env, jar, mid);
- if (man != 0) {
- NULL_CHECK0(mid = (*env)->GetMethodID(env,
- (*env)->GetObjectClass(env, man),
- "getMainAttributes",
- "()Ljava/util/jar/Attributes;"));
- attr = (*env)->CallObjectMethod(env, man, mid);
- if (attr != 0) {
- NULL_CHECK0(mid = (*env)->GetMethodID(env,
- (*env)->GetObjectClass(env, attr),
- "getValue",
- "(Ljava/lang/String;)Ljava/lang/String;"));
- NULL_CHECK0(str = NewPlatformString(env, MAIN_CLASS));
- result = (*env)->CallObjectMethod(env, attr, mid, str);
- }
- }
- return result;
-}
-
-
/*
* For tools, convert command line args thus:
* javac -cp foo:foo/"*" -J-ms32m ...
@@ -1522,7 +1410,7 @@ PrintJavaVersion(JNIEnv *env, jboolean extraLF)
jclass ver;
jmethodID print;
- NULL_CHECK(ver = (*env)->FindClass(env, "sun/misc/Version"));
+ NULL_CHECK(ver = FindBootStrapClass(env, "sun/misc/Version"));
NULL_CHECK(print = (*env)->GetStaticMethodID(env,
ver,
(extraLF == JNI_TRUE) ? "println" : "print",
@@ -1534,7 +1422,7 @@ PrintJavaVersion(JNIEnv *env, jboolean extraLF)
}
/*
- * Prints default usage or the Xusage message, see sun.launcher.LauncherHelp.java
+ * Prints default usage or the Xusage message, see sun.launcher.LauncherHelper.java
*/
static void
PrintUsage(JNIEnv* env, jboolean doXUsage)
@@ -1544,7 +1432,7 @@ PrintUsage(JNIEnv* env, jboolean doXUsage)
jstring jprogname, vm1, vm2;
int i;
- NULL_CHECK(cls = (*env)->FindClass(env, "sun/launcher/LauncherHelp"));
+ NULL_CHECK(cls = FindBootStrapClass(env, "sun/launcher/LauncherHelper"));
if (doXUsage) {
diff --git a/jdk/src/share/bin/java.h b/jdk/src/share/bin/java.h
index 23871b5d2a1..fe039cdcc88 100644
--- a/jdk/src/share/bin/java.h
+++ b/jdk/src/share/bin/java.h
@@ -180,4 +180,16 @@ static int ContinueInNewThread(InvocationFunctions* ifn, int argc, char** argv,
*/
void InitLauncher(jboolean javaw);
+/*
+ * This allows for finding classes from the VM's bootstrap class loader directly,
+ * FindClass uses the application class loader internally, this will cause
+ * unnecessary searching of the classpath for the required classes.
+ *
+ */
+typedef jclass (JNICALL FindClassFromBootLoader_t(JNIEnv *env,
+ const char *name,
+ jboolean init,
+ jobject loader,
+ jboolean throwError));
+jclass FindBootStrapClass(JNIEnv *env, const char *classname);
#endif /* _JAVA_H_ */
diff --git a/jdk/src/share/classes/com/sun/beans/WeakCache.java b/jdk/src/share/classes/com/sun/beans/WeakCache.java
new file mode 100644
index 00000000000..461c48e1fd3
--- /dev/null
+++ b/jdk/src/share/classes/com/sun/beans/WeakCache.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+package com.sun.beans;
+
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
+
+import java.util.Map;
+import java.util.WeakHashMap;
+
+/**
+ * A hashtable-based cache with weak keys and weak values.
+ * An entry in the map will be automatically removed
+ * when its key is no longer in the ordinary use.
+ * A value will be automatically removed as well
+ * when it is no longer in the ordinary use.
+ *
+ * @since 1.7
+ *
+ * @author Sergey A. Malenkov
+ */
+public final class WeakCache {
+ private final Map> map = new WeakHashMap>();
+
+ /**
+ * Returns a value to which the specified {@code key} is mapped,
+ * or {@code null} if this map contains no mapping for the {@code key}.
+ *
+ * @param key the key whose associated value is returned
+ * @return a value to which the specified {@code key} is mapped
+ */
+ public V get(K key) {
+ Reference reference = this.map.get(key);
+ if (reference == null) {
+ return null;
+ }
+ V value = reference.get();
+ if (value == null) {
+ this.map.remove(key);
+ }
+ return value;
+ }
+
+ /**
+ * Associates the specified {@code value} with the specified {@code key}.
+ * Removes the mapping for the specified {@code key} from this cache
+ * if it is present and the specified {@code value} is {@code null}.
+ * If the cache previously contained a mapping for the {@code key},
+ * the old value is replaced by the specified {@code value}.
+ *
+ * @param key the key with which the specified value is associated
+ * @param value the value to be associated with the specified key
+ */
+ public void put(K key, V value) {
+ if (value != null) {
+ this.map.put(key, new WeakReference(value));
+ }
+ else {
+ this.map.remove(key);
+ }
+ }
+}
diff --git a/jdk/src/share/classes/com/sun/java/swing/SwingUtilities3.java b/jdk/src/share/classes/com/sun/java/swing/SwingUtilities3.java
new file mode 100644
index 00000000000..28d9e8af6ec
--- /dev/null
+++ b/jdk/src/share/classes/com/sun/java/swing/SwingUtilities3.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright 2002-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+package com.sun.java.swing;
+
+import sun.awt.EventQueueDelegate;
+import sun.awt.AppContext;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.awt.AWTEvent;
+import java.awt.EventQueue;
+import java.awt.Component;
+import javax.swing.JComponent;
+import javax.swing.RepaintManager;
+
+/**
+ * A collection of utility methods for Swing.
+ *
+ * WARNING: While this class is public, it should not be treated as
+ * public API and its API may change in incompatable ways between dot dot
+ * releases and even patch releases. You should not rely on this class even
+ * existing.
+ *
+ * This is a second part of sun.swing.SwingUtilities2. It is required
+ * to provide services for JavaFX applets.
+ *
+ */
+public class SwingUtilities3 {
+ /**
+ * The {@code clientProperty} key for delegate {@code RepaintManager}
+ */
+ private static final Object DELEGATE_REPAINT_MANAGER_KEY =
+ new StringBuilder("DelegateRepaintManagerKey");
+
+ /**
+ * Registers delegate RepaintManager for {@code JComponent}.
+ */
+ public static void setDelegateRepaintManager(JComponent component,
+ RepaintManager repaintManager) {
+ /* setting up flag in AppContext to speed up lookups in case
+ * there are no delegate RepaintManagers used.
+ */
+ AppContext.getAppContext().put(DELEGATE_REPAINT_MANAGER_KEY,
+ Boolean.TRUE);
+
+ component.putClientProperty(DELEGATE_REPAINT_MANAGER_KEY,
+ repaintManager);
+ }
+
+ /**
+ * Returns delegate {@code RepaintManager} for {@code component} hierarchy.
+ */
+ public static RepaintManager getDelegateRepaintManager(Component
+ component) {
+ RepaintManager delegate = null;
+ if (Boolean.TRUE == AppContext.getAppContext().get(
+ DELEGATE_REPAINT_MANAGER_KEY)) {
+ while (delegate == null && component != null) {
+ while (component != null
+ && ! (component instanceof JComponent)) {
+ component = component.getParent();
+ }
+ if (component != null) {
+ delegate = (RepaintManager)
+ ((JComponent) component)
+ .getClientProperty(DELEGATE_REPAINT_MANAGER_KEY);
+ component = component.getParent();
+ }
+
+ }
+ }
+ return delegate;
+ }
+
+ /*
+ * We use maps to avoid reflection. Hopefully it should perform better
+ * this way.
+ */
+ public static void setEventQueueDelegate(
+ Map> map) {
+ EventQueueDelegate.setDelegate(new EventQueueDelegateFromMap(map));
+ }
+
+ private static class EventQueueDelegateFromMap
+ implements EventQueueDelegate.Delegate {
+ private final AWTEvent[] afterDispatchEventArgument;
+ private final Object[] afterDispatchHandleArgument;
+ private final Callable afterDispatchCallable;
+
+ private final AWTEvent[] beforeDispatchEventArgument;
+ private final Callable beforeDispatchCallable;
+
+ private final EventQueue[] getNextEventEventQueueArgument;
+ private final Callable getNextEventCallable;
+
+ @SuppressWarnings("unchecked")
+ public EventQueueDelegateFromMap(Map> objectMap) {
+ Map methodMap = objectMap.get("afterDispatch");
+ afterDispatchEventArgument = (AWTEvent[]) methodMap.get("event");
+ afterDispatchHandleArgument = (Object[]) methodMap.get("handle");
+ afterDispatchCallable = (Callable) methodMap.get("method");
+
+ methodMap = objectMap.get("beforeDispatch");
+ beforeDispatchEventArgument = (AWTEvent[]) methodMap.get("event");
+ beforeDispatchCallable = (Callable) methodMap.get("method");
+
+ methodMap = objectMap.get("getNextEvent");
+ getNextEventEventQueueArgument =
+ (EventQueue[]) methodMap.get("eventQueue");
+ getNextEventCallable = (Callable) methodMap.get("method");
+ }
+
+ @Override
+ public void afterDispatch(AWTEvent event, Object handle) throws InterruptedException {
+ afterDispatchEventArgument[0] = event;
+ afterDispatchHandleArgument[0] = handle;
+ try {
+ afterDispatchCallable.call();
+ } catch (InterruptedException e) {
+ throw e;
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public Object beforeDispatch(AWTEvent event) throws InterruptedException {
+ beforeDispatchEventArgument[0] = event;
+ try {
+ return beforeDispatchCallable.call();
+ } catch (InterruptedException e) {
+ throw e;
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public AWTEvent getNextEvent(EventQueue eventQueue) throws InterruptedException {
+ getNextEventEventQueueArgument[0] = eventQueue;
+ try {
+ return getNextEventCallable.call();
+ } catch (InterruptedException e) {
+ throw e;
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+}
diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java
index 9ae2d940443..c70d889f453 100644
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKColorChooserPanel.java
@@ -442,7 +442,10 @@ class GTKColorChooserPanel extends AbstractColorChooserPanel implements
}
if (updateModel) {
- getColorSelectionModel().setSelectedColor(color);
+ ColorSelectionModel model = getColorSelectionModel();
+ if (model != null) {
+ model.setSelectedColor(color);
+ }
}
triangle.setColor(hue, saturation, brightness);
diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java
index 14d974b0314..a3eada90d84 100644
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java
@@ -770,33 +770,56 @@ class Metacity implements SynthConstants {
JComponent maximizeButton = findChild(titlePane, "InternalFrameTitlePane.maximizeButton");
JComponent closeButton = findChild(titlePane, "InternalFrameTitlePane.closeButton");
- int buttonGap = 0;
-
Insets button_border = (Insets)gm.get("button_border");
Dimension buttonDim = calculateButtonSize(titlePane);
- int x = getInt("left_titlebar_edge");
int y = (button_border != null) ? button_border.top : 0;
+ if (titlePaneParent.getComponentOrientation().isLeftToRight()) {
+ int x = getInt("left_titlebar_edge");
- menuButton.setBounds(x, y, buttonDim.width, buttonDim.height);
+ menuButton.setBounds(x, y, buttonDim.width, buttonDim.height);
- x = w - buttonDim.width - getInt("right_titlebar_edge");
- if (button_border != null) {
- x -= button_border.right;
- }
+ x = w - buttonDim.width - getInt("right_titlebar_edge");
+ if (button_border != null) {
+ x -= button_border.right;
+ }
- if (frame.isClosable()) {
- closeButton.setBounds(x, y, buttonDim.width, buttonDim.height);
- x -= (buttonDim.width + buttonGap);
- }
+ if (frame.isClosable()) {
+ closeButton.setBounds(x, y, buttonDim.width, buttonDim.height);
+ x -= buttonDim.width;
+ }
- if (frame.isMaximizable()) {
- maximizeButton.setBounds(x, y, buttonDim.width, buttonDim.height);
- x -= (buttonDim.width + buttonGap);
- }
+ if (frame.isMaximizable()) {
+ maximizeButton.setBounds(x, y, buttonDim.width, buttonDim.height);
+ x -= buttonDim.width;
+ }
- if (frame.isIconifiable()) {
- minimizeButton.setBounds(x, y, buttonDim.width, buttonDim.height);
+ if (frame.isIconifiable()) {
+ minimizeButton.setBounds(x, y, buttonDim.width, buttonDim.height);
+ }
+ } else {
+ int x = w - buttonDim.width - getInt("right_titlebar_edge");
+
+ menuButton.setBounds(x, y, buttonDim.width, buttonDim.height);
+
+ x = getInt("left_titlebar_edge");
+ if (button_border != null) {
+ x += button_border.left;
+ }
+
+ if (frame.isClosable()) {
+ closeButton.setBounds(x, y, buttonDim.width, buttonDim.height);
+ x += buttonDim.width;
+ }
+
+ if (frame.isMaximizable()) {
+ maximizeButton.setBounds(x, y, buttonDim.width, buttonDim.height);
+ x += buttonDim.width;
+ }
+
+ if (frame.isIconifiable()) {
+ minimizeButton.setBounds(x, y, buttonDim.width, buttonDim.height);
+ }
}
}
} // end TitlePaneLayout
@@ -973,10 +996,8 @@ class Metacity implements SynthConstants {
String title = jif.getTitle();
if (title != null) {
FontMetrics fm = SwingUtilities2.getFontMetrics(jif, g);
- if (jif.getComponentOrientation().isLeftToRight()) {
- title = SwingUtilities2.clipStringIfNecessary(jif, fm, title,
- calculateTitleTextWidth(g, jif));
- }
+ title = SwingUtilities2.clipStringIfNecessary(jif, fm, title,
+ calculateTitleArea(jif).width);
g.setColor(color);
SwingUtilities2.drawString(jif, g, title, x, y + fm.getAscent());
}
@@ -1010,9 +1031,10 @@ class Metacity implements SynthConstants {
JComponent titlePane = findChild(jif, "InternalFrame.northPane");
Dimension buttonDim = calculateButtonSize(titlePane);
Insets title_border = (Insets)frameGeometry.get("title_border");
- Rectangle r = new Rectangle();
+ Insets button_border = (Insets)getFrameGeometry().get("button_border");
- r.x = getInt("left_titlebar_edge") + buttonDim.width;
+ Rectangle r = new Rectangle();
+ r.x = getInt("left_titlebar_edge");
r.y = 0;
r.height = titlePane.getHeight();
if (title_border != null) {
@@ -1021,15 +1043,36 @@ class Metacity implements SynthConstants {
r.height -= (title_border.top + title_border.bottom);
}
- r.width = titlePane.getWidth() - r.x - getInt("right_titlebar_edge");
- if (jif.isClosable()) {
- r.width -= buttonDim.width;
- }
- if (jif.isMaximizable()) {
- r.width -= buttonDim.width;
- }
- if (jif.isIconifiable()) {
- r.width -= buttonDim.width;
+ if (titlePane.getParent().getComponentOrientation().isLeftToRight()) {
+ r.x += buttonDim.width;
+ if (button_border != null) {
+ r.x += button_border.left;
+ }
+ r.width = titlePane.getWidth() - r.x - getInt("right_titlebar_edge");
+ if (jif.isClosable()) {
+ r.width -= buttonDim.width;
+ }
+ if (jif.isMaximizable()) {
+ r.width -= buttonDim.width;
+ }
+ if (jif.isIconifiable()) {
+ r.width -= buttonDim.width;
+ }
+ } else {
+ if (jif.isClosable()) {
+ r.x += buttonDim.width;
+ }
+ if (jif.isMaximizable()) {
+ r.x += buttonDim.width;
+ }
+ if (jif.isIconifiable()) {
+ r.x += buttonDim.width;
+ }
+ r.width = titlePane.getWidth() - r.x - getInt("right_titlebar_edge")
+ - buttonDim.width;
+ if (button_border != null) {
+ r.x -= button_border.right;
+ }
}
if (title_border != null) {
r.width -= title_border.right;
diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/DesktopProperty.java b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/DesktopProperty.java
index d7d5c0205d7..139b0db559b 100644
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/DesktopProperty.java
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/DesktopProperty.java
@@ -49,8 +49,7 @@ public class DesktopProperty implements UIDefaults.ActiveValue {
/**
* ReferenceQueue of unreferenced WeakPCLs.
*/
- private static ReferenceQueue queue;
-
+ private static ReferenceQueue queue;
/**
* PropertyChangeListener attached to the Toolkit.
@@ -76,7 +75,7 @@ public class DesktopProperty implements UIDefaults.ActiveValue {
static {
- queue = new ReferenceQueue();
+ queue = new ReferenceQueue();
}
/**
@@ -117,8 +116,8 @@ public class DesktopProperty implements UIDefaults.ActiveValue {
XPStyle.invalidateStyle();
}
Frame appFrames[] = Frame.getFrames();
- for (int j=0; j < appFrames.length; j++) {
- updateWindowUI(appFrames[j]);
+ for (Frame appFrame : appFrames) {
+ updateWindowUI(appFrame);
}
}
@@ -128,8 +127,8 @@ public class DesktopProperty implements UIDefaults.ActiveValue {
private static void updateWindowUI(Window window) {
SwingUtilities.updateComponentTreeUI(window);
Window ownedWins[] = window.getOwnedWindows();
- for (int i=0; i < ownedWins.length; i++) {
- updateWindowUI(ownedWins[i]);
+ for (Window ownedWin : ownedWins) {
+ updateWindowUI(ownedWin);
}
}
@@ -270,13 +269,13 @@ public class DesktopProperty implements UIDefaults.ActiveValue {
* is handled via a WeakReference so as not to pin down the
* DesktopProperty.
*/
- private static class WeakPCL extends WeakReference
+ private static class WeakPCL extends WeakReference
implements PropertyChangeListener {
private Toolkit kit;
private String key;
private LookAndFeel laf;
- WeakPCL(Object target, Toolkit kit, String key, LookAndFeel laf) {
+ WeakPCL(DesktopProperty target, Toolkit kit, String key, LookAndFeel laf) {
super(target, queue);
this.kit = kit;
this.key = key;
@@ -284,7 +283,7 @@ public class DesktopProperty implements UIDefaults.ActiveValue {
}
public void propertyChange(PropertyChangeEvent pce) {
- DesktopProperty property = (DesktopProperty)get();
+ DesktopProperty property = get();
if (property == null || laf != UIManager.getLookAndFeel()) {
// The property was GC'ed, we're no longer interested in
diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsDesktopManager.java b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsDesktopManager.java
index e27ac218e11..20d87d015aa 100644
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsDesktopManager.java
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsDesktopManager.java
@@ -96,7 +96,7 @@ public class WindowsDesktopManager extends DefaultDesktopManager
}
} catch (PropertyVetoException e) {}
if (f != currentFrame) {
- currentFrameRef = new WeakReference(f);
+ currentFrameRef = new WeakReference(f);
}
}
diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java
index 43d840b1d6f..e0fb203e0d3 100644
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java
@@ -983,7 +983,7 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
} else if (s.equals("componentOrientation")) {
ComponentOrientation o = (ComponentOrientation)e.getNewValue();
JFileChooser cc = (JFileChooser)e.getSource();
- if (o != (ComponentOrientation)e.getOldValue()) {
+ if (o != e.getOldValue()) {
cc.applyComponentOrientation(o);
}
} else if (s.equals("ancestor")) {
@@ -1123,7 +1123,7 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
* Data model for a type-face selection combo-box.
*/
protected class DirectoryComboBoxModel extends AbstractListModel implements ComboBoxModel {
- Vector directories = new Vector();
+ Vector directories = new Vector();
int[] depths = null;
File selectedDirectory = null;
JFileChooser chooser = getFileChooser();
@@ -1162,7 +1162,7 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
// Get the canonical (full) path. This has the side
// benefit of removing extraneous chars from the path,
// for example /foo/bar/ becomes /foo/bar
- File canonical = null;
+ File canonical;
try {
canonical = directory.getCanonicalFile();
} catch (IOException e) {
@@ -1175,7 +1175,7 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
File sf = useShellFolder ? ShellFolder.getShellFolder(canonical)
: canonical;
File f = sf;
- Vector path = new Vector(10);
+ Vector path = new Vector(10);
do {
path.addElement(f);
} while ((f = f.getParentFile()) != null);
@@ -1183,7 +1183,7 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
int pathCount = path.size();
// Insert chain at appropriate place in vector
for (int i = 0; i < pathCount; i++) {
- f = (File)path.get(i);
+ f = path.get(i);
if (directories.contains(f)) {
int topIndex = directories.indexOf(f);
for (int j = i-1; j >= 0; j--) {
@@ -1202,12 +1202,12 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
private void calculateDepths() {
depths = new int[directories.size()];
for (int i = 0; i < depths.length; i++) {
- File dir = (File)directories.get(i);
+ File dir = directories.get(i);
File parent = dir.getParentFile();
depths[i] = 0;
if (parent != null) {
for (int j = i-1; j >= 0; j--) {
- if (parent.equals((File)directories.get(j))) {
+ if (parent.equals(directories.get(j))) {
depths[i] = depths[j] + 1;
break;
}
@@ -1306,8 +1306,8 @@ public class WindowsFileChooserUI extends BasicFileChooserUI {
FileFilter currentFilter = getFileChooser().getFileFilter();
boolean found = false;
if(currentFilter != null) {
- for(int i=0; i < filters.length; i++) {
- if(filters[i] == currentFilter) {
+ for (FileFilter filter : filters) {
+ if (filter == currentFilter) {
found = true;
}
}
diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java
index b13033bf76b..5222cd5dd08 100644
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java
@@ -137,25 +137,46 @@ public class WindowsInternalFrameTitlePane extends BasicInternalFrameTitlePane {
int baseline = (getHeight() + fm.getAscent() - fm.getLeading() -
fm.getDescent()) / 2;
- int titleX;
- Rectangle r = new Rectangle(0, 0, 0, 0);
- if (frame.isIconifiable()) r = iconButton.getBounds();
- else if (frame.isMaximizable()) r = maxButton.getBounds();
- else if (frame.isClosable()) r = closeButton.getBounds();
- int titleW;
-
- if(WindowsGraphicsUtils.isLeftToRight(frame) ) {
- if (r.x == 0) r.x = frame.getWidth()-frame.getInsets().right;
- titleX = systemLabel.getX() + systemLabel.getWidth() + 2;
- if (xp != null) {
- titleX += 2;
- }
- titleW = r.x - titleX - 3;
- title = getTitle(frame.getTitle(), fm, titleW);
- } else {
- titleX = systemLabel.getX() - 2
- - SwingUtilities2.stringWidth(frame,fm,title);
+ Rectangle lastIconBounds = new Rectangle(0, 0, 0, 0);
+ if (frame.isIconifiable()) {
+ lastIconBounds = iconButton.getBounds();
+ } else if (frame.isMaximizable()) {
+ lastIconBounds = maxButton.getBounds();
+ } else if (frame.isClosable()) {
+ lastIconBounds = closeButton.getBounds();
}
+
+ int titleX;
+ int titleW;
+ int gap = 2;
+ if (WindowsGraphicsUtils.isLeftToRight(frame)) {
+ if (lastIconBounds.x == 0) { // There are no icons
+ lastIconBounds.x = frame.getWidth() - frame.getInsets().right;
+ }
+ titleX = systemLabel.getX() + systemLabel.getWidth() + gap;
+ if (xp != null) {
+ titleX += 2;
+ }
+ titleW = lastIconBounds.x - titleX - gap;
+ } else {
+ if (lastIconBounds.x == 0) { // There are no icons
+ lastIconBounds.x = frame.getInsets().left;
+ }
+ titleW = SwingUtilities2.stringWidth(frame, fm, title);
+ int minTitleX = lastIconBounds.x + lastIconBounds.width + gap;
+ if (xp != null) {
+ minTitleX += 2;
+ }
+ int availableWidth = systemLabel.getX() - gap - minTitleX;
+ if (availableWidth > titleW) {
+ titleX = systemLabel.getX() - gap - titleW;
+ } else {
+ titleX = minTitleX;
+ titleW = availableWidth;
+ }
+ }
+ title = getTitle(frame.getTitle(), fm, titleW);
+
if (xp != null) {
String shadowType = null;
if (isSelected) {
@@ -258,8 +279,8 @@ public class WindowsInternalFrameTitlePane extends BasicInternalFrameTitlePane {
g.fillRect(0, 0, w, h);
}
Icon icon = getIcon();
- int iconWidth = 0;
- int iconHeight = 0;
+ int iconWidth;
+ int iconHeight;
if (icon != null &&
(iconWidth = icon.getIconWidth()) > 0 &&
(iconHeight = icon.getIconHeight()) > 0) {
@@ -304,18 +325,18 @@ public class WindowsInternalFrameTitlePane extends BasicInternalFrameTitlePane {
}
protected void addSystemMenuItems(JPopupMenu menu) {
- JMenuItem mi = (JMenuItem)menu.add(restoreAction);
+ JMenuItem mi = menu.add(restoreAction);
mi.setMnemonic('R');
- mi = (JMenuItem)menu.add(moveAction);
+ mi = menu.add(moveAction);
mi.setMnemonic('M');
- mi = (JMenuItem)menu.add(sizeAction);
+ mi = menu.add(sizeAction);
mi.setMnemonic('S');
- mi = (JMenuItem)menu.add(iconifyAction);
+ mi = menu.add(iconifyAction);
mi.setMnemonic('n');
- mi = (JMenuItem)menu.add(maximizeAction);
+ mi = menu.add(maximizeAction);
mi.setMnemonic('x');
systemPopupMenu.add(new JSeparator());
- mi = (JMenuItem)menu.add(closeAction);
+ mi = menu.add(closeAction);
mi.setMnemonic('C');
}
@@ -441,7 +462,7 @@ public class WindowsInternalFrameTitlePane extends BasicInternalFrameTitlePane {
public class WindowsPropertyChangeHandler extends PropertyChangeHandler {
public void propertyChange(PropertyChangeEvent evt) {
- String prop = (String)evt.getPropertyName();
+ String prop = evt.getPropertyName();
// Update the internal frame icon for the system menu.
if (JInternalFrame.FRAME_ICON_PROPERTY.equals(prop) &&
diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsScrollBarUI.java b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsScrollBarUI.java
index b137b38c015..f79f9d644db 100644
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsScrollBarUI.java
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsScrollBarUI.java
@@ -369,21 +369,21 @@ public class WindowsScrollBarUI extends BasicScrollBarUI {
*/
private static class Grid {
private static final int BUFFER_SIZE = 64;
- private static HashMap map;
+ private static HashMap> map;
private BufferedImage image;
static {
- map = new HashMap();
+ map = new HashMap>();
}
public static Grid getGrid(Color fg, Color bg) {
String key = fg.getRGB() + " " + bg.getRGB();
- WeakReference ref = (WeakReference)map.get(key);
- Grid grid = (ref == null) ? null : (Grid)ref.get();
+ WeakReference ref = map.get(key);
+ Grid grid = (ref == null) ? null : ref.get();
if (grid == null) {
grid = new Grid(fg, bg);
- map.put(key, new WeakReference(grid));
+ map.put(key, new WeakReference(grid));
}
return grid;
}
diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI.java b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI.java
index 54d21e8f00d..b781caa3cfc 100644
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI.java
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI.java
@@ -53,13 +53,13 @@ public class WindowsTabbedPaneUI extends BasicTabbedPaneUI {
* Keys to use for forward focus traversal when the JComponent is
* managing focus.
*/
- private static Set managingFocusForwardTraversalKeys;
+ private static Set managingFocusForwardTraversalKeys;
/**
* Keys to use for backward focus traversal when the JComponent is
* managing focus.
*/
- private static Set managingFocusBackwardTraversalKeys;
+ private static Set managingFocusBackwardTraversalKeys;
private boolean contentOpaque = true;
@@ -69,13 +69,13 @@ public class WindowsTabbedPaneUI extends BasicTabbedPaneUI {
// focus forward traversal key
if (managingFocusForwardTraversalKeys==null) {
- managingFocusForwardTraversalKeys = new HashSet();
+ managingFocusForwardTraversalKeys = new HashSet();
managingFocusForwardTraversalKeys.add(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0));
}
tabPane.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, managingFocusForwardTraversalKeys);
// focus backward traversal key
if (managingFocusBackwardTraversalKeys==null) {
- managingFocusBackwardTraversalKeys = new HashSet();
+ managingFocusBackwardTraversalKeys = new HashSet();
managingFocusBackwardTraversalKeys.add( KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_MASK));
}
tabPane.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, managingFocusBackwardTraversalKeys);
diff --git a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java
index e2217e0f35a..0f2b39d8937 100644
--- a/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java
+++ b/jdk/src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java
@@ -124,7 +124,7 @@ public class WindowsTableHeaderUI extends BasicTableHeaderUI {
setIcon(null);
sortIcon = null;
SortOrder sortOrder =
- getColumnSortOrder(header.getTable(), column);
+ getColumnSortOrder(table, column);
if (sortOrder != null) {
switch (sortOrder) {
case ASCENDING:
diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java
index 1554444f508..52783fd5a60 100644
--- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java
+++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/Introspector.java
@@ -228,7 +228,15 @@ public class Introspector {
// to generate the appropriate exception.
}
if (c != null) {
- MXBeanMappingFactory factory = MXBeanMappingFactory.forInterface(c);
+ MXBeanMappingFactory factory;
+ try {
+ factory = MXBeanMappingFactory.forInterface(c);
+ } catch (IllegalArgumentException e) {
+ NotCompliantMBeanException ncmbe =
+ new NotCompliantMBeanException(e.getMessage());
+ ncmbe.initCause(e);
+ throw ncmbe;
+ }
return new MXBeanSupport(mbean, c, factory);
}
checkCompliance(mbeanClass);
diff --git a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanSupport.java b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanSupport.java
index 594a9733481..7a9c5d2e7a8 100644
--- a/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanSupport.java
+++ b/jdk/src/share/classes/com/sun/jmx/mbeanserver/MXBeanSupport.java
@@ -36,7 +36,6 @@ import javax.management.MBeanServer;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.management.openmbean.MXBeanMappingFactory;
-import javax.management.openmbean.MXBeanMappingFactoryClass;
/**
* Base class for MXBeans.
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/Init.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/Init.java
index 845c36a5f44..5b1acfd6aa2 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/Init.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/Init.java
@@ -20,12 +20,9 @@
*/
package com.sun.org.apache.xml.internal.security;
-
-
import java.io.InputStream;
import java.security.AccessController;
import java.security.PrivilegedAction;
-
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
@@ -51,7 +48,7 @@ import org.w3c.dom.Node;
* done by calling {@link Init#init} which should be done in any static block
* of the files of this library. We ensure that this call is only executed once.
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public final class Init {
@@ -113,20 +110,19 @@ public final class Init {
dbf.setValidating(false);
DocumentBuilder db = dbf.newDocumentBuilder();
-
// We don't allow users to override the Apache XML Security
// configuration in the JRE. Users should use the standard security
// provider mechanism instead if implementing their own
// transform or canonicalization algorithms.
- // String cfile = System.getProperty("com.sun.org.apache.xml.internal.security.resource.config");
- // InputStream is =
- // Class.forName("com.sun.org.apache.xml.internal.security.Init")
- // .getResourceAsStream(cfile != null ? cfile : "resource/config.xml");
+ // InputStream is = Class.forName("com.sun.org.apache.xml.internal.security.Init").getResourceAsStream("resource/config.xml");
InputStream is = (InputStream) AccessController.doPrivileged(
new PrivilegedAction() {
public Object run() {
+// String cfile = System.getProperty
+// ("com.sun.org.apache.xml.internal.security.resource.config");
return getClass().getResourceAsStream
- ("resource/config.xml");
+// (cfile != null ? cfile : "resource/config.xml");
+ ("resource/config.xml");
}
});
@@ -167,7 +163,7 @@ public final class Init {
//
// if (tag.equals("ResourceBundles")){
// XX_configure_i18n_start = System.currentTimeMillis();
-// Element resource=(Element)el;
+// Element resource=(Element)el;
// /* configure internationalization */
// Attr langAttr = resource.getAttributeNode("defaultLanguageCode");
// Attr countryAttr = resource.getAttributeNode("defaultCountryCode");
@@ -202,11 +198,11 @@ public final class Init {
if (currMeth.getDeclaringClass().getName()
.equals(JAVACLASS)) {
- log.log(java.util.logging.Level.FINE, currMeth.getDeclaringClass().toString());
+ log.log(java.util.logging.Level.FINE, currMeth.getDe claringClass().toString());
}
}*/
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Canonicalizer.register(" + URI + ", "
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Canonicalizer.register(" + URI + ", "
+ JAVACLASS + ")");
Canonicalizer.register(URI, JAVACLASS);
} catch (ClassNotFoundException e) {
@@ -233,9 +229,8 @@ public final class Init {
"JAVACLASS");
try {
Class.forName(JAVACLASS);
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Transform.register(" + URI + ", " + JAVACLASS
- + ")");
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Transform.register(" + URI + ", " + JAVACLASS + ")");
Transform.register(URI, JAVACLASS);
} catch (ClassNotFoundException e) {
Object exArgs[] = { URI, JAVACLASS };
@@ -284,12 +279,11 @@ public final class Init {
//
// if (currMeth.getDeclaringClass().getName()
// .equals(JAVACLASS)) {
-// log.log(java.util.logging.Level.FINE, currMeth.getDeclaringClass().toString());
+// log.log(java.util.logging.Level.FINE, currMeth.getDe claringClass().toString());
// }
// }
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "SignatureAlgorithm.register(" + URI + ", "
- + JAVACLASS + ")");
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "SignatureAlgorithm.register(" + URI + ", " + JAVACLASS + ")");
SignatureAlgorithm.register(URI, JAVACLASS);
} catch (ClassNotFoundException e) {
Object exArgs[] = { URI, JAVACLASS };
@@ -320,13 +314,11 @@ public final class Init {
"DESCRIPTION");
if ((Description != null) && (Description.length() > 0)) {
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Register Resolver: " + JAVACLASS + ": "
- + Description);
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Register Resolver: " + JAVACLASS + ": " + Description);
} else {
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Register Resolver: " + JAVACLASS
- + ": For unknown purposes");
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Register Resolver: " + JAVACLASS + ": For unknown purposes");
}
try {
ResourceResolver.register(JAVACLASS);
@@ -359,13 +351,11 @@ public final class Init {
"DESCRIPTION");
if ((Description != null) && (Description.length() > 0)) {
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Register Resolver: " + JAVACLASS + ": "
- + Description);
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Register Resolver: " + JAVACLASS + ": " + Description);
} else {
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Register Resolver: " + JAVACLASS
- + ": For unknown purposes");
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Register Resolver: " + JAVACLASS + ": For unknown purposes");
}
KeyResolver.register(JAVACLASS);
@@ -376,8 +366,8 @@ public final class Init {
if (tag.equals("PrefixMappings")){
XX_configure_reg_prefixes_start = System.currentTimeMillis();
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Now I try to bind prefixes:");
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Now I try to bind prefixes:");
Element[] nl = XMLUtils.selectNodes(el.getFirstChild(), CONF_NS,"PrefixMapping");
@@ -386,8 +376,8 @@ public final class Init {
"namespace");
String prefix = nl[i].getAttributeNS(null,
"prefix");
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Now I try to bind " + prefix + " to " + namespace);
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Now I try to bind " + prefix + " to " + namespace);
com.sun.org.apache.xml.internal.security.utils.ElementProxy
.setDefaultPrefix(namespace, prefix);
}
@@ -398,19 +388,19 @@ public final class Init {
long XX_init_end = System.currentTimeMillis();
//J-
- if (true) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "XX_init " + ((int)(XX_init_end - XX_init_start)) + " ms");
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_prng " + ((int)(XX_prng_end - XX_prng_start)) + " ms");
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_parsing " + ((int)(XX_parsing_end - XX_parsing_start)) + " ms");
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_i18n " + ((int)(XX_configure_i18n_end- XX_configure_i18n_start)) + " ms");
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_c14n " + ((int)(XX_configure_reg_c14n_end- XX_configure_reg_c14n_start)) + " ms");
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_jcemapper " + ((int)(XX_configure_reg_jcemapper_end- XX_configure_reg_jcemapper_start)) + " ms");
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_keyInfo " + ((int)(XX_configure_reg_keyInfo_end- XX_configure_reg_keyInfo_start)) + " ms");
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_keyResolver " + ((int)(XX_configure_reg_keyResolver_end- XX_configure_reg_keyResolver_start)) + " ms");
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_prefixes " + ((int)(XX_configure_reg_prefixes_end- XX_configure_reg_prefixes_start)) + " ms");
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_resourceresolver " + ((int)(XX_configure_reg_resourceresolver_end- XX_configure_reg_resourceresolver_start)) + " ms");
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_sigalgos " + ((int)(XX_configure_reg_sigalgos_end- XX_configure_reg_sigalgos_start)) + " ms");
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, " XX_configure_reg_transforms " + ((int)(XX_configure_reg_transforms_end- XX_configure_reg_transforms_start)) + " ms");
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "XX_init " + ((int)(XX_init_end - XX_init_start)) + " ms");
+ log.log(java.util.logging.Level.FINE, " XX_prng " + ((int)(XX_prng_end - XX_prng_start)) + " ms");
+ log.log(java.util.logging.Level.FINE, " XX_parsing " + ((int)(XX_parsing_end - XX_parsing_start)) + " ms");
+ log.log(java.util.logging.Level.FINE, " XX_configure_i18n " + ((int)(XX_configure_i18n_end- XX_configure_i18n_start)) + " ms");
+ log.log(java.util.logging.Level.FINE, " XX_configure_reg_c14n " + ((int)(XX_configure_reg_c14n_end- XX_configure_reg_c14n_start)) + " ms");
+ log.log(java.util.logging.Level.FINE, " XX_configure_reg_jcemapper " + ((int)(XX_configure_reg_jcemapper_end- XX_configure_reg_jcemapper_start)) + " ms");
+ log.log(java.util.logging.Level.FINE, " XX_configure_reg_keyInfo " + ((int)(XX_configure_reg_keyInfo_end- XX_configure_reg_keyInfo_start)) + " ms");
+ log.log(java.util.logging.Level.FINE, " XX_configure_reg_keyResolver " + ((int)(XX_configure_reg_keyResolver_end- XX_configure_reg_keyResolver_start)) + " ms");
+ log.log(java.util.logging.Level.FINE, " XX_configure_reg_prefixes " + ((int)(XX_configure_reg_prefixes_end- XX_configure_reg_prefixes_start)) + " ms");
+ log.log(java.util.logging.Level.FINE, " XX_configure_reg_resourceresolver " + ((int)(XX_configure_reg_resourceresolver_end- XX_configure_reg_resourceresolver_start)) + " ms");
+ log.log(java.util.logging.Level.FINE, " XX_configure_reg_sigalgos " + ((int)(XX_configure_reg_sigalgos_end- XX_configure_reg_sigalgos_start)) + " ms");
+ log.log(java.util.logging.Level.FINE, " XX_configure_reg_transforms " + ((int)(XX_configure_reg_transforms_end- XX_configure_reg_transforms_start)) + " ms");
}
} catch (Exception e) {
log.log(java.util.logging.Level.SEVERE, "Bad: ", e);
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/Algorithm.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/Algorithm.java
index 2f326f0a7a4..62fd0fe4964 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/Algorithm.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/Algorithm.java
@@ -24,7 +24,7 @@ package com.sun.org.apache.xml.internal.security.algorithms;
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
import com.sun.org.apache.xml.internal.security.utils.Constants;
-import com.sun.org.apache.xml.internal.security.utils.ElementProxy;
+import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -33,11 +33,7 @@ import org.w3c.dom.Element;
* The Algorithm class which stores the Algorithm URI as a string.
*
*/
-public abstract class Algorithm extends ElementProxy {
-
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(Algorithm.class.getName());
+public abstract class Algorithm extends SignatureElementProxy {
/**
*
@@ -79,7 +75,7 @@ public abstract class Algorithm extends ElementProxy {
*/
protected void setAlgorithmURI(String algorithmURI) {
- if ((this._state == MODE_CREATE) && (algorithmURI != null)) {
+ if ( (algorithmURI != null)) {
this._constructionElement.setAttributeNS(null, Constants._ATT_ALGORITHM,
algorithmURI);
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/JCEMapper.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/JCEMapper.java
index 475d4591bcd..7a239135920 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/JCEMapper.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/JCEMapper.java
@@ -35,7 +35,7 @@ import org.w3c.dom.Element;
/**
* This class maps algorithm identifier URIs to JAVA JCE class names.
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class JCEMapper {
@@ -45,9 +45,9 @@ public class JCEMapper {
- private static Map uriToJCEName = new HashMap();
+ private static Map uriToJCEName;
- private static Map algorithmsMap = new HashMap();
+ private static Map algorithmsMap;
private static String providerName = null;
/**
@@ -63,6 +63,8 @@ public class JCEMapper {
static void loadAlgorithms( Element algorithmsEl) {
Element[] algorithms = XMLUtils.selectNodes(algorithmsEl.getFirstChild(),Init.CONF_NS,"Algorithm");
+ uriToJCEName = new HashMap( algorithms.length * 2);
+ algorithmsMap = new HashMap( algorithms.length * 2);
for (int i = 0 ;i < algorithms.length ;i ++) {
Element el = algorithms[i];
String id = el.getAttribute("URI");
@@ -70,6 +72,7 @@ public class JCEMapper {
uriToJCEName.put(id, jceName);
algorithmsMap.put(id, new Algorithm(el));
}
+
}
static Algorithm getAlgorithmMapping(String algoURI) {
@@ -84,8 +87,8 @@ public class JCEMapper {
*
*/
public static String translateURItoJCEID(String AlgorithmURI) {
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Request for URI " + AlgorithmURI);
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Request for URI " + AlgorithmURI);
String jceName = (String) uriToJCEName.get(AlgorithmURI);
return jceName;
@@ -100,8 +103,8 @@ public class JCEMapper {
*
*/
public static String getAlgorithmClassFromURI(String AlgorithmURI) {
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Request for URI " + AlgorithmURI);
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Request for URI " + AlgorithmURI);
return ((Algorithm) algorithmsMap.get(AlgorithmURI)).algorithmClass;
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/MessageDigestAlgorithm.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/MessageDigestAlgorithm.java
index 805d061a2e6..fa62ef3518f 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/MessageDigestAlgorithm.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/MessageDigestAlgorithm.java
@@ -20,10 +20,10 @@
*/
package com.sun.org.apache.xml.internal.security.algorithms;
-
-
import java.security.MessageDigest;
import java.security.NoSuchProviderException;
+import java.util.HashMap;
+import java.util.Map;
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
import com.sun.org.apache.xml.internal.security.utils.Constants;
@@ -41,11 +41,6 @@ import org.w3c.dom.Document;
*/
public class MessageDigestAlgorithm extends Algorithm {
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(
- MessageDigestAlgorithm.class.getName());
-
/** Message Digest - NOT RECOMMENDED MD5*/
public static final String ALGO_ID_DIGEST_NOT_RECOMMENDED_MD5 = Constants.MoreAlgorithmsSpecNS + "md5";
/** Digest - Required SHA1*/
@@ -76,6 +71,12 @@ public class MessageDigestAlgorithm extends Algorithm {
this.algorithm = messageDigest;
}
+ static ThreadLocal instances=new ThreadLocal() {
+ protected Object initialValue() {
+ return new HashMap();
+ };
+ };
+
/**
* Factory method for constructing a message digest algorithm by name.
*
@@ -86,8 +87,15 @@ public class MessageDigestAlgorithm extends Algorithm {
*/
public static MessageDigestAlgorithm getInstance(
Document doc, String algorithmURI) throws XMLSignatureException {
+ MessageDigest md = getDigestInstance(algorithmURI);
+ return new MessageDigestAlgorithm(doc, md, algorithmURI);
+ }
- String algorithmID = JCEMapper.translateURItoJCEID(algorithmURI);
+private static MessageDigest getDigestInstance(String algorithmURI) throws XMLSignatureException {
+ MessageDigest result=(MessageDigest) ((Map)instances.get()).get(algorithmURI);
+ if (result!=null)
+ return result;
+ String algorithmID = JCEMapper.translateURItoJCEID(algorithmURI);
if (algorithmID == null) {
Object[] exArgs = { algorithmURI };
@@ -113,8 +121,9 @@ public class MessageDigestAlgorithm extends Algorithm {
throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
}
- return new MessageDigestAlgorithm(doc, md, algorithmURI);
- }
+ ((Map)instances.get()).put(algorithmURI, md);
+ return md;
+}
/**
* Returns the actual {@link java.security.MessageDigest} algorithm object
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java
index 3ebb782a3d2..567df3cbbd1 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithm.java
@@ -25,6 +25,7 @@ import java.security.Key;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
import java.util.HashMap;
+import java.util.Map;
import com.sun.org.apache.xml.internal.security.algorithms.implementations.IntegrityHmac;
import com.sun.org.apache.xml.internal.security.exceptions.AlgorithmAlreadyRegisteredException;
@@ -52,9 +53,35 @@ public class SignatureAlgorithm extends Algorithm {
/** All available algorithm classes are registered here */
static HashMap _algorithmHash = null;
+ static ThreadLocal instancesSigning=new ThreadLocal() {
+ protected Object initialValue() {
+ return new HashMap();
+ };
+ };
+
+ static ThreadLocal instancesVerify=new ThreadLocal() {
+ protected Object initialValue() {
+ return new HashMap();
+ };
+ };
+
+ static ThreadLocal keysSigning=new ThreadLocal() {
+ protected Object initialValue() {
+ return new HashMap();
+ };
+ };
+ static ThreadLocal keysVerify=new ThreadLocal() {
+ protected Object initialValue() {
+ return new HashMap();
+ };
+ };
+// boolean isForSigning=false;
+
/** Field _signatureAlgorithm */
protected SignatureAlgorithmSpi _signatureAlgorithm = null;
+ private String algorithmURI;
+
/**
* Constructor SignatureAlgorithm
*
@@ -64,18 +91,49 @@ public class SignatureAlgorithm extends Algorithm {
*/
public SignatureAlgorithm(Document doc, String algorithmURI)
throws XMLSecurityException {
-
super(doc, algorithmURI);
+ this.algorithmURI = algorithmURI;
+ }
- try {
+
+ private void initializeAlgorithm(boolean isForSigning) throws XMLSignatureException {
+ if (_signatureAlgorithm!=null) {
+ return;
+ }
+ _signatureAlgorithm=isForSigning ? getInstanceForSigning(algorithmURI) : getInstanceForVerify(algorithmURI);
+ this._signatureAlgorithm
+ .engineGetContextFromElement(this._constructionElement);
+ }
+ private static SignatureAlgorithmSpi getInstanceForSigning(String algorithmURI) throws XMLSignatureException {
+ SignatureAlgorithmSpi result=(SignatureAlgorithmSpi) ((Map)instancesSigning.get()).get(algorithmURI);
+ if (result!=null) {
+ result.reset();
+ return result;
+ }
+ result=buildSigner(algorithmURI, result);
+ ((Map)instancesSigning.get()).put(algorithmURI,result);
+ return result;
+ }
+ private static SignatureAlgorithmSpi getInstanceForVerify(String algorithmURI) throws XMLSignatureException {
+ SignatureAlgorithmSpi result=(SignatureAlgorithmSpi) ((Map)instancesVerify.get()).get(algorithmURI);
+ if (result!=null) {
+ result.reset();
+ return result;
+ }
+ result=buildSigner(algorithmURI, result);
+ ((Map)instancesVerify.get()).put(algorithmURI,result);
+ return result;
+ }
+
+ private static SignatureAlgorithmSpi buildSigner(String algorithmURI, SignatureAlgorithmSpi result) throws XMLSignatureException {
+ try {
Class implementingClass =
SignatureAlgorithm.getImplementingClass(algorithmURI);
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Create URI \"" + algorithmURI + "\" class \""
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Create URI \"" + algorithmURI + "\" class \""
+ implementingClass + "\"");
-
- this._signatureAlgorithm =
- (SignatureAlgorithmSpi) implementingClass.newInstance();
+ result=(SignatureAlgorithmSpi) implementingClass.newInstance();
+ return result;
} catch (IllegalAccessException ex) {
Object exArgs[] = { algorithmURI, ex.getMessage() };
@@ -92,7 +150,7 @@ public class SignatureAlgorithm extends Algorithm {
throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs,
ex);
}
- }
+}
/**
* Constructor SignatureAlgorithm
@@ -107,7 +165,8 @@ public class SignatureAlgorithm extends Algorithm {
throws XMLSecurityException {
this(doc, algorithmURI);
-
+ this.algorithmURI=algorithmURI;
+ initializeAlgorithm(true);
this._signatureAlgorithm.engineSetHMACOutputLength(HMACOutputLength);
((IntegrityHmac)this._signatureAlgorithm)
.engineAddContextToElement(this._constructionElement);
@@ -124,37 +183,7 @@ public class SignatureAlgorithm extends Algorithm {
throws XMLSecurityException {
super(element, BaseURI);
-
- String algorithmURI = this.getURI();
-
- try {
- Class implementingClass =
- SignatureAlgorithm.getImplementingClass(algorithmURI);
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Create URI \"" + algorithmURI + "\" class \""
- + implementingClass + "\"");
-
- this._signatureAlgorithm =
- (SignatureAlgorithmSpi) implementingClass.newInstance();
-
- this._signatureAlgorithm
- .engineGetContextFromElement(this._constructionElement);
- } catch (IllegalAccessException ex) {
- Object exArgs[] = { algorithmURI, ex.getMessage() };
-
- throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs,
- ex);
- } catch (InstantiationException ex) {
- Object exArgs[] = { algorithmURI, ex.getMessage() };
-
- throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs,
- ex);
- } catch (NullPointerException ex) {
- Object exArgs[] = { algorithmURI, ex.getMessage() };
-
- throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs,
- ex);
- }
+ algorithmURI = this.getURI();
}
/**
@@ -175,7 +204,12 @@ public class SignatureAlgorithm extends Algorithm {
* @return the result of the {@link java.security.Signature#getAlgorithm} method
*/
public String getJCEAlgorithmString() {
- return this._signatureAlgorithm.engineGetJCEAlgorithmString();
+ try {
+ return getInstanceForVerify(algorithmURI).engineGetJCEAlgorithmString();
+ } catch (XMLSignatureException e) {
+ //Ignore.
+ return null;
+ }
}
/**
@@ -184,7 +218,11 @@ public class SignatureAlgorithm extends Algorithm {
* @return The Provider of this Signature Alogrithm
*/
public String getJCEProviderName() {
- return this._signatureAlgorithm.engineGetJCEProviderName();
+ try {
+ return getInstanceForVerify(algorithmURI).engineGetJCEProviderName();
+ } catch (XMLSignatureException e) {
+ return null;
+ }
}
/**
@@ -231,7 +269,13 @@ public class SignatureAlgorithm extends Algorithm {
* @throws XMLSignatureException
*/
public void initSign(Key signingKey) throws XMLSignatureException {
- this._signatureAlgorithm.engineInitSign(signingKey);
+ initializeAlgorithm(true);
+ Map map=(Map)keysSigning.get();
+ if (map.get(this.algorithmURI)==signingKey) {
+ return;
+ }
+ map.put(this.algorithmURI,signingKey);
+ this._signatureAlgorithm.engineInitSign(signingKey);
}
/**
@@ -244,6 +288,7 @@ public class SignatureAlgorithm extends Algorithm {
*/
public void initSign(Key signingKey, SecureRandom secureRandom)
throws XMLSignatureException {
+ initializeAlgorithm(true);
this._signatureAlgorithm.engineInitSign(signingKey, secureRandom);
}
@@ -258,6 +303,7 @@ public class SignatureAlgorithm extends Algorithm {
public void initSign(
Key signingKey, AlgorithmParameterSpec algorithmParameterSpec)
throws XMLSignatureException {
+ initializeAlgorithm(true);
this._signatureAlgorithm.engineInitSign(signingKey,
algorithmParameterSpec);
}
@@ -282,7 +328,13 @@ public class SignatureAlgorithm extends Algorithm {
* @throws XMLSignatureException
*/
public void initVerify(Key verificationKey) throws XMLSignatureException {
- this._signatureAlgorithm.engineInitVerify(verificationKey);
+ initializeAlgorithm(false);
+ Map map=(Map)keysVerify.get();
+ if (map.get(this.algorithmURI)==verificationKey) {
+ return;
+ }
+ map.put(this.algorithmURI,verificationKey);
+ this._signatureAlgorithm.engineInitVerify(verificationKey);
}
/**
@@ -320,7 +372,7 @@ public class SignatureAlgorithm extends Algorithm {
.getLogger(SignatureAlgorithm.class.getName());
}
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Init() called");
+ log.log(java.util.logging.Level.FINE, "Init() called");
if (!SignatureAlgorithm._alreadyInitialized) {
SignatureAlgorithm._algorithmHash = new HashMap(10);
@@ -340,8 +392,8 @@ public class SignatureAlgorithm extends Algorithm {
throws AlgorithmAlreadyRegisteredException,XMLSignatureException {
{
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Try to register " + algorithmURI + " " + implementingClass);
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Try to register " + algorithmURI + " " + implementingClass);
// are we already registered?
Class registeredClassClass =
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithmSpi.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithmSpi.java
index 1ae46db4bb3..c47be7e2c0d 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithmSpi.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/SignatureAlgorithmSpi.java
@@ -20,27 +20,20 @@
*/
package com.sun.org.apache.xml.internal.security.algorithms;
-
-
import java.security.Key;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
-import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public abstract class SignatureAlgorithmSpi {
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(SignatureAlgorithmSpi.class.getName());
-
/**
* Returns the URI representation of Transformation algorithm
*
@@ -167,20 +160,6 @@ public abstract class SignatureAlgorithmSpi {
protected abstract void engineSetParameter(AlgorithmParameterSpec params)
throws XMLSignatureException;
- /** Field _doc */
- Document _doc = null;
-
- /**
- * Method engineSetDocument
- *
- * @param doc
- */
- protected void engineSetDocument(Document doc) {
- this._doc = doc;
- }
-
- /** Field _constructionElement */
- Element _constructionElement = null;
/**
* Method engineGetContextFromElement
@@ -188,7 +167,6 @@ public abstract class SignatureAlgorithmSpi {
* @param element
*/
protected void engineGetContextFromElement(Element element) {
- this._constructionElement = element;
}
/**
@@ -199,4 +177,7 @@ public abstract class SignatureAlgorithmSpi {
*/
protected abstract void engineSetHMACOutputLength(int HMACOutputLength)
throws XMLSignatureException;
+
+ public void reset() {
+ }
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/IntegrityHmac.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/IntegrityHmac.java
index 0e89024bf26..d3495bb567f 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/IntegrityHmac.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/IntegrityHmac.java
@@ -45,7 +45,7 @@ import org.w3c.dom.Text;
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public abstract class IntegrityHmac extends SignatureAlgorithmSpi {
@@ -74,8 +74,8 @@ public abstract class IntegrityHmac extends SignatureAlgorithmSpi {
public IntegrityHmac() throws XMLSignatureException {
String algorithmID = JCEMapper.translateURItoJCEID(this.engineGetURI());
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Created IntegrityHmacSHA1 using " + algorithmID);
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Created IntegrityHmacSHA1 using " + algorithmID);
try {
this._macAlgorithm = Mac.getInstance(algorithmID);
@@ -99,6 +99,10 @@ public abstract class IntegrityHmac extends SignatureAlgorithmSpi {
throw new XMLSignatureException("empty");
}
+ public void reset() {
+ _HMACOutputLength=0;
+ }
+
/**
* Proxy method for {@link java.security.Signature#verify(byte[])}
* which is executed on the internal {@link java.security.Signature} object.
@@ -145,7 +149,20 @@ public abstract class IntegrityHmac extends SignatureAlgorithmSpi {
try {
this._macAlgorithm.init(secretKey);
} catch (InvalidKeyException ex) {
- throw new XMLSignatureException("empty", ex);
+ // reinstantiate Mac object to work around bug in JDK
+ // see: http://bugs.sun.com/view_bug.do?bug_id=4953555
+ Mac mac = this._macAlgorithm;
+ try {
+ this._macAlgorithm = Mac.getInstance
+ (_macAlgorithm.getAlgorithm());
+ } catch (Exception e) {
+ // this shouldn't occur, but if it does, restore previous Mac
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "Exception when reinstantiating Mac:" + e);
+ }
+ this._macAlgorithm = mac;
+ }
+ throw new XMLSignatureException("empty", ex);
}
}
@@ -323,7 +340,7 @@ public abstract class IntegrityHmac extends SignatureAlgorithmSpi {
*/
protected String engineGetJCEAlgorithmString() {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "engineGetJCEAlgorithmString()");
+ log.log(java.util.logging.Level.FINE, "engineGetJCEAlgorithmString()");
return this._macAlgorithm.getAlgorithm();
}
@@ -397,7 +414,8 @@ public abstract class IntegrityHmac extends SignatureAlgorithmSpi {
/**
* Class IntegrityHmacSHA1
*
- * @author $Author: raul $
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
*/
public static class IntegrityHmacSHA1 extends IntegrityHmac {
@@ -423,7 +441,8 @@ public abstract class IntegrityHmac extends SignatureAlgorithmSpi {
/**
* Class IntegrityHmacSHA256
*
- * @author $Author: raul $
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
*/
public static class IntegrityHmacSHA256 extends IntegrityHmac {
@@ -449,7 +468,8 @@ public abstract class IntegrityHmac extends SignatureAlgorithmSpi {
/**
* Class IntegrityHmacSHA384
*
- * @author $Author: raul $
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
*/
public static class IntegrityHmacSHA384 extends IntegrityHmac {
@@ -475,7 +495,8 @@ public abstract class IntegrityHmac extends SignatureAlgorithmSpi {
/**
* Class IntegrityHmacSHA512
*
- * @author $Author: raul $
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
*/
public static class IntegrityHmacSHA512 extends IntegrityHmac {
@@ -501,7 +522,8 @@ public abstract class IntegrityHmac extends SignatureAlgorithmSpi {
/**
* Class IntegrityHmacRIPEMD160
*
- * @author $Author: raul $
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
*/
public static class IntegrityHmacRIPEMD160 extends IntegrityHmac {
@@ -527,7 +549,8 @@ public abstract class IntegrityHmac extends SignatureAlgorithmSpi {
/**
* Class IntegrityHmacMD5
*
- * @author $Author: raul $
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
*/
public static class IntegrityHmacMD5 extends IntegrityHmac {
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureBaseRSA.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureBaseRSA.java
index fde23e8fc88..ccc01b01c58 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureBaseRSA.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureBaseRSA.java
@@ -3,7 +3,7 @@
* DO NOT REMOVE OR ALTER!
*/
/*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2007 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,8 +20,6 @@
*/
package com.sun.org.apache.xml.internal.security.algorithms.implementations;
-
-
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
@@ -38,329 +36,344 @@ import com.sun.org.apache.xml.internal.security.algorithms.SignatureAlgorithmSpi
import com.sun.org.apache.xml.internal.security.signature.XMLSignature;
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
-
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
- /** {@link java.util.logging} logging facility */
+ /** {@link java.util.logging} logging facility */
static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(SignatureBaseRSA.class.getName());
+ java.util.logging.Logger.getLogger
+ (SignatureBaseRSA.class.getName());
/** @inheritDoc */
- public abstract String engineGetURI();
+ public abstract String engineGetURI();
- /** Field algorithm */
- private java.security.Signature _signatureAlgorithm = null;
+ /** Field algorithm */
+ private java.security.Signature _signatureAlgorithm = null;
- /**
- * Constructor SignatureRSA
- *
- * @throws XMLSignatureException
- */
- public SignatureBaseRSA() throws XMLSignatureException {
+ /**
+ * Constructor SignatureRSA
+ *
+ * @throws XMLSignatureException
+ */
+ public SignatureBaseRSA() throws XMLSignatureException {
- String algorithmID = JCEMapper.translateURItoJCEID(this.engineGetURI());
+ String algorithmID = JCEMapper.translateURItoJCEID(this.engineGetURI());
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Created SignatureDSA using " + algorithmID);
- String provider=JCEMapper.getProviderId();
- try {
- if (provider==null) {
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Created SignatureRSA using " + algorithmID);
+ String provider=JCEMapper.getProviderId();
+ try {
+ if (provider==null) {
this._signatureAlgorithm = Signature.getInstance(algorithmID);
- } else {
+ } else {
this._signatureAlgorithm = Signature.getInstance(algorithmID,provider);
- }
- } catch (java.security.NoSuchAlgorithmException ex) {
- Object[] exArgs = { algorithmID,
- ex.getLocalizedMessage() };
+ }
+ } catch (java.security.NoSuchAlgorithmException ex) {
+ Object[] exArgs = { algorithmID, ex.getLocalizedMessage() };
- throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
- } catch (NoSuchProviderException ex) {
- Object[] exArgs = { algorithmID,
- ex.getLocalizedMessage() };
+ throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
+ } catch (NoSuchProviderException ex) {
+ Object[] exArgs = { algorithmID, ex.getLocalizedMessage() };
- throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
+ throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
}
- }
+ }
- /** @inheritDoc */
- protected void engineSetParameter(AlgorithmParameterSpec params)
- throws XMLSignatureException {
+ /** @inheritDoc */
+ protected void engineSetParameter(AlgorithmParameterSpec params)
+ throws XMLSignatureException {
- try {
- this._signatureAlgorithm.setParameter(params);
- } catch (InvalidAlgorithmParameterException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
+ try {
+ this._signatureAlgorithm.setParameter(params);
+ } catch (InvalidAlgorithmParameterException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
- /** @inheritDoc */
- protected boolean engineVerify(byte[] signature)
- throws XMLSignatureException {
+ /** @inheritDoc */
+ protected boolean engineVerify(byte[] signature)
+ throws XMLSignatureException {
- try {
- return this._signatureAlgorithm.verify(signature);
- } catch (SignatureException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
+ try {
+ return this._signatureAlgorithm.verify(signature);
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
- /** @inheritDoc */
- protected void engineInitVerify(Key publicKey) throws XMLSignatureException {
+ /** @inheritDoc */
+ protected void engineInitVerify(Key publicKey) throws XMLSignatureException {
- if (!(publicKey instanceof PublicKey)) {
- String supplied = publicKey.getClass().getName();
- String needed = PublicKey.class.getName();
- Object exArgs[] = { supplied, needed };
+ if (!(publicKey instanceof PublicKey)) {
+ String supplied = publicKey.getClass().getName();
+ String needed = PublicKey.class.getName();
+ Object exArgs[] = { supplied, needed };
- throw new XMLSignatureException("algorithms.WrongKeyForThisOperation",
- exArgs);
- }
+ throw new XMLSignatureException
+ ("algorithms.WrongKeyForThisOperation", exArgs);
+ }
- try {
- this._signatureAlgorithm.initVerify((PublicKey) publicKey);
- } catch (InvalidKeyException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
+ try {
+ this._signatureAlgorithm.initVerify((PublicKey) publicKey);
+ } catch (InvalidKeyException ex) {
+ // reinstantiate Signature object to work around bug in JDK
+ // see: http://bugs.sun.com/view_bug.do?bug_id=4953555
+ Signature sig = this._signatureAlgorithm;
+ try {
+ this._signatureAlgorithm = Signature.getInstance
+ (_signatureAlgorithm.getAlgorithm());
+ } catch (Exception e) {
+ // this shouldn't occur, but if it does, restore previous
+ // Signature
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "Exception when reinstantiating Signature:" + e);
+ }
+ this._signatureAlgorithm = sig;
+ }
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
- /** @inheritDoc */
- protected byte[] engineSign() throws XMLSignatureException {
+ /** @inheritDoc */
+ protected byte[] engineSign() throws XMLSignatureException {
+ try {
+ return this._signatureAlgorithm.sign();
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
- try {
- return this._signatureAlgorithm.sign();
- } catch (SignatureException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
+ /** @inheritDoc */
+ protected void engineInitSign(Key privateKey, SecureRandom secureRandom)
+ throws XMLSignatureException {
- /** @inheritDoc */
- protected void engineInitSign(Key privateKey, SecureRandom secureRandom)
- throws XMLSignatureException {
+ if (!(privateKey instanceof PrivateKey)) {
+ String supplied = privateKey.getClass().getName();
+ String needed = PrivateKey.class.getName();
+ Object exArgs[] = { supplied, needed };
- if (!(privateKey instanceof PrivateKey)) {
- String supplied = privateKey.getClass().getName();
- String needed = PrivateKey.class.getName();
- Object exArgs[] = { supplied, needed };
+ throw new XMLSignatureException
+ ("algorithms.WrongKeyForThisOperation", exArgs);
+ }
- throw new XMLSignatureException("algorithms.WrongKeyForThisOperation",
- exArgs);
- }
+ try {
+ this._signatureAlgorithm.initSign
+ ((PrivateKey) privateKey, secureRandom);
+ } catch (InvalidKeyException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
- try {
- this._signatureAlgorithm.initSign((PrivateKey) privateKey,
- secureRandom);
- } catch (InvalidKeyException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
+ /** @inheritDoc */
+ protected void engineInitSign(Key privateKey) throws XMLSignatureException {
- /** @inheritDoc */
- protected void engineInitSign(Key privateKey) throws XMLSignatureException {
+ if (!(privateKey instanceof PrivateKey)) {
+ String supplied = privateKey.getClass().getName();
+ String needed = PrivateKey.class.getName();
+ Object exArgs[] = { supplied, needed };
- if (!(privateKey instanceof PrivateKey)) {
- String supplied = privateKey.getClass().getName();
- String needed = PrivateKey.class.getName();
- Object exArgs[] = { supplied, needed };
+ throw new XMLSignatureException
+ ("algorithms.WrongKeyForThisOperation", exArgs);
+ }
- throw new XMLSignatureException("algorithms.WrongKeyForThisOperation",
- exArgs);
- }
+ try {
+ this._signatureAlgorithm.initSign((PrivateKey) privateKey);
+ } catch (InvalidKeyException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
- try {
- this._signatureAlgorithm.initSign((PrivateKey) privateKey);
- } catch (InvalidKeyException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
+ /** @inheritDoc */
+ protected void engineUpdate(byte[] input) throws XMLSignatureException {
+ try {
+ this._signatureAlgorithm.update(input);
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
- /** @inheritDoc */
- protected void engineUpdate(byte[] input) throws XMLSignatureException {
+ /** @inheritDoc */
+ protected void engineUpdate(byte input) throws XMLSignatureException {
+ try {
+ this._signatureAlgorithm.update(input);
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
- try {
- this._signatureAlgorithm.update(input);
- } catch (SignatureException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
+ /** @inheritDoc */
+ protected void engineUpdate(byte buf[], int offset, int len)
+ throws XMLSignatureException {
+ try {
+ this._signatureAlgorithm.update(buf, offset, len);
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
- /** @inheritDoc */
- protected void engineUpdate(byte input) throws XMLSignatureException {
+ /** @inheritDoc */
+ protected String engineGetJCEAlgorithmString() {
+ return this._signatureAlgorithm.getAlgorithm();
+ }
- try {
- this._signatureAlgorithm.update(input);
- } catch (SignatureException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
+ /** @inheritDoc */
+ protected String engineGetJCEProviderName() {
+ return this._signatureAlgorithm.getProvider().getName();
+ }
- /** @inheritDoc */
- protected void engineUpdate(byte buf[], int offset, int len)
- throws XMLSignatureException {
+ /** @inheritDoc */
+ protected void engineSetHMACOutputLength(int HMACOutputLength)
+ throws XMLSignatureException {
+ throw new XMLSignatureException
+ ("algorithms.HMACOutputLengthOnlyForHMAC");
+ }
- try {
- this._signatureAlgorithm.update(buf, offset, len);
- } catch (SignatureException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
+ /** @inheritDoc */
+ protected void engineInitSign(
+ Key signingKey, AlgorithmParameterSpec algorithmParameterSpec)
+ throws XMLSignatureException {
+ throw new XMLSignatureException(
+ "algorithms.CannotUseAlgorithmParameterSpecOnRSA");
+ }
- /** @inheritDoc */
- protected String engineGetJCEAlgorithmString() {
- return this._signatureAlgorithm.getAlgorithm();
- }
+ /**
+ * Class SignatureRSASHA1
+ *
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
+ */
+ public static class SignatureRSASHA1 extends SignatureBaseRSA {
- /** @inheritDoc */
- protected String engineGetJCEProviderName() {
- return this._signatureAlgorithm.getProvider().getName();
- }
+ /**
+ * Constructor SignatureRSASHA1
+ *
+ * @throws XMLSignatureException
+ */
+ public SignatureRSASHA1() throws XMLSignatureException {
+ super();
+ }
- /** @inheritDoc */
- protected void engineSetHMACOutputLength(int HMACOutputLength)
- throws XMLSignatureException {
- throw new XMLSignatureException("algorithms.HMACOutputLengthOnlyForHMAC");
- }
+ /** @inheritDoc */
+ public String engineGetURI() {
+ return XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1;
+ }
+ }
- /** @inheritDoc */
- protected void engineInitSign(
- Key signingKey, AlgorithmParameterSpec algorithmParameterSpec)
- throws XMLSignatureException {
- throw new XMLSignatureException(
- "algorithms.CannotUseAlgorithmParameterSpecOnRSA");
- }
+ /**
+ * Class SignatureRSASHA256
+ *
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
+ */
+ public static class SignatureRSASHA256 extends SignatureBaseRSA {
- /**
- * Class SignatureRSASHA1
- *
- * @author $Author: raul $
- */
- public static class SignatureRSASHA1 extends SignatureBaseRSA {
+ /**
+ * Constructor SignatureRSASHA256
+ *
+ * @throws XMLSignatureException
+ */
+ public SignatureRSASHA256() throws XMLSignatureException {
+ super();
+ }
- /**
- * Constructor SignatureRSASHA1
- *
- * @throws XMLSignatureException
- */
- public SignatureRSASHA1() throws XMLSignatureException {
- super();
- }
+ /** @inheritDoc */
+ public String engineGetURI() {
+ return XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA256;
+ }
+ }
- /** @inheritDoc */
- public String engineGetURI() {
- return XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1;
- }
- }
+ /**
+ * Class SignatureRSASHA384
+ *
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
+ */
+ public static class SignatureRSASHA384 extends SignatureBaseRSA {
- /**
- * Class SignatureRSASHA256
- *
- * @author $Author: raul $
- */
- public static class SignatureRSASHA256 extends SignatureBaseRSA {
+ /**
+ * Constructor SignatureRSASHA384
+ *
+ * @throws XMLSignatureException
+ */
+ public SignatureRSASHA384() throws XMLSignatureException {
+ super();
+ }
- /**
- * Constructor SignatureRSASHA256
- *
- * @throws XMLSignatureException
- */
- public SignatureRSASHA256() throws XMLSignatureException {
- super();
- }
+ /** @inheritDoc */
+ public String engineGetURI() {
+ return XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA384;
+ }
+ }
- /** @inheritDoc */
- public String engineGetURI() {
- return XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA256;
- }
- }
+ /**
+ * Class SignatureRSASHA512
+ *
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
+ */
+ public static class SignatureRSASHA512 extends SignatureBaseRSA {
- /**
- * Class SignatureRSASHA384
- *
- * @author $Author: raul $
- */
- public static class SignatureRSASHA384 extends SignatureBaseRSA {
+ /**
+ * Constructor SignatureRSASHA512
+ *
+ * @throws XMLSignatureException
+ */
+ public SignatureRSASHA512() throws XMLSignatureException {
+ super();
+ }
- /**
- * Constructor SignatureRSASHA384
- *
- * @throws XMLSignatureException
- */
- public SignatureRSASHA384() throws XMLSignatureException {
- super();
- }
+ /** @inheritDoc */
+ public String engineGetURI() {
+ return XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA512;
+ }
+ }
- /** @inheritDoc */
- public String engineGetURI() {
- return XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA384;
- }
- }
+ /**
+ * Class SignatureRSARIPEMD160
+ *
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
+ */
+ public static class SignatureRSARIPEMD160 extends SignatureBaseRSA {
- /**
- * Class SignatureRSASHA512
- *
- * @author $Author: raul $
- */
- public static class SignatureRSASHA512 extends SignatureBaseRSA {
+ /**
+ * Constructor SignatureRSARIPEMD160
+ *
+ * @throws XMLSignatureException
+ */
+ public SignatureRSARIPEMD160() throws XMLSignatureException {
+ super();
+ }
- /**
- * Constructor SignatureRSASHA512
- *
- * @throws XMLSignatureException
- */
- public SignatureRSASHA512() throws XMLSignatureException {
- super();
- }
+ /** @inheritDoc */
+ public String engineGetURI() {
+ return XMLSignature.ALGO_ID_SIGNATURE_RSA_RIPEMD160;
+ }
+ }
- /** @inheritDoc */
- public String engineGetURI() {
- return XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA512;
- }
- }
+ /**
+ * Class SignatureRSAMD5
+ *
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
+ */
+ public static class SignatureRSAMD5 extends SignatureBaseRSA {
- /**
- * Class SignatureRSARIPEMD160
- *
- * @author $Author: raul $
- */
- public static class SignatureRSARIPEMD160 extends SignatureBaseRSA {
+ /**
+ * Constructor SignatureRSAMD5
+ *
+ * @throws XMLSignatureException
+ */
+ public SignatureRSAMD5() throws XMLSignatureException {
+ super();
+ }
- /**
- * Constructor SignatureRSARIPEMD160
- *
- * @throws XMLSignatureException
- */
- public SignatureRSARIPEMD160() throws XMLSignatureException {
- super();
- }
-
- /** @inheritDoc */
- public String engineGetURI() {
- return XMLSignature.ALGO_ID_SIGNATURE_RSA_RIPEMD160;
- }
- }
-
- /**
- * Class SignatureRSAMD5
- *
- * @author $Author: raul $
- */
- public static class SignatureRSAMD5 extends SignatureBaseRSA {
-
- /**
- * Constructor SignatureRSAMD5
- *
- * @throws XMLSignatureException
- */
- public SignatureRSAMD5() throws XMLSignatureException {
- super();
- }
-
- /** @inheritDoc */
- public String engineGetURI() {
- return XMLSignature.ALGO_ID_SIGNATURE_NOT_RECOMMENDED_RSA_MD5;
- }
- }
+ /** @inheritDoc */
+ public String engineGetURI() {
+ return XMLSignature.ALGO_ID_SIGNATURE_NOT_RECOMMENDED_RSA_MD5;
+ }
+ }
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureDSA.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureDSA.java
index 355579b7e53..615aa436e46 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureDSA.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureDSA.java
@@ -20,8 +20,6 @@
*/
package com.sun.org.apache.xml.internal.security.algorithms.implementations;
-
-
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
@@ -39,342 +37,359 @@ import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import com.sun.org.apache.xml.internal.security.utils.Constants;
-
/**
*
- * @author $Author: vishal $
+ * @author $Author: mullan $
*/
public class SignatureDSA extends SignatureAlgorithmSpi {
- /** {@link java.util.logging} logging facility */
+ /** {@link java.util.logging} logging facility */
static java.util.logging.Logger log =
java.util.logging.Logger.getLogger(SignatureDSA.class.getName());
- /** Field _URI */
- public static final String _URI = Constants.SignatureSpecNS + "dsa-sha1";
+ /** Field _URI */
+ public static final String _URI = Constants.SignatureSpecNS + "dsa-sha1";
- /** Field algorithm */
- private java.security.Signature _signatureAlgorithm = null;
+ /** Field algorithm */
+ private java.security.Signature _signatureAlgorithm = null;
- /**
- * Method engineGetURI
- *
- * @inheritDoc
- */
- protected String engineGetURI() {
- return SignatureDSA._URI;
- }
+ /**
+ * Method engineGetURI
+ *
+ * @inheritDoc
+ */
+ protected String engineGetURI() {
+ return SignatureDSA._URI;
+ }
- /**
- * Constructor SignatureDSA
- *
- * @throws XMLSignatureException
- */
- public SignatureDSA() throws XMLSignatureException {
+ /**
+ * Constructor SignatureDSA
+ *
+ * @throws XMLSignatureException
+ */
+ public SignatureDSA() throws XMLSignatureException {
- String algorithmID = JCEMapper.translateURItoJCEID(SignatureDSA._URI);
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Created SignatureDSA using " + algorithmID);
+ String algorithmID = JCEMapper.translateURItoJCEID(SignatureDSA._URI);
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Created SignatureDSA using " + algorithmID);
- try {
- this._signatureAlgorithm = Signature.getInstance(algorithmID);
- } catch (java.security.NoSuchAlgorithmException ex) {
- Object[] exArgs = { algorithmID,
- ex.getLocalizedMessage() };
+ String provider = JCEMapper.getProviderId();
+ try {
+ if (provider == null) {
+ this._signatureAlgorithm = Signature.getInstance(algorithmID);
+ } else {
+ this._signatureAlgorithm =
+ Signature.getInstance(algorithmID, provider);
+ }
+ } catch (java.security.NoSuchAlgorithmException ex) {
+ Object[] exArgs = { algorithmID, ex.getLocalizedMessage() };
+ throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
+ } catch (java.security.NoSuchProviderException ex) {
+ Object[] exArgs = { algorithmID, ex.getLocalizedMessage() };
+ throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
+ }
+ }
- throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
- }
- }
+ /**
+ * @inheritDoc
+ */
+ protected void engineSetParameter(AlgorithmParameterSpec params)
+ throws XMLSignatureException {
- /**
- * @inheritDoc
- */
- protected void engineSetParameter(AlgorithmParameterSpec params)
+ try {
+ this._signatureAlgorithm.setParameter(params);
+ } catch (InvalidAlgorithmParameterException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
+
+ /**
+ * @inheritDoc
+ */
+ protected boolean engineVerify(byte[] signature)
throws XMLSignatureException {
- try {
- this._signatureAlgorithm.setParameter(params);
- } catch (InvalidAlgorithmParameterException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
+ try {
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Called DSA.verify() on " + Base64.encode(signature));
- /**
- * @inheritDoc
- */
- protected boolean engineVerify(byte[] signature)
+ byte[] jcebytes = SignatureDSA.convertXMLDSIGtoASN1(signature);
+
+ return this._signatureAlgorithm.verify(jcebytes);
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ } catch (IOException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
+
+ /**
+ * @inheritDoc
+ */
+ protected void engineInitVerify(Key publicKey) throws XMLSignatureException {
+
+ if (!(publicKey instanceof PublicKey)) {
+ String supplied = publicKey.getClass().getName();
+ String needed = PublicKey.class.getName();
+ Object exArgs[] = { supplied, needed };
+
+ throw new XMLSignatureException
+ ("algorithms.WrongKeyForThisOperation", exArgs);
+ }
+
+ try {
+ this._signatureAlgorithm.initVerify((PublicKey) publicKey);
+ } catch (InvalidKeyException ex) {
+ // reinstantiate Signature object to work around bug in JDK
+ // see: http://bugs.sun.com/view_bug.do?bug_id=4953555
+ Signature sig = this._signatureAlgorithm;
+ try {
+ this._signatureAlgorithm = Signature.getInstance
+ (_signatureAlgorithm.getAlgorithm());
+ } catch (Exception e) {
+ // this shouldn't occur, but if it does, restore previous
+ // Signature
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "Exception when reinstantiating Signature:" + e);
+ }
+ this._signatureAlgorithm = sig;
+ }
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
+
+ /**
+ * @inheritDoc
+ */
+ protected byte[] engineSign() throws XMLSignatureException {
+
+ try {
+ byte jcebytes[] = this._signatureAlgorithm.sign();
+
+ return SignatureDSA.convertASN1toXMLDSIG(jcebytes);
+ } catch (IOException ex) {
+ throw new XMLSignatureException("empty", ex);
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
+
+ /**
+ * @inheritDoc
+ */
+ protected void engineInitSign(Key privateKey, SecureRandom secureRandom)
throws XMLSignatureException {
- try {
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Called DSA.verify() on " + Base64.encode(signature));
+ if (!(privateKey instanceof PrivateKey)) {
+ String supplied = privateKey.getClass().getName();
+ String needed = PrivateKey.class.getName();
+ Object exArgs[] = { supplied, needed };
- byte[] jcebytes = SignatureDSA.convertXMLDSIGtoASN1(signature);
+ throw new XMLSignatureException
+ ("algorithms.WrongKeyForThisOperation", exArgs);
+ }
- return this._signatureAlgorithm.verify(jcebytes);
- } catch (SignatureException ex) {
- throw new XMLSignatureException("empty", ex);
- } catch (IOException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
-
- /**
- * @inheritDoc
- */
- protected void engineInitVerify(Key publicKey) throws XMLSignatureException {
-
- if (!(publicKey instanceof PublicKey)) {
- String supplied = publicKey.getClass().getName();
- String needed = PublicKey.class.getName();
- Object exArgs[] = { supplied, needed };
-
- throw new XMLSignatureException("algorithms.WrongKeyForThisOperation",
- exArgs);
- }
-
- try {
- this._signatureAlgorithm.initVerify((PublicKey) publicKey);
- } catch (InvalidKeyException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
-
- /**
- * @inheritDoc
- */
- protected byte[] engineSign() throws XMLSignatureException {
-
- try {
- byte jcebytes[] = this._signatureAlgorithm.sign();
-
- return SignatureDSA.convertASN1toXMLDSIG(jcebytes);
- } catch (IOException ex) {
- throw new XMLSignatureException("empty", ex);
- } catch (SignatureException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
-
- /**
- * @inheritDoc
- */
- protected void engineInitSign(Key privateKey, SecureRandom secureRandom)
- throws XMLSignatureException {
-
- if (!(privateKey instanceof PrivateKey)) {
- String supplied = privateKey.getClass().getName();
- String needed = PrivateKey.class.getName();
- Object exArgs[] = { supplied, needed };
-
- throw new XMLSignatureException("algorithms.WrongKeyForThisOperation",
- exArgs);
- }
-
- try {
- this._signatureAlgorithm.initSign((PrivateKey) privateKey,
+ try {
+ this._signatureAlgorithm.initSign((PrivateKey) privateKey,
secureRandom);
- } catch (InvalidKeyException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
+ } catch (InvalidKeyException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
- /**
- * @inheritDoc
- */
- protected void engineInitSign(Key privateKey) throws XMLSignatureException {
+ /**
+ * @inheritDoc
+ */
+ protected void engineInitSign(Key privateKey) throws XMLSignatureException {
- if (!(privateKey instanceof PrivateKey)) {
- String supplied = privateKey.getClass().getName();
- String needed = PrivateKey.class.getName();
- Object exArgs[] = { supplied, needed };
+ if (!(privateKey instanceof PrivateKey)) {
+ String supplied = privateKey.getClass().getName();
+ String needed = PrivateKey.class.getName();
+ Object exArgs[] = { supplied, needed };
- throw new XMLSignatureException("algorithms.WrongKeyForThisOperation",
- exArgs);
- }
+ throw new XMLSignatureException
+ ("algorithms.WrongKeyForThisOperation", exArgs);
+ }
- try {
- this._signatureAlgorithm.initSign((PrivateKey) privateKey);
- } catch (InvalidKeyException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
+ try {
+ this._signatureAlgorithm.initSign((PrivateKey) privateKey);
+ } catch (InvalidKeyException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
- /**
- * @inheritDoc
- */
- protected void engineUpdate(byte[] input) throws XMLSignatureException {
+ /**
+ * @inheritDoc
+ */
+ protected void engineUpdate(byte[] input) throws XMLSignatureException {
+ try {
+ this._signatureAlgorithm.update(input);
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
- try {
- this._signatureAlgorithm.update(input);
- } catch (SignatureException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
+ /**
+ * @inheritDoc
+ */
+ protected void engineUpdate(byte input) throws XMLSignatureException {
+ try {
+ this._signatureAlgorithm.update(input);
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
- /**
- * @inheritDoc
- */
- protected void engineUpdate(byte input) throws XMLSignatureException {
+ /**
+ * @inheritDoc
+ */
+ protected void engineUpdate(byte buf[], int offset, int len)
+ throws XMLSignatureException {
+ try {
+ this._signatureAlgorithm.update(buf, offset, len);
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
- try {
- this._signatureAlgorithm.update(input);
- } catch (SignatureException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
+ /**
+ * Method engineGetJCEAlgorithmString
+ *
+ * @inheritDoc
+ */
+ protected String engineGetJCEAlgorithmString() {
+ return this._signatureAlgorithm.getAlgorithm();
+ }
- /**
- * @inheritDoc
- */
- protected void engineUpdate(byte buf[], int offset, int len)
- throws XMLSignatureException {
+ /**
+ * Method engineGetJCEProviderName
+ *
+ * @inheritDoc
+ */
+ protected String engineGetJCEProviderName() {
+ return this._signatureAlgorithm.getProvider().getName();
+ }
- try {
- this._signatureAlgorithm.update(buf, offset, len);
- } catch (SignatureException ex) {
- throw new XMLSignatureException("empty", ex);
- }
- }
-
- /**
- * Method engineGetJCEAlgorithmString
- *
- * @inheritDoc
- */
- protected String engineGetJCEAlgorithmString() {
- return this._signatureAlgorithm.getAlgorithm();
- }
-
- /**
- * Method engineGetJCEProviderName
- *
- * @inheritDoc
- */
- protected String engineGetJCEProviderName() {
- return this._signatureAlgorithm.getProvider().getName();
- }
-
-
- /**
- * Converts an ASN.1 DSA value to a XML Signature DSA Value.
- *
- * The JAVA JCE DSA Signature algorithm creates ASN.1 encoded (r,s) value
- * pairs; the XML Signature requires the core BigInteger values.
- *
- * @param asn1Bytes
- * @return the decode bytes
- *
- * @throws IOException
- * @see 6.4.1 DSA
- */
- private static byte[] convertASN1toXMLDSIG(byte asn1Bytes[])
+ /**
+ * Converts an ASN.1 DSA value to a XML Signature DSA Value.
+ *
+ * The JAVA JCE DSA Signature algorithm creates ASN.1 encoded (r,s) value
+ * pairs; the XML Signature requires the core BigInteger values.
+ *
+ * @param asn1Bytes
+ * @return the decode bytes
+ *
+ * @throws IOException
+ * @see 6.4.1 DSA
+ */
+ private static byte[] convertASN1toXMLDSIG(byte asn1Bytes[])
throws IOException {
- byte rLength = asn1Bytes[3];
- int i;
+ byte rLength = asn1Bytes[3];
+ int i;
- for (i = rLength; (i > 0) && (asn1Bytes[(4 + rLength) - i] == 0); i--);
+ for (i = rLength; (i > 0) && (asn1Bytes[(4 + rLength) - i] == 0); i--);
- byte sLength = asn1Bytes[5 + rLength];
- int j;
+ byte sLength = asn1Bytes[5 + rLength];
+ int j;
- for (j = sLength;
+ for (j = sLength;
(j > 0) && (asn1Bytes[(6 + rLength + sLength) - j] == 0); j--);
- if ((asn1Bytes[0] != 48) || (asn1Bytes[1] != asn1Bytes.length - 2)
+ if ((asn1Bytes[0] != 48) || (asn1Bytes[1] != asn1Bytes.length - 2)
|| (asn1Bytes[2] != 2) || (i > 20)
|| (asn1Bytes[4 + rLength] != 2) || (j > 20)) {
- throw new IOException("Invalid ASN.1 format of DSA signature");
- }
- byte xmldsigBytes[] = new byte[40];
+ throw new IOException("Invalid ASN.1 format of DSA signature");
+ }
+ byte xmldsigBytes[] = new byte[40];
- System.arraycopy(asn1Bytes, (4 + rLength) - i, xmldsigBytes, 20 - i,
+ System.arraycopy(asn1Bytes, (4 + rLength) - i, xmldsigBytes, 20 - i,
i);
- System.arraycopy(asn1Bytes, (6 + rLength + sLength) - j, xmldsigBytes,
+ System.arraycopy(asn1Bytes, (6 + rLength + sLength) - j, xmldsigBytes,
40 - j, j);
- return xmldsigBytes;
- }
+ return xmldsigBytes;
+ }
- /**
- * Converts a XML Signature DSA Value to an ASN.1 DSA value.
- *
- * The JAVA JCE DSA Signature algorithm creates ASN.1 encoded (r,s) value
- * pairs; the XML Signature requires the core BigInteger values.
- *
- * @param xmldsigBytes
- * @return the encoded ASN.1 bytes
- *
- * @throws IOException
- * @see 6.4.1 DSA
- */
- private static byte[] convertXMLDSIGtoASN1(byte xmldsigBytes[])
+ /**
+ * Converts a XML Signature DSA Value to an ASN.1 DSA value.
+ *
+ * The JAVA JCE DSA Signature algorithm creates ASN.1 encoded (r,s) value
+ * pairs; the XML Signature requires the core BigInteger values.
+ *
+ * @param xmldsigBytes
+ * @return the encoded ASN.1 bytes
+ *
+ * @throws IOException
+ * @see 6.4.1 DSA
+ */
+ private static byte[] convertXMLDSIGtoASN1(byte xmldsigBytes[])
throws IOException {
- if (xmldsigBytes.length != 40) {
- throw new IOException("Invalid XMLDSIG format of DSA signature");
- }
+ if (xmldsigBytes.length != 40) {
+ throw new IOException("Invalid XMLDSIG format of DSA signature");
+ }
- int i;
+ int i;
- for (i = 20; (i > 0) && (xmldsigBytes[20 - i] == 0); i--);
+ for (i = 20; (i > 0) && (xmldsigBytes[20 - i] == 0); i--);
- int j = i;
+ int j = i;
- if (xmldsigBytes[20 - i] < 0) {
+ if (xmldsigBytes[20 - i] < 0) {
j += 1;
- }
+ }
- int k;
+ int k;
- for (k = 20; (k > 0) && (xmldsigBytes[40 - k] == 0); k--);
+ for (k = 20; (k > 0) && (xmldsigBytes[40 - k] == 0); k--);
- int l = k;
+ int l = k;
- if (xmldsigBytes[40 - k] < 0) {
- l += 1;
- }
+ if (xmldsigBytes[40 - k] < 0) {
+ l += 1;
+ }
- byte asn1Bytes[] = new byte[6 + j + l];
+ byte asn1Bytes[] = new byte[6 + j + l];
- asn1Bytes[0] = 48;
- asn1Bytes[1] = (byte) (4 + j + l);
- asn1Bytes[2] = 2;
- asn1Bytes[3] = (byte) j;
+ asn1Bytes[0] = 48;
+ asn1Bytes[1] = (byte) (4 + j + l);
+ asn1Bytes[2] = 2;
+ asn1Bytes[3] = (byte) j;
- System.arraycopy(xmldsigBytes, 20 - i, asn1Bytes, (4 + j) - i, i);
+ System.arraycopy(xmldsigBytes, 20 - i, asn1Bytes, (4 + j) - i, i);
- asn1Bytes[4 + j] = 2;
- asn1Bytes[5 + j] = (byte) l;
+ asn1Bytes[4 + j] = 2;
+ asn1Bytes[5 + j] = (byte) l;
- System.arraycopy(xmldsigBytes, 40 - k, asn1Bytes, (6 + j + l) - k, k);
+ System.arraycopy(xmldsigBytes, 40 - k, asn1Bytes, (6 + j + l) - k, k);
- return asn1Bytes;
- }
+ return asn1Bytes;
+ }
- /**
- * Method engineSetHMACOutputLength
- *
- * @param HMACOutputLength
- * @throws XMLSignatureException
- */
- protected void engineSetHMACOutputLength(int HMACOutputLength)
- throws XMLSignatureException {
- throw new XMLSignatureException("algorithms.HMACOutputLengthOnlyForHMAC");
- }
+ /**
+ * Method engineSetHMACOutputLength
+ *
+ * @param HMACOutputLength
+ * @throws XMLSignatureException
+ */
+ protected void engineSetHMACOutputLength(int HMACOutputLength)
+ throws XMLSignatureException {
+ throw new XMLSignatureException(
+ "algorithms.HMACOutputLengthOnlyForHMAC");
+ }
- /**
- * Method engineInitSign
- *
- * @param signingKey
- * @param algorithmParameterSpec
- * @throws XMLSignatureException
- */
- protected void engineInitSign(
- Key signingKey, AlgorithmParameterSpec algorithmParameterSpec)
- throws XMLSignatureException {
- throw new XMLSignatureException(
- "algorithms.CannotUseAlgorithmParameterSpecOnDSA");
- }
+ /**
+ * Method engineInitSign
+ *
+ * @param signingKey
+ * @param algorithmParameterSpec
+ * @throws XMLSignatureException
+ */
+ protected void engineInitSign(
+ Key signingKey, AlgorithmParameterSpec algorithmParameterSpec)
+ throws XMLSignatureException {
+ throw new XMLSignatureException(
+ "algorithms.CannotUseAlgorithmParameterSpecOnDSA");
+ }
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureECDSA.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureECDSA.java
new file mode 100644
index 00000000000..18fdffe28fb
--- /dev/null
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/algorithms/implementations/SignatureECDSA.java
@@ -0,0 +1,384 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package com.sun.org.apache.xml.internal.security.algorithms.implementations;
+
+
+
+import java.io.IOException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.NoSuchProviderException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.SecureRandom;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.spec.AlgorithmParameterSpec;
+
+import com.sun.org.apache.xml.internal.security.algorithms.JCEMapper;
+import com.sun.org.apache.xml.internal.security.algorithms.SignatureAlgorithmSpi;
+import com.sun.org.apache.xml.internal.security.signature.XMLSignature;
+import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
+import com.sun.org.apache.xml.internal.security.utils.Base64;
+
+
+/**
+ *
+ * @author $Author: mullan $
+ */
+public abstract class SignatureECDSA extends SignatureAlgorithmSpi {
+
+ /** {@link java.util.logging} logging facility */
+ static java.util.logging.Logger log =
+ java.util.logging.Logger.getLogger(SignatureECDSA.class.getName());
+
+ /** @inheritDoc */
+ public abstract String engineGetURI();
+
+ /** Field algorithm */
+ private java.security.Signature _signatureAlgorithm = null;
+
+ /**
+ * Converts an ASN.1 ECDSA value to a XML Signature ECDSA Value.
+ *
+ * The JAVA JCE ECDSA Signature algorithm creates ASN.1 encoded (r,s) value
+ * pairs; the XML Signature requires the core BigInteger values.
+ *
+ * @param asn1Bytes
+ * @return the decode bytes
+ *
+ * @throws IOException
+ * @see 6.4.1 DSA
+ * @see 3.3. ECDSA Signatures
+ */
+ private static byte[] convertASN1toXMLDSIG(byte asn1Bytes[])
+ throws IOException {
+
+ byte rLength = asn1Bytes[3];
+ int i;
+
+ for (i = rLength; (i > 0) && (asn1Bytes[(4 + rLength) - i] == 0); i--);
+
+ byte sLength = asn1Bytes[5 + rLength];
+ int j;
+
+ for (j = sLength;
+ (j > 0) && (asn1Bytes[(6 + rLength + sLength) - j] == 0); j--);
+
+ if ((asn1Bytes[0] != 48) || (asn1Bytes[1] != asn1Bytes.length - 2)
+ || (asn1Bytes[2] != 2) || (i > 24)
+ || (asn1Bytes[4 + rLength] != 2) || (j > 24)) {
+ throw new IOException("Invalid ASN.1 format of ECDSA signature");
+ }
+ byte xmldsigBytes[] = new byte[48];
+
+ System.arraycopy(asn1Bytes, (4 + rLength) - i, xmldsigBytes, 24 - i,
+ i);
+ System.arraycopy(asn1Bytes, (6 + rLength + sLength) - j, xmldsigBytes,
+ 48 - j, j);
+
+ return xmldsigBytes;
+ }
+
+ /**
+ * Converts a XML Signature ECDSA Value to an ASN.1 DSA value.
+ *
+ * The JAVA JCE ECDSA Signature algorithm creates ASN.1 encoded (r,s) value
+ * pairs; the XML Signature requires the core BigInteger values.
+ *
+ * @param xmldsigBytes
+ * @return the encoded ASN.1 bytes
+ *
+ * @throws IOException
+ * @see 6.4.1 DSA
+ * @see 3.3. ECDSA Signatures
+ */
+ private static byte[] convertXMLDSIGtoASN1(byte xmldsigBytes[])
+ throws IOException {
+
+ if (xmldsigBytes.length != 48) {
+ throw new IOException("Invalid XMLDSIG format of ECDSA signature");
+ }
+
+ int i;
+
+ for (i = 24; (i > 0) && (xmldsigBytes[24 - i] == 0); i--);
+
+ int j = i;
+
+ if (xmldsigBytes[24 - i] < 0) {
+ j += 1;
+ }
+
+ int k;
+
+ for (k = 24; (k > 0) && (xmldsigBytes[48 - k] == 0); k--);
+
+ int l = k;
+
+ if (xmldsigBytes[48 - k] < 0) {
+ l += 1;
+ }
+
+ byte asn1Bytes[] = new byte[6 + j + l];
+
+ asn1Bytes[0] = 48;
+ asn1Bytes[1] = (byte) (4 + j + l);
+ asn1Bytes[2] = 2;
+ asn1Bytes[3] = (byte) j;
+
+ System.arraycopy(xmldsigBytes, 24 - i, asn1Bytes, (4 + j) - i, i);
+
+ asn1Bytes[4 + j] = 2;
+ asn1Bytes[5 + j] = (byte) l;
+
+ System.arraycopy(xmldsigBytes, 48 - k, asn1Bytes, (6 + j + l) - k, k);
+
+ return asn1Bytes;
+ }
+
+ /**
+ * Constructor SignatureRSA
+ *
+ * @throws XMLSignatureException
+ */
+ public SignatureECDSA() throws XMLSignatureException {
+
+ String algorithmID = JCEMapper.translateURItoJCEID(this.engineGetURI());
+
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Created SignatureECDSA using " + algorithmID);
+ String provider=JCEMapper.getProviderId();
+ try {
+ if (provider==null) {
+ this._signatureAlgorithm = Signature.getInstance(algorithmID);
+ } else {
+ this._signatureAlgorithm = Signature.getInstance(algorithmID,provider);
+ }
+ } catch (java.security.NoSuchAlgorithmException ex) {
+ Object[] exArgs = { algorithmID,
+ ex.getLocalizedMessage() };
+
+ throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
+ } catch (NoSuchProviderException ex) {
+ Object[] exArgs = { algorithmID,
+ ex.getLocalizedMessage() };
+
+ throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
+ }
+ }
+
+ /** @inheritDoc */
+ protected void engineSetParameter(AlgorithmParameterSpec params)
+ throws XMLSignatureException {
+
+ try {
+ this._signatureAlgorithm.setParameter(params);
+ } catch (InvalidAlgorithmParameterException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
+
+ /** @inheritDoc */
+ protected boolean engineVerify(byte[] signature)
+ throws XMLSignatureException {
+
+ try {
+ byte[] jcebytes = SignatureECDSA.convertXMLDSIGtoASN1(signature);
+
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Called ECDSA.verify() on " + Base64.encode(signature));
+
+ return this._signatureAlgorithm.verify(jcebytes);
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ } catch (IOException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
+
+ /** @inheritDoc */
+ protected void engineInitVerify(Key publicKey) throws XMLSignatureException {
+
+ if (!(publicKey instanceof PublicKey)) {
+ String supplied = publicKey.getClass().getName();
+ String needed = PublicKey.class.getName();
+ Object exArgs[] = { supplied, needed };
+
+ throw new XMLSignatureException("algorithms.WrongKeyForThisOperation",
+ exArgs);
+ }
+
+ try {
+ this._signatureAlgorithm.initVerify((PublicKey) publicKey);
+ } catch (InvalidKeyException ex) {
+ // reinstantiate Signature object to work around bug in JDK
+ // see: http://bugs.sun.com/view_bug.do?bug_id=4953555
+ Signature sig = this._signatureAlgorithm;
+ try {
+ this._signatureAlgorithm = Signature.getInstance
+ (_signatureAlgorithm.getAlgorithm());
+ } catch (Exception e) {
+ // this shouldn't occur, but if it does, restore previous
+ // Signature
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "Exception when reinstantiating Signature:" + e);
+ }
+ this._signatureAlgorithm = sig;
+ }
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
+
+ /** @inheritDoc */
+ protected byte[] engineSign() throws XMLSignatureException {
+
+ try {
+ byte jcebytes[] = this._signatureAlgorithm.sign();
+
+ return SignatureECDSA.convertASN1toXMLDSIG(jcebytes);
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ } catch (IOException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
+
+ /** @inheritDoc */
+ protected void engineInitSign(Key privateKey, SecureRandom secureRandom)
+ throws XMLSignatureException {
+
+ if (!(privateKey instanceof PrivateKey)) {
+ String supplied = privateKey.getClass().getName();
+ String needed = PrivateKey.class.getName();
+ Object exArgs[] = { supplied, needed };
+
+ throw new XMLSignatureException("algorithms.WrongKeyForThisOperation",
+ exArgs);
+ }
+
+ try {
+ this._signatureAlgorithm.initSign((PrivateKey) privateKey,
+ secureRandom);
+ } catch (InvalidKeyException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
+
+ /** @inheritDoc */
+ protected void engineInitSign(Key privateKey) throws XMLSignatureException {
+
+ if (!(privateKey instanceof PrivateKey)) {
+ String supplied = privateKey.getClass().getName();
+ String needed = PrivateKey.class.getName();
+ Object exArgs[] = { supplied, needed };
+
+ throw new XMLSignatureException("algorithms.WrongKeyForThisOperation",
+ exArgs);
+ }
+
+ try {
+ this._signatureAlgorithm.initSign((PrivateKey) privateKey);
+ } catch (InvalidKeyException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
+
+ /** @inheritDoc */
+ protected void engineUpdate(byte[] input) throws XMLSignatureException {
+
+ try {
+ this._signatureAlgorithm.update(input);
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
+
+ /** @inheritDoc */
+ protected void engineUpdate(byte input) throws XMLSignatureException {
+
+ try {
+ this._signatureAlgorithm.update(input);
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
+
+ /** @inheritDoc */
+ protected void engineUpdate(byte buf[], int offset, int len)
+ throws XMLSignatureException {
+
+ try {
+ this._signatureAlgorithm.update(buf, offset, len);
+ } catch (SignatureException ex) {
+ throw new XMLSignatureException("empty", ex);
+ }
+ }
+
+ /** @inheritDoc */
+ protected String engineGetJCEAlgorithmString() {
+ return this._signatureAlgorithm.getAlgorithm();
+ }
+
+ /** @inheritDoc */
+ protected String engineGetJCEProviderName() {
+ return this._signatureAlgorithm.getProvider().getName();
+ }
+
+ /** @inheritDoc */
+ protected void engineSetHMACOutputLength(int HMACOutputLength)
+ throws XMLSignatureException {
+ throw new XMLSignatureException("algorithms.HMACOutputLengthOnlyForHMAC");
+ }
+
+ /** @inheritDoc */
+ protected void engineInitSign(
+ Key signingKey, AlgorithmParameterSpec algorithmParameterSpec)
+ throws XMLSignatureException {
+ throw new XMLSignatureException(
+ "algorithms.CannotUseAlgorithmParameterSpecOnRSA");
+ }
+
+ /**
+ * Class SignatureRSASHA1
+ *
+ * @author $Author: mullan $
+ * @version $Revision: 1.2 $
+ */
+ public static class SignatureECDSASHA1 extends SignatureECDSA {
+
+ /**
+ * Constructor SignatureRSASHA1
+ *
+ * @throws XMLSignatureException
+ */
+ public SignatureECDSASHA1() throws XMLSignatureException {
+ super();
+ }
+
+ /** @inheritDoc */
+ public String engineGetURI() {
+ return XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA1;
+ }
+ }
+
+}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/CanonicalizationException.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/CanonicalizationException.java
index 732334c3656..36c98cfe790 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/CanonicalizationException.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/CanonicalizationException.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java
index eb7cb6cad01..a4181233d60 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/Canonicalizer.java
@@ -3,7 +3,7 @@
* DO NOT REMOVE OR ALTER!
*/
/*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2008 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,8 +20,6 @@
*/
package com.sun.org.apache.xml.internal.security.c14n;
-
-
import java.io.ByteArrayInputStream;
import java.io.OutputStream;
import java.util.HashMap;
@@ -37,318 +35,326 @@ import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
-
/**
- *
*
* @author Christian Geuer-Pollmann
*/
public class Canonicalizer {
- //J-
- /** The output encoding of canonicalized data */
- public static final String ENCODING = "UTF8";
+ /** The output encoding of canonicalized data */
+ public static final String ENCODING = "UTF8";
-
- /**
- * XPath Expresion for selecting every node and continuos comments joined in only one node
+ /**
+ * XPath Expresion for selecting every node and continuous comments joined
+ * in only one node
*/
- public static final String XPATH_C14N_WITH_COMMENTS_SINGLE_NODE = "(.//. | .//@* | .//namespace::*)";
+ public static final String XPATH_C14N_WITH_COMMENTS_SINGLE_NODE =
+ "(.//. | .//@* | .//namespace::*)";
-
- /**
+ /**
* The URL defined in XML-SEC Rec for inclusive c14n without comments.
*/
- public static final String ALGO_ID_C14N_OMIT_COMMENTS = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
- /**
- * The URL defined in XML-SEC Rec for inclusive c14n with comments.
- */
- public static final String ALGO_ID_C14N_WITH_COMMENTS = ALGO_ID_C14N_OMIT_COMMENTS + "#WithComments";
- /**
- * The URL defined in XML-SEC Rec for exclusive c14n without comments.
- */
- public static final String ALGO_ID_C14N_EXCL_OMIT_COMMENTS = "http://www.w3.org/2001/10/xml-exc-c14n#";
- /**
- * The URL defined in XML-SEC Rec for exclusive c14n with comments.
- */
- public static final String ALGO_ID_C14N_EXCL_WITH_COMMENTS = ALGO_ID_C14N_EXCL_OMIT_COMMENTS + "WithComments";
+ public static final String ALGO_ID_C14N_OMIT_COMMENTS =
+ "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
+ /**
+ * The URL defined in XML-SEC Rec for inclusive c14n with comments.
+ */
+ public static final String ALGO_ID_C14N_WITH_COMMENTS =
+ ALGO_ID_C14N_OMIT_COMMENTS + "#WithComments";
+ /**
+ * The URL defined in XML-SEC Rec for exclusive c14n without comments.
+ */
+ public static final String ALGO_ID_C14N_EXCL_OMIT_COMMENTS =
+ "http://www.w3.org/2001/10/xml-exc-c14n#";
+ /**
+ * The URL defined in XML-SEC Rec for exclusive c14n with comments.
+ */
+ public static final String ALGO_ID_C14N_EXCL_WITH_COMMENTS =
+ ALGO_ID_C14N_EXCL_OMIT_COMMENTS + "WithComments";
+ /**
+ * The URI for inclusive c14n 1.1 without comments.
+ */
+ public static final String ALGO_ID_C14N11_OMIT_COMMENTS =
+ "http://www.w3.org/2006/12/xml-c14n11";
+ /**
+ * The URI for inclusive c14n 1.1 with comments.
+ */
+ public static final String ALGO_ID_C14N11_WITH_COMMENTS =
+ ALGO_ID_C14N11_OMIT_COMMENTS + "#WithComments";
- static boolean _alreadyInitialized = false;
- static Map _canonicalizerHash = null;
+ static boolean _alreadyInitialized = false;
+ static Map _canonicalizerHash = null;
- protected CanonicalizerSpi canonicalizerSpi = null;
- //J+
+ protected CanonicalizerSpi canonicalizerSpi = null;
- /**
- * Method init
- *
- */
- public static void init() {
+ /**
+ * Method init
+ *
+ */
+ public static void init() {
- if (!Canonicalizer._alreadyInitialized) {
- Canonicalizer._canonicalizerHash = new HashMap(10);
- Canonicalizer._alreadyInitialized = true;
- }
- }
+ if (!Canonicalizer._alreadyInitialized) {
+ Canonicalizer._canonicalizerHash = new HashMap(10);
+ Canonicalizer._alreadyInitialized = true;
+ }
+ }
- /**
- * Constructor Canonicalizer
- *
- * @param algorithmURI
- * @throws InvalidCanonicalizerException
- */
- private Canonicalizer(String algorithmURI)
+ /**
+ * Constructor Canonicalizer
+ *
+ * @param algorithmURI
+ * @throws InvalidCanonicalizerException
+ */
+ private Canonicalizer(String algorithmURI)
throws InvalidCanonicalizerException {
- try {
- Class implementingClass = getImplementingClass(algorithmURI);
+ try {
+ Class implementingClass = getImplementingClass(algorithmURI);
- this.canonicalizerSpi =
- (CanonicalizerSpi) implementingClass.newInstance();
- this.canonicalizerSpi.reset=true;
- } catch (Exception e) {
- Object exArgs[] = { algorithmURI };
+ this.canonicalizerSpi =
+ (CanonicalizerSpi) implementingClass.newInstance();
+ this.canonicalizerSpi.reset=true;
+ } catch (Exception e) {
+ Object exArgs[] = { algorithmURI };
- throw new InvalidCanonicalizerException(
- "signature.Canonicalizer.UnknownCanonicalizer", exArgs);
- }
- }
+ throw new InvalidCanonicalizerException(
+ "signature.Canonicalizer.UnknownCanonicalizer", exArgs);
+ }
+ }
- /**
- * Method getInstance
- *
- * @param algorithmURI
- * @return a Conicicalizer instance ready for the job
- * @throws InvalidCanonicalizerException
- */
- public static final Canonicalizer getInstance(String algorithmURI)
+ /**
+ * Method getInstance
+ *
+ * @param algorithmURI
+ * @return a Conicicalizer instance ready for the job
+ * @throws InvalidCanonicalizerException
+ */
+ public static final Canonicalizer getInstance(String algorithmURI)
throws InvalidCanonicalizerException {
- Canonicalizer c14nizer = new Canonicalizer(algorithmURI);
+ Canonicalizer c14nizer = new Canonicalizer(algorithmURI);
- return c14nizer;
- }
+ return c14nizer;
+ }
- /**
- * Method register
- *
- * @param algorithmURI
- * @param implementingClass
- * @throws AlgorithmAlreadyRegisteredException
- */
- public static void register(String algorithmURI, String implementingClass)
+ /**
+ * Method register
+ *
+ * @param algorithmURI
+ * @param implementingClass
+ * @throws AlgorithmAlreadyRegisteredException
+ */
+ public static void register(String algorithmURI, String implementingClass)
throws AlgorithmAlreadyRegisteredException {
- // check whether URI is already registered
- Class registeredClass = getImplementingClass(algorithmURI);
+ // check whether URI is already registered
+ Class registeredClass = getImplementingClass(algorithmURI);
- if (registeredClass != null) {
- Object exArgs[] = { algorithmURI, registeredClass };
+ if (registeredClass != null) {
+ Object exArgs[] = { algorithmURI, registeredClass };
- throw new AlgorithmAlreadyRegisteredException(
- "algorithm.alreadyRegistered", exArgs);
- }
-
- try {
- _canonicalizerHash.put(algorithmURI, Class.forName(implementingClass));
- } catch (ClassNotFoundException e) {
- throw new RuntimeException("c14n class not found");
+ throw new AlgorithmAlreadyRegisteredException(
+ "algorithm.alreadyRegistered", exArgs);
}
- }
- /**
- * Method getURI
- *
- * @return the URI defined for this c14n instance.
- */
- public final String getURI() {
- return this.canonicalizerSpi.engineGetURI();
- }
+ try {
+ _canonicalizerHash.put(algorithmURI, Class.forName(implementingClass));
+ } catch (ClassNotFoundException e) {
+ throw new RuntimeException("c14n class not found");
+ }
+ }
- /**
- * Method getIncludeComments
- *
- * @return true if the c14n respect the comments.
- */
- public boolean getIncludeComments() {
- return this.canonicalizerSpi.engineGetIncludeComments();
- }
+ /**
+ * Method getURI
+ *
+ * @return the URI defined for this c14n instance.
+ */
+ public final String getURI() {
+ return this.canonicalizerSpi.engineGetURI();
+ }
- /**
- * This method tries to canonicalize the given bytes. It's possible to even
- * canonicalize non-wellformed sequences if they are well-formed after being
- * wrapped with a >a<...>/a<
.
- *
- * @param inputBytes
- * @return the result of the conicalization.
- * @throws CanonicalizationException
- * @throws java.io.IOException
- * @throws javax.xml.parsers.ParserConfigurationException
- * @throws org.xml.sax.SAXException
- */
- public byte[] canonicalize(byte[] inputBytes)
+ /**
+ * Method getIncludeComments
+ *
+ * @return true if the c14n respect the comments.
+ */
+ public boolean getIncludeComments() {
+ return this.canonicalizerSpi.engineGetIncludeComments();
+ }
+
+ /**
+ * This method tries to canonicalize the given bytes. It's possible to even
+ * canonicalize non-wellformed sequences if they are well-formed after being
+ * wrapped with a >a<...>/a<
.
+ *
+ * @param inputBytes
+ * @return the result of the conicalization.
+ * @throws CanonicalizationException
+ * @throws java.io.IOException
+ * @throws javax.xml.parsers.ParserConfigurationException
+ * @throws org.xml.sax.SAXException
+ */
+ public byte[] canonicalize(byte[] inputBytes)
throws javax.xml.parsers.ParserConfigurationException,
java.io.IOException, org.xml.sax.SAXException,
CanonicalizationException {
- ByteArrayInputStream bais = new ByteArrayInputStream(inputBytes);
- InputSource in = new InputSource(bais);
- DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
+ ByteArrayInputStream bais = new ByteArrayInputStream(inputBytes);
+ InputSource in = new InputSource(bais);
+ DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
- dfactory.setNamespaceAware(true);
+ dfactory.setNamespaceAware(true);
- // needs to validate for ID attribute nomalization
- dfactory.setValidating(true);
+ // needs to validate for ID attribute nomalization
+ dfactory.setValidating(true);
- DocumentBuilder db = dfactory.newDocumentBuilder();
+ DocumentBuilder db = dfactory.newDocumentBuilder();
- /*
- * for some of the test vectors from the specification,
- * there has to be a validatin parser for ID attributes, default
- * attribute values, NMTOKENS, etc.
- * Unfortunaltely, the test vectors do use different DTDs or
- * even no DTD. So Xerces 1.3.1 fires many warnings about using
- * ErrorHandlers.
- *
- * Text from the spec:
- *
- * The input octet stream MUST contain a well-formed XML document,
- * but the input need not be validated. However, the attribute
- * value normalization and entity reference resolution MUST be
- * performed in accordance with the behaviors of a validating
- * XML processor. As well, nodes for default attributes (declared
- * in the ATTLIST with an AttValue but not specified) are created
- * in each element. Thus, the declarations in the document type
- * declaration are used to help create the canonical form, even
- * though the document type declaration is not retained in the
- * canonical form.
- *
- */
- db.setErrorHandler(new com.sun.org.apache.xml.internal.security.utils
- .IgnoreAllErrorHandler());
+ /*
+ * for some of the test vectors from the specification,
+ * there has to be a validatin parser for ID attributes, default
+ * attribute values, NMTOKENS, etc.
+ * Unfortunaltely, the test vectors do use different DTDs or
+ * even no DTD. So Xerces 1.3.1 fires many warnings about using
+ * ErrorHandlers.
+ *
+ * Text from the spec:
+ *
+ * The input octet stream MUST contain a well-formed XML document,
+ * but the input need not be validated. However, the attribute
+ * value normalization and entity reference resolution MUST be
+ * performed in accordance with the behaviors of a validating
+ * XML processor. As well, nodes for default attributes (declared
+ * in the ATTLIST with an AttValue but not specified) are created
+ * in each element. Thus, the declarations in the document type
+ * declaration are used to help create the canonical form, even
+ * though the document type declaration is not retained in the
+ * canonical form.
+ *
+ */
+ db.setErrorHandler(new com.sun.org.apache.xml.internal.security.utils
+ .IgnoreAllErrorHandler());
- Document document = db.parse(in);
- byte result[] = this.canonicalizeSubtree(document);
+ Document document = db.parse(in);
+ byte result[] = this.canonicalizeSubtree(document);
- return result;
- }
+ return result;
+ }
- /**
- * Canonicalizes the subtree rooted by node
.
- *
- * @param node The node to canicalize
- * @return the result of the c14n.
- *
- * @throws CanonicalizationException
- */
- public byte[] canonicalizeSubtree(Node node)
+ /**
+ * Canonicalizes the subtree rooted by node
.
+ *
+ * @param node The node to canicalize
+ * @return the result of the c14n.
+ *
+ * @throws CanonicalizationException
+ */
+ public byte[] canonicalizeSubtree(Node node)
throws CanonicalizationException {
- return this.canonicalizerSpi.engineCanonicalizeSubTree(node);
- }
+ return this.canonicalizerSpi.engineCanonicalizeSubTree(node);
+ }
- /**
- * Canonicalizes the subtree rooted by node
.
- *
- * @param node
- * @param inclusiveNamespaces
- * @return the result of the c14n.
- * @throws CanonicalizationException
- */
- public byte[] canonicalizeSubtree(Node node, String inclusiveNamespaces)
+ /**
+ * Canonicalizes the subtree rooted by node
.
+ *
+ * @param node
+ * @param inclusiveNamespaces
+ * @return the result of the c14n.
+ * @throws CanonicalizationException
+ */
+ public byte[] canonicalizeSubtree(Node node, String inclusiveNamespaces)
throws CanonicalizationException {
- return this.canonicalizerSpi.engineCanonicalizeSubTree(node,
+ return this.canonicalizerSpi.engineCanonicalizeSubTree(node,
inclusiveNamespaces);
- }
+ }
- /**
- * Canonicalizes an XPath node set. The xpathNodeSet
is treated
- * as a list of XPath nodes, not as a list of subtrees.
- *
- * @param xpathNodeSet
- * @return the result of the c14n.
- * @throws CanonicalizationException
- */
- public byte[] canonicalizeXPathNodeSet(NodeList xpathNodeSet)
+ /**
+ * Canonicalizes an XPath node set. The xpathNodeSet
is treated
+ * as a list of XPath nodes, not as a list of subtrees.
+ *
+ * @param xpathNodeSet
+ * @return the result of the c14n.
+ * @throws CanonicalizationException
+ */
+ public byte[] canonicalizeXPathNodeSet(NodeList xpathNodeSet)
throws CanonicalizationException {
- return this.canonicalizerSpi.engineCanonicalizeXPathNodeSet(xpathNodeSet);
- }
+ return this.canonicalizerSpi.engineCanonicalizeXPathNodeSet(xpathNodeSet);
+ }
- /**
- * Canonicalizes an XPath node set. The xpathNodeSet
is treated
- * as a list of XPath nodes, not as a list of subtrees.
- *
- * @param xpathNodeSet
- * @param inclusiveNamespaces
- * @return the result of the c14n.
- * @throws CanonicalizationException
- */
- public byte[] canonicalizeXPathNodeSet(
+ /**
+ * Canonicalizes an XPath node set. The xpathNodeSet
is treated
+ * as a list of XPath nodes, not as a list of subtrees.
+ *
+ * @param xpathNodeSet
+ * @param inclusiveNamespaces
+ * @return the result of the c14n.
+ * @throws CanonicalizationException
+ */
+ public byte[] canonicalizeXPathNodeSet(
NodeList xpathNodeSet, String inclusiveNamespaces)
throws CanonicalizationException {
- return this.canonicalizerSpi.engineCanonicalizeXPathNodeSet(xpathNodeSet,
+ return this.canonicalizerSpi.engineCanonicalizeXPathNodeSet(xpathNodeSet,
inclusiveNamespaces);
- }
+ }
- /**
- * Canonicalizes an XPath node set.
- *
- * @param xpathNodeSet
- * @return the result of the c14n.
- * @throws CanonicalizationException
- */
- public byte[] canonicalizeXPathNodeSet(Set xpathNodeSet)
+ /**
+ * Canonicalizes an XPath node set.
+ *
+ * @param xpathNodeSet
+ * @return the result of the c14n.
+ * @throws CanonicalizationException
+ */
+ public byte[] canonicalizeXPathNodeSet(Set xpathNodeSet)
throws CanonicalizationException {
- return this.canonicalizerSpi.engineCanonicalizeXPathNodeSet(xpathNodeSet);
- }
+ return this.canonicalizerSpi.engineCanonicalizeXPathNodeSet(xpathNodeSet);
+ }
- /**
- * Canonicalizes an XPath node set.
- *
- * @param xpathNodeSet
- * @param inclusiveNamespaces
- * @return the result of the c14n.
- * @throws CanonicalizationException
- */
- public byte[] canonicalizeXPathNodeSet(
- Set xpathNodeSet, String inclusiveNamespaces)
- throws CanonicalizationException {
- return this.canonicalizerSpi.engineCanonicalizeXPathNodeSet(xpathNodeSet,
- inclusiveNamespaces);
- }
+ /**
+ * Canonicalizes an XPath node set.
+ *
+ * @param xpathNodeSet
+ * @param inclusiveNamespaces
+ * @return the result of the c14n.
+ * @throws CanonicalizationException
+ */
+ public byte[] canonicalizeXPathNodeSet(Set xpathNodeSet,
+ String inclusiveNamespaces) throws CanonicalizationException {
+ return this.canonicalizerSpi.engineCanonicalizeXPathNodeSet(xpathNodeSet,
+ inclusiveNamespaces);
+ }
- /**
- * Sets the writter where the cannocalization ends. ByteArrayOutputStream if
- * none is setted.
- * @param os
- */
- public void setWriter(OutputStream os) {
- this.canonicalizerSpi.setWriter(os);
- }
+ /**
+ * Sets the writer where the canonicalization ends. ByteArrayOutputStream
+ * if none is set.
+ * @param os
+ */
+ public void setWriter(OutputStream os) {
+ this.canonicalizerSpi.setWriter(os);
+ }
- /**
- * Returns the name of the implementing {@link CanonicalizerSpi} class
- *
- * @return the name of the implementing {@link CanonicalizerSpi} class
- */
- public String getImplementingCanonicalizerClass() {
- return this.canonicalizerSpi.getClass().getName();
- }
+ /**
+ * Returns the name of the implementing {@link CanonicalizerSpi} class
+ *
+ * @return the name of the implementing {@link CanonicalizerSpi} class
+ */
+ public String getImplementingCanonicalizerClass() {
+ return this.canonicalizerSpi.getClass().getName();
+ }
- /**
- * Method getImplementingClass
- *
- * @param URI
- * @return the name of the class that implements the give URI
- */
- private static Class getImplementingClass(String URI) {
- return (Class) _canonicalizerHash.get(URI);
- }
+ /**
+ * Method getImplementingClass
+ *
+ * @param URI
+ * @return the name of the class that implements the given URI
+ */
+ private static Class getImplementingClass(String URI) {
+ return (Class) _canonicalizerHash.get(URI);
+ }
- /**
- * Set the canonicalizator behaviour to not reset.
- *
- */
- public void notReset() {
- this.canonicalizerSpi.reset=false;
- }
+ /**
+ * Set the canonicalizer behaviour to not reset.
+ */
+ public void notReset() {
+ this.canonicalizerSpi.reset = false;
+ }
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/InvalidCanonicalizerException.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/InvalidCanonicalizerException.java
index 8af3ed88050..9fb1531b7e9 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/InvalidCanonicalizerException.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/InvalidCanonicalizerException.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/helper/AttrCompare.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/helper/AttrCompare.java
index 46fdc660338..802abda2862 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/helper/AttrCompare.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/helper/AttrCompare.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -21,17 +20,17 @@
*/
package com.sun.org.apache.xml.internal.security.c14n.helper;
-
-
import com.sun.org.apache.xml.internal.security.utils.Constants;
import org.w3c.dom.Attr;
-
+import java.io.Serializable;
+import java.util.Comparator;
/**
* Compares two attributes based on the C14n specification.
*
*
- * Namespace nodes have a lesser document order position than attribute nodes.
+ * Namespace nodes have a lesser document order position than attribute
+ * nodes.
* An element's namespace nodes are sorted lexicographically by
* local name (the default namespace node, if one exists, has no
* local name and is therefore lexicographically least).
@@ -40,104 +39,89 @@ import org.w3c.dom.Attr;
* key (an empty namespace URI is lexicographically least).
*
*
- * $todo$ Should we implement java.util.Comparator and import java.util.Arrays to use Arrays.sort(intarray);
* @author Christian Geuer-Pollmann
*/
-public class AttrCompare implements java.util.Comparator {
+public class AttrCompare implements Comparator, Serializable {
- private final int ATTR0_BEFORE_ATTR1 = -1;
- private final int ATTR1_BEFORE_ATTR0 = 1;
+ private final static long serialVersionUID = -7113259629930576230L;
+ private final static int ATTR0_BEFORE_ATTR1 = -1;
+ private final static int ATTR1_BEFORE_ATTR0 = 1;
+ private final static String XMLNS=Constants.NamespaceSpecNS;
- private final static String XMLNS=Constants.NamespaceSpecNS;
- /**
- * Compares two attributes based on the C14n specification.
- *
- *
- * Namespace nodes have a lesser document order position than attribute nodes.
- * An element's namespace nodes are sorted lexicographically by
- * local name (the default namespace node, if one exists, has no
- * local name and is therefore lexicographically least).
- * An element's attribute nodes are sorted lexicographically with
- * namespace URI as the primary key and local name as the secondary
- * key (an empty namespace URI is lexicographically least).
- *
- *
- * @param obj0 casted Attr
- * @param obj1 casted Attr
- * @return returns a negative integer, zero, or a positive integer as obj0 is less than, equal to, or greater than obj1
- *
- */
- public int compare(Object obj0, Object obj1) {
+ /**
+ * Compares two attributes based on the C14n specification.
+ *
+ *
+ * Namespace nodes have a lesser document order position than
+ * attribute nodes.
+ * An element's namespace nodes are sorted lexicographically by
+ * local name (the default namespace node, if one exists, has no
+ * local name and is therefore lexicographically least).
+ * An element's attribute nodes are sorted lexicographically with
+ * namespace URI as the primary key and local name as the secondary
+ * key (an empty namespace URI is lexicographically least).
+ *
+ *
+ * @param obj0 casted Attr
+ * @param obj1 casted Attr
+ * @return returns a negative integer, zero, or a positive integer as
+ * obj0 is less than, equal to, or greater than obj1
+ *
+ */
+ public int compare(Object obj0, Object obj1) {
- Attr attr0 = (Attr) obj0;
- Attr attr1 = (Attr) obj1;
- String namespaceURI0 = attr0.getNamespaceURI();
- String namespaceURI1 = attr1.getNamespaceURI();
+ Attr attr0 = (Attr) obj0;
+ Attr attr1 = (Attr) obj1;
+ String namespaceURI0 = attr0.getNamespaceURI();
+ String namespaceURI1 = attr1.getNamespaceURI();
- boolean isNamespaceAttr0 =
- XMLNS.equals(namespaceURI0);
- boolean isNamespaceAttr1 =
- XMLNS.equals(namespaceURI1);
+ boolean isNamespaceAttr0 = XMLNS==namespaceURI0;
+ boolean isNamespaceAttr1 = XMLNS==namespaceURI1;
- if (isNamespaceAttr0) {
- if (isNamespaceAttr1) {
+ if (isNamespaceAttr0) {
+ if (isNamespaceAttr1) {
+ // both are namespaces
+ String localname0 = attr0.getLocalName();
+ String localname1 = attr1.getLocalName();
- // both are namespaces
- String localname0 = attr0.getLocalName();
- String localname1 = attr1.getLocalName();
+ if (localname0.equals("xmlns")) {
+ localname0 = "";
+ }
- if (localname0.equals("xmlns")) {
- localname0 = "";
+ if (localname1.equals("xmlns")) {
+ localname1 = "";
+ }
+
+ return localname0.compareTo(localname1);
}
+ // attr0 is a namespace, attr1 is not
+ return ATTR0_BEFORE_ATTR1;
+ }
- if (localname1.equals("xmlns")) {
- localname1 = "";
- }
-
- return localname0.compareTo(localname1);
- }
- // attr0 is a namespace, attr1 is not
- return ATTR0_BEFORE_ATTR1;
-
- }
- if (isNamespaceAttr1) {
-
+ if (isNamespaceAttr1) {
// attr1 is a namespace, attr0 is not
return ATTR1_BEFORE_ATTR0;
- }
-
- // none is a namespae
-
- if (namespaceURI0 == null) {
- if (namespaceURI1 == null) {
- /*
- String localName0 = attr0.getLocalName();
- String localName1 = attr1.getLocalName();
- return localName0.compareTo(localName1);
- */
+ }
+ // none is a namespace
+ if (namespaceURI0 == null) {
+ if (namespaceURI1 == null) {
String name0 = attr0.getName();
String name1 = attr1.getName();
return name0.compareTo(name1);
+ }
+ return ATTR0_BEFORE_ATTR1;
}
- return ATTR0_BEFORE_ATTR1;
- }
- if (namespaceURI1 == null) {
- return ATTR1_BEFORE_ATTR0;
- }
- int a = namespaceURI0.compareTo(namespaceURI1);
+ if (namespaceURI1 == null) {
+ return ATTR1_BEFORE_ATTR0;
+ }
- if (a != 0) {
- return a;
- }
- /*
- String localName0 = ;
- String localName1 =;*/
-
- return (attr0.getLocalName())
- .compareTo( attr1.getLocalName());
-
- }
+ int a = namespaceURI0.compareTo(namespaceURI1);
+ if (a != 0) {
+ return a;
+ }
+ return (attr0.getLocalName()).compareTo(attr1.getLocalName());
+ }
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer11.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer11.java
new file mode 100644
index 00000000000..4790fd89043
--- /dev/null
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer11.java
@@ -0,0 +1,684 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * Copyright 2008 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package com.sun.org.apache.xml.internal.security.c14n.implementations;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import javax.xml.parsers.ParserConfigurationException;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
+
+import java.util.logging.Logger;
+import java.util.logging.Logger;
+import com.sun.org.apache.xml.internal.security.c14n.CanonicalizationException;
+import com.sun.org.apache.xml.internal.security.c14n.helper.C14nHelper;
+import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput;
+import com.sun.org.apache.xml.internal.security.utils.Constants;
+import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
+
+/**
+ * Implements
+ * Canonical XML Version 1.1 , a W3C Proposed Recommendation from 29
+ * January 2008.
+ *
+ * @author Sean Mullan
+ * @author Raul Benito
+ * @version $Revision: 1.2 $
+ */
+public abstract class Canonicalizer11 extends CanonicalizerBase {
+ boolean firstCall = true;
+ final SortedSet result = new TreeSet(COMPARE);
+ static final String XMLNS_URI = Constants.NamespaceSpecNS;
+ static final String XML_LANG_URI = Constants.XML_LANG_SPACE_SpecNS;
+
+ static Logger log = Logger.getLogger(Canonicalizer11.class.getName());
+
+ static class XmlAttrStack {
+ int currentLevel = 0;
+ int lastlevel = 0;
+ XmlsStackElement cur;
+ static class XmlsStackElement {
+ int level;
+ boolean rendered = false;
+ List nodes = new ArrayList();
+ };
+ List levels = new ArrayList();
+ void push(int level) {
+ currentLevel = level;
+ if (currentLevel == -1)
+ return;
+ cur = null;
+ while (lastlevel >= currentLevel) {
+ levels.remove(levels.size() - 1);
+ if (levels.size() == 0) {
+ lastlevel = 0;
+ return;
+ }
+ lastlevel=((XmlsStackElement)levels.get(levels.size()-1)).level;
+ }
+ }
+ void addXmlnsAttr(Attr n) {
+ if (cur == null) {
+ cur = new XmlsStackElement();
+ cur.level = currentLevel;
+ levels.add(cur);
+ lastlevel = currentLevel;
+ }
+ cur.nodes.add(n);
+ }
+ void getXmlnsAttr(Collection col) {
+ if (cur == null) {
+ cur = new XmlsStackElement();
+ cur.level = currentLevel;
+ lastlevel = currentLevel;
+ levels.add(cur);
+ }
+ int size = levels.size() - 2;
+ boolean parentRendered = false;
+ XmlsStackElement e = null;
+ if (size == -1) {
+ parentRendered = true;
+ } else {
+ e = (XmlsStackElement) levels.get(size);
+ if (e.rendered && e.level+1 == currentLevel)
+ parentRendered = true;
+ }
+ if (parentRendered) {
+ col.addAll(cur.nodes);
+ cur.rendered = true;
+ return;
+ }
+
+ Map loa = new HashMap();
+ List baseAttrs = new ArrayList();
+ boolean successiveOmitted = true;
+ for (;size>=0;size--) {
+ e = (XmlsStackElement) levels.get(size);
+ if (e.rendered) {
+ successiveOmitted = false;
+ }
+ Iterator it = e.nodes.iterator();
+ while (it.hasNext() && successiveOmitted) {
+ Attr n = (Attr) it.next();
+ if (n.getLocalName().equals("base")) {
+ if (!e.rendered) {
+ baseAttrs.add(n);
+ }
+ } else if (!loa.containsKey(n.getName()))
+ loa.put(n.getName(), n);
+ }
+ }
+ if (!baseAttrs.isEmpty()) {
+ Iterator it = cur.nodes.iterator();
+ String base = null;
+ Attr baseAttr = null;
+ while (it.hasNext()) {
+ Attr n = (Attr) it.next();
+ if (n.getLocalName().equals("base")) {
+ base = n.getValue();
+ baseAttr = n;
+ break;
+ }
+ }
+ it = baseAttrs.iterator();
+ while (it.hasNext()) {
+ Attr n = (Attr) it.next();
+ if (base == null) {
+ base = n.getValue();
+ baseAttr = n;
+ } else {
+ try {
+ base = joinURI(n.getValue(), base);
+ } catch (URISyntaxException ue) {
+ ue.printStackTrace();
+ }
+ }
+ }
+ if (base != null && base.length() != 0) {
+ baseAttr.setValue(base);
+ col.add(baseAttr);
+ }
+ }
+
+ cur.rendered = true;
+ col.addAll(loa.values());
+ }
+ };
+ XmlAttrStack xmlattrStack = new XmlAttrStack();
+
+ /**
+ * Constructor Canonicalizer11
+ *
+ * @param includeComments
+ */
+ public Canonicalizer11(boolean includeComments) {
+ super(includeComments);
+ }
+
+ /**
+ * Returns the Attr[]s to be outputted for the given element.
+ *
+ * The code of this method is a copy of {@link #handleAttributes(Element,
+ * NameSpaceSymbTable)},
+ * whereas it takes into account that subtree-c14n is -- well --
+ * subtree-based.
+ * So if the element in question isRoot of c14n, it's parent is not in the
+ * node set, as well as all other ancestors.
+ *
+ * @param E
+ * @param ns
+ * @return the Attr[]s to be outputted
+ * @throws CanonicalizationException
+ */
+ Iterator handleAttributesSubtree(Element E, NameSpaceSymbTable ns)
+ throws CanonicalizationException {
+ if (!E.hasAttributes() && !firstCall) {
+ return null;
+ }
+ // result will contain the attrs which have to be outputted
+ final SortedSet result = this.result;
+ result.clear();
+ NamedNodeMap attrs = E.getAttributes();
+ int attrsLength = attrs.getLength();
+
+ for (int i = 0; i < attrsLength; i++) {
+ Attr N = (Attr) attrs.item(i);
+ String NUri = N.getNamespaceURI();
+
+ if (XMLNS_URI != NUri) {
+ // It's not a namespace attr node. Add to the result and
+ // continue.
+ result.add(N);
+ continue;
+ }
+
+ String NName = N.getLocalName();
+ String NValue = N.getValue();
+ if (XML.equals(NName)
+ && XML_LANG_URI.equals(NValue)) {
+ // The default mapping for xml must not be output.
+ continue;
+ }
+
+ Node n = ns.addMappingAndRender(NName, NValue, N);
+
+ if (n != null) {
+ // Render the ns definition
+ result.add(n);
+ if (C14nHelper.namespaceIsRelative(N)) {
+ Object exArgs[] = {E.getTagName(), NName, N.getNodeValue()};
+ throw new CanonicalizationException(
+ "c14n.Canonicalizer.RelativeNamespace", exArgs);
+ }
+ }
+ }
+
+ if (firstCall) {
+ // It is the first node of the subtree
+ // Obtain all the namespaces defined in the parents, and added
+ // to the output.
+ ns.getUnrenderedNodes(result);
+ // output the attributes in the xml namespace.
+ xmlattrStack.getXmlnsAttr(result);
+ firstCall = false;
+ }
+
+ return result.iterator();
+ }
+
+ /**
+ * Returns the Attr[]s to be outputted for the given element.
+ *
+ * IMPORTANT: This method expects to work on a modified DOM tree, i.e. a
+ * DOM which has been prepared using
+ * {@link com.sun.org.apache.xml.internal.security.utils.XMLUtils#circumventBug2650(
+ * org.w3c.dom.Document)}.
+ *
+ * @param E
+ * @param ns
+ * @return the Attr[]s to be outputted
+ * @throws CanonicalizationException
+ */
+ Iterator handleAttributes(Element E, NameSpaceSymbTable ns)
+ throws CanonicalizationException {
+ // result will contain the attrs which have to be output
+ xmlattrStack.push(ns.getLevel());
+ boolean isRealVisible = isVisibleDO(E, ns.getLevel()) == 1;
+ NamedNodeMap attrs = null;
+ int attrsLength = 0;
+ if (E.hasAttributes()) {
+ attrs = E.getAttributes();
+ attrsLength = attrs.getLength();
+ }
+
+ SortedSet result = this.result;
+ result.clear();
+
+ for (int i = 0; i < attrsLength; i++) {
+ Attr N = (Attr) attrs.item(i);
+ String NUri = N.getNamespaceURI();
+
+ if (XMLNS_URI != NUri) {
+ // A non namespace definition node.
+ if (XML_LANG_URI == NUri) {
+ if (N.getLocalName().equals("id")) {
+ if (isRealVisible) {
+ // treat xml:id like any other attribute
+ // (emit it, but don't inherit it)
+ result.add(N);
+ }
+ } else {
+ xmlattrStack.addXmlnsAttr(N);
+ }
+ } else if (isRealVisible) {
+ // The node is visible add the attribute to the list of
+ // output attributes.
+ result.add(N);
+ }
+ // keep working
+ continue;
+ }
+
+ String NName = N.getLocalName();
+ String NValue = N.getValue();
+ if ("xml".equals(NName)
+ && XML_LANG_URI.equals(NValue)) {
+ /* except omit namespace node with local name xml, which defines
+ * the xml prefix, if its string value is
+ * http://www.w3.org/XML/1998/namespace.
+ */
+ continue;
+ }
+ // add the prefix binding to the ns symb table.
+ // ns.addInclusiveMapping(NName,NValue,N,isRealVisible);
+ if (isVisible(N)) {
+ if (!isRealVisible && ns.removeMappingIfRender(NName)) {
+ continue;
+ }
+ // The xpath select this node output it if needed.
+ // Node n = ns.addMappingAndRenderXNodeSet
+ // (NName, NValue, N, isRealVisible);
+ Node n = ns.addMappingAndRender(NName, NValue, N);
+ if (n != null) {
+ result.add(n);
+ if (C14nHelper.namespaceIsRelative(N)) {
+ Object exArgs[] =
+ { E.getTagName(), NName, N.getNodeValue() };
+ throw new CanonicalizationException(
+ "c14n.Canonicalizer.RelativeNamespace", exArgs);
+ }
+ }
+ } else {
+ if (isRealVisible && NName != XMLNS) {
+ ns.removeMapping(NName);
+ } else {
+ ns.addMapping(NName, NValue, N);
+ }
+ }
+ }
+ if (isRealVisible) {
+ // The element is visible, handle the xmlns definition
+ Attr xmlns = E.getAttributeNodeNS(XMLNS_URI, XMLNS);
+ Node n = null;
+ if (xmlns == null) {
+ // No xmlns def just get the already defined.
+ n = ns.getMapping(XMLNS);
+ } else if (!isVisible(xmlns)) {
+ // There is a defn but the xmlns is not selected by the xpath.
+ // then xmlns=""
+ n = ns.addMappingAndRender(XMLNS, "", nullNode);
+ }
+ // output the xmlns def if needed.
+ if (n != null) {
+ result.add(n);
+ }
+ // Float all xml:* attributes of the unselected parent elements to
+ // this one. addXmlAttributes(E,result);
+ xmlattrStack.getXmlnsAttr(result);
+ ns.getUnrenderedNodes(result);
+ }
+
+ return result.iterator();
+ }
+
+ /**
+ * Always throws a CanonicalizationException because this is inclusive c14n.
+ *
+ * @param xpathNodeSet
+ * @param inclusiveNamespaces
+ * @return none it always fails
+ * @throws CanonicalizationException always
+ */
+ public byte[] engineCanonicalizeXPathNodeSet(Set xpathNodeSet,
+ String inclusiveNamespaces) throws CanonicalizationException {
+ throw new CanonicalizationException(
+ "c14n.Canonicalizer.UnsupportedOperation");
+ }
+
+ /**
+ * Always throws a CanonicalizationException because this is inclusive c14n.
+ *
+ * @param rootNode
+ * @param inclusiveNamespaces
+ * @return none it always fails
+ * @throws CanonicalizationException
+ */
+ public byte[] engineCanonicalizeSubTree(Node rootNode,
+ String inclusiveNamespaces) throws CanonicalizationException {
+ throw new CanonicalizationException(
+ "c14n.Canonicalizer.UnsupportedOperation");
+ }
+
+ void circumventBugIfNeeded(XMLSignatureInput input)
+ throws CanonicalizationException, ParserConfigurationException,
+ IOException, SAXException {
+ if (!input.isNeedsToBeExpanded())
+ return;
+ Document doc = null;
+ if (input.getSubNode() != null) {
+ doc = XMLUtils.getOwnerDocument(input.getSubNode());
+ } else {
+ doc = XMLUtils.getOwnerDocument(input.getNodeSet());
+ }
+ XMLUtils.circumventBug2650(doc);
+ }
+
+ void handleParent(Element e, NameSpaceSymbTable ns) {
+ if (!e.hasAttributes()) {
+ return;
+ }
+ xmlattrStack.push(-1);
+ NamedNodeMap attrs = e.getAttributes();
+ int attrsLength = attrs.getLength();
+ for (int i = 0; i < attrsLength; i++) {
+ Attr N = (Attr) attrs.item(i);
+ if (Constants.NamespaceSpecNS != N.getNamespaceURI()) {
+ // Not a namespace definition, ignore.
+ if (XML_LANG_URI == N.getNamespaceURI()) {
+ xmlattrStack.addXmlnsAttr(N);
+ }
+ continue;
+ }
+
+ String NName = N.getLocalName();
+ String NValue = N.getNodeValue();
+ if (XML.equals(NName)
+ && Constants.XML_LANG_SPACE_SpecNS.equals(NValue)) {
+ continue;
+ }
+ ns.addMapping(NName,NValue,N);
+ }
+ }
+
+ private static String joinURI(String baseURI, String relativeURI)
+ throws URISyntaxException {
+ String bscheme = null;
+ String bauthority = null;
+ String bpath = "";
+ String bquery = null;
+ String bfragment = null; // Is this correct?
+
+ // pre-parse the baseURI
+ if (baseURI != null) {
+ if (baseURI.endsWith("..")) {
+ baseURI = baseURI + "/";
+ }
+ URI base = new URI(baseURI);
+ bscheme = base.getScheme();
+ bauthority = base.getAuthority();
+ bpath = base.getPath();
+ bquery = base.getQuery();
+ bfragment = base.getFragment();
+ }
+
+ URI r = new URI(relativeURI);
+ String rscheme = r.getScheme();
+ String rauthority = r.getAuthority();
+ String rpath = r.getPath();
+ String rquery = r.getQuery();
+ String rfragment = null;
+
+ String tscheme, tauthority, tpath, tquery, tfragment;
+ if (rscheme != null && rscheme.equals(bscheme)) {
+ rscheme = null;
+ }
+ if (rscheme != null) {
+ tscheme = rscheme;
+ tauthority = rauthority;
+ tpath = removeDotSegments(rpath);
+ tquery = rquery;
+ } else {
+ if (rauthority != null) {
+ tauthority = rauthority;
+ tpath = removeDotSegments(rpath);
+ tquery = rquery;
+ } else {
+ if (rpath.length() == 0) {
+ tpath = bpath;
+ if (rquery != null) {
+ tquery = rquery;
+ } else {
+ tquery = bquery;
+ }
+ } else {
+ if (rpath.startsWith("/")) {
+ tpath = removeDotSegments(rpath);
+ } else {
+ if (bauthority != null && bpath.length() == 0) {
+ tpath = "/" + rpath;
+ } else {
+ int last = bpath.lastIndexOf('/');
+ if (last == -1) {
+ tpath = rpath;
+ } else {
+ tpath = bpath.substring(0, last+1) + rpath;
+ }
+ }
+ tpath = removeDotSegments(tpath);
+ }
+ tquery = rquery;
+ }
+ tauthority = bauthority;
+ }
+ tscheme = bscheme;
+ }
+ tfragment = rfragment;
+ return new URI(tscheme, tauthority, tpath, tquery, tfragment).toString();
+ }
+
+ private static String removeDotSegments(String path) {
+
+ log.log(java.util.logging.Level.FINE, "STEP OUTPUT BUFFER\t\tINPUT BUFFER");
+
+ // 1. The input buffer is initialized with the now-appended path
+ // components then replace occurrences of "//" in the input buffer
+ // with "/" until no more occurrences of "//" are in the input buffer.
+ String input = path;
+ while (input.indexOf("//") > -1) {
+ input = input.replaceAll("//", "/");
+ }
+
+ // Initialize the output buffer with the empty string.
+ StringBuffer output = new StringBuffer();
+
+ // If the input buffer starts with a root slash "/" then move this
+ // character to the output buffer.
+ if (input.charAt(0) == '/') {
+ output.append("/");
+ input = input.substring(1);
+ }
+
+ printStep("1 ", output.toString(), input);
+
+ // While the input buffer is not empty, loop as follows
+ while (input.length() != 0) {
+ // 2A. If the input buffer begins with a prefix of "./",
+ // then remove that prefix from the input buffer
+ // else if the input buffer begins with a prefix of "../", then
+ // if also the output does not contain the root slash "/" only,
+ // then move this prefix to the end of the output buffer else
+ // remove that prefix
+ if (input.startsWith("./")) {
+ input = input.substring(2);
+ printStep("2A", output.toString(), input);
+ } else if (input.startsWith("../")) {
+ input = input.substring(3);
+ if (!output.toString().equals("/")) {
+ output.append("../");
+ }
+ printStep("2A", output.toString(), input);
+ // 2B. if the input buffer begins with a prefix of "/./" or "/.",
+ // where "." is a complete path segment, then replace that prefix
+ // with "/" in the input buffer; otherwise,
+ } else if (input.startsWith("/./")) {
+ input = input.substring(2);
+ printStep("2B", output.toString(), input);
+ } else if (input.equals("/.")) {
+ // FIXME: what is complete path segment?
+ input = input.replaceFirst("/.", "/");
+ printStep("2B", output.toString(), input);
+ // 2C. if the input buffer begins with a prefix of "/../" or "/..",
+ // where ".." is a complete path segment, then replace that prefix
+ // with "/" in the input buffer and if also the output buffer is
+ // empty, last segment in the output buffer equals "../" or "..",
+ // where ".." is a complete path segment, then append ".." or "/.."
+ // for the latter case respectively to the output buffer else
+ // remove the last segment and its preceding "/" (if any) from the
+ // output buffer and if hereby the first character in the output
+ // buffer was removed and it was not the root slash then delete a
+ // leading slash from the input buffer; otherwise,
+ } else if (input.startsWith("/../")) {
+ input = input.substring(3);
+ if (output.length() == 0) {
+ output.append("/");
+ } else if (output.toString().endsWith("../")) {
+ output.append("..");
+ } else if (output.toString().endsWith("..")) {
+ output.append("/..");
+ } else {
+ int index = output.lastIndexOf("/");
+ if (index == -1) {
+ output = new StringBuffer();
+ if (input.charAt(0) == '/') {
+ input = input.substring(1);
+ }
+ } else {
+ output = output.delete(index, output.length());
+ }
+ }
+ printStep("2C", output.toString(), input);
+ } else if (input.equals("/..")) {
+ // FIXME: what is complete path segment?
+ input = input.replaceFirst("/..", "/");
+ if (output.length() == 0) {
+ output.append("/");
+ } else if (output.toString().endsWith("../")) {
+ output.append("..");
+ } else if (output.toString().endsWith("..")) {
+ output.append("/..");
+ } else {
+ int index = output.lastIndexOf("/");
+ if (index == -1) {
+ output = new StringBuffer();
+ if (input.charAt(0) == '/') {
+ input = input.substring(1);
+ }
+ } else {
+ output = output.delete(index, output.length());
+ }
+ }
+ printStep("2C", output.toString(), input);
+ // 2D. if the input buffer consists only of ".", then remove
+ // that from the input buffer else if the input buffer consists
+ // only of ".." and if the output buffer does not contain only
+ // the root slash "/", then move the ".." to the output buffer
+ // else delte it.; otherwise,
+ } else if (input.equals(".")) {
+ input = "";
+ printStep("2D", output.toString(), input);
+ } else if (input.equals("..")) {
+ if (!output.toString().equals("/"))
+ output.append("..");
+ input = "";
+ printStep("2D", output.toString(), input);
+ // 2E. move the first path segment (if any) in the input buffer
+ // to the end of the output buffer, including the initial "/"
+ // character (if any) and any subsequent characters up to, but not
+ // including, the next "/" character or the end of the input buffer.
+ } else {
+ int end = -1;
+ int begin = input.indexOf('/');
+ if (begin == 0) {
+ end = input.indexOf('/', 1);
+ } else {
+ end = begin;
+ begin = 0;
+ }
+ String segment;
+ if (end == -1) {
+ segment = input.substring(begin);
+ input = "";
+ } else {
+ segment = input.substring(begin, end);
+ input = input.substring(end);
+ }
+ output.append(segment);
+ printStep("2E", output.toString(), input);
+ }
+ }
+
+ // 3. Finally, if the only or last segment of the output buffer is
+ // "..", where ".." is a complete path segment not followed by a slash
+ // then append a slash "/". The output buffer is returned as the result
+ // of remove_dot_segments
+ if (output.toString().endsWith("..")) {
+ output.append("/");
+ printStep("3 ", output.toString(), input);
+ }
+
+ return output.toString();
+ }
+
+ private static void printStep(String step, String output, String input) {
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, " " + step + ": " + output);
+ if (output.length() == 0) {
+ log.log(java.util.logging.Level.FINE, "\t\t\t\t" + input);
+ } else {
+ log.log(java.util.logging.Level.FINE, "\t\t\t" + input);
+ }
+ }
+ }
+}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer11_OmitComments.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer11_OmitComments.java
new file mode 100644
index 00000000000..31903667f60
--- /dev/null
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer11_OmitComments.java
@@ -0,0 +1,41 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * Copyright 2008 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package com.sun.org.apache.xml.internal.security.c14n.implementations;
+
+import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
+
+/**
+ * @author Sean Mullan
+ */
+public class Canonicalizer11_OmitComments extends Canonicalizer11 {
+
+ public Canonicalizer11_OmitComments() {
+ super(false);
+ }
+
+ public final String engineGetURI() {
+ return Canonicalizer.ALGO_ID_C14N11_OMIT_COMMENTS;
+ }
+
+ public final boolean engineGetIncludeComments() {
+ return false;
+ }
+}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer11_WithComments.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer11_WithComments.java
new file mode 100644
index 00000000000..ba650c10872
--- /dev/null
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer11_WithComments.java
@@ -0,0 +1,41 @@
+/*
+ * reserved comment block
+ * DO NOT REMOVE OR ALTER!
+ */
+/*
+ * Copyright 2008 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package com.sun.org.apache.xml.internal.security.c14n.implementations;
+
+import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
+
+/**
+ * @author Sean Mullan
+ */
+public class Canonicalizer11_WithComments extends Canonicalizer11 {
+
+ public Canonicalizer11_WithComments() {
+ super(true);
+ }
+
+ public final String engineGetURI() {
+ return Canonicalizer.ALGO_ID_C14N11_WITH_COMMENTS;
+ }
+
+ public final boolean engineGetIncludeComments() {
+ return true;
+ }
+}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315.java
index 5dbeb60f985..541c2d63c99 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -23,20 +22,30 @@ package com.sun.org.apache.xml.internal.security.c14n.implementations;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
+import javax.xml.parsers.ParserConfigurationException;
+
import com.sun.org.apache.xml.internal.security.c14n.CanonicalizationException;
import com.sun.org.apache.xml.internal.security.c14n.helper.C14nHelper;
+import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput;
import com.sun.org.apache.xml.internal.security.utils.Constants;
+import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
/**
@@ -44,13 +53,92 @@ import org.w3c.dom.Node;
* XML Version 1.0, a W3C Recommendation from 15 March 2001.
*
* @author Christian Geuer-Pollmann
+ * @version $Revision: 1.5 $
*/
public abstract class Canonicalizer20010315 extends CanonicalizerBase {
boolean firstCall=true;
final SortedSet result= new TreeSet(COMPARE);
static final String XMLNS_URI=Constants.NamespaceSpecNS;
static final String XML_LANG_URI=Constants.XML_LANG_SPACE_SpecNS;
- /**
+ static class XmlAttrStack {
+ int currentLevel=0;
+ int lastlevel=0;
+ XmlsStackElement cur;
+ static class XmlsStackElement {
+ int level;
+ boolean rendered=false;
+ List nodes=new ArrayList();
+ };
+ List levels=new ArrayList();
+ void push(int level) {
+ currentLevel=level;
+ if (currentLevel==-1)
+ return;
+ cur=null;
+ while (lastlevel>=currentLevel) {
+ levels.remove(levels.size()-1);
+ if (levels.size()==0) {
+ lastlevel=0;
+ return;
+ }
+ lastlevel=((XmlsStackElement)levels.get(levels.size()-1)).level;
+ }
+ }
+ void addXmlnsAttr(Attr n) {
+ if (cur==null) {
+ cur=new XmlsStackElement();
+ cur.level=currentLevel;
+ levels.add(cur);
+ lastlevel=currentLevel;
+ }
+ cur.nodes.add(n);
+ }
+ void getXmlnsAttr(Collection col) {
+ int size=levels.size()-1;
+ if (cur==null) {
+ cur=new XmlsStackElement();
+ cur.level=currentLevel;
+ lastlevel=currentLevel;
+ levels.add(cur);
+ }
+ boolean parentRendered=false;
+ XmlsStackElement e=null;
+ if (size==-1) {
+ parentRendered=true;
+ } else {
+ e=(XmlsStackElement)levels.get(size);
+ if (e.rendered && e.level+1==currentLevel)
+ parentRendered=true;
+
+ }
+ if (parentRendered) {
+ col.addAll(cur.nodes);
+ cur.rendered=true;
+ return;
+ }
+
+ Map loa = new HashMap();
+ for (;size>=0;size--) {
+ e=(XmlsStackElement)levels.get(size);
+ Iterator it=e.nodes.iterator();
+ while (it.hasNext()) {
+ Attr n=(Attr)it.next();
+ if (!loa.containsKey(n.getName()))
+ loa.put(n.getName(),n);
+ }
+ //if (e.rendered)
+ //break;
+
+ };
+ //cur.nodes.clear();
+ //cur.nodes.addAll(loa.values());
+ cur.rendered=true;
+ col.addAll(loa.values());
+ }
+
+ }
+ XmlAttrStack xmlattrStack=new XmlAttrStack();
+ /**
* Constructor Canonicalizer20010315
*
* @param includeComments
@@ -86,16 +174,16 @@ public abstract class Canonicalizer20010315 extends CanonicalizerBase {
for (int i = 0; i < attrsLength; i++) {
Attr N = (Attr) attrs.item(i);
- String NName=N.getLocalName();
- String NValue=N.getValue();
String NUri =N.getNamespaceURI();
- if (!XMLNS_URI.equals(NUri)) {
+ if (XMLNS_URI!=NUri) {
//It's not a namespace attr node. Add to the result and continue.
result.add(N);
continue;
}
+ String NName=N.getLocalName();
+ String NValue=N.getValue();
if (XML.equals(NName)
&& XML_LANG_URI.equals(NValue)) {
//The default mapping for xml must not be output.
@@ -120,64 +208,13 @@ public abstract class Canonicalizer20010315 extends CanonicalizerBase {
//Obtain all the namespaces defined in the parents, and added to the output.
ns.getUnrenderedNodes(result);
//output the attributes in the xml namespace.
- addXmlAttributesSubtree(E, result);
- firstCall=false;
+ xmlattrStack.getXmlnsAttr(result);
+ firstCall=false;
}
return result.iterator();
}
- /**
- * Float the xml:* attributes of the parent nodes to the root node of c14n
- * @param E the root node.
- * @param result the xml:* attributes to output.
- */
- private void addXmlAttributesSubtree(Element E, SortedSet result) {
- // E is in the node-set
- Node parent = E.getParentNode();
- Map loa = new HashMap();
-
- if ((parent != null) && (parent.getNodeType() == Node.ELEMENT_NODE)) {
-
- // parent element is not in node set
- for (Node ancestor = parent;
- (ancestor != null)
- && (ancestor.getNodeType() == Node.ELEMENT_NODE);
- ancestor = ancestor.getParentNode()) {
- Element el=((Element) ancestor);
- if (!el.hasAttributes()) {
- continue;
- }
- // for all ancestor elements
- NamedNodeMap ancestorAttrs = el.getAttributes();
-
- for (int i = 0; i < ancestorAttrs.getLength(); i++) {
- // for all attributes in the ancestor element
- Attr currentAncestorAttr = (Attr) ancestorAttrs.item(i);
-
- if (XML_LANG_URI.equals(
- currentAncestorAttr.getNamespaceURI())) {
-
- // do we have an xml:* ?
- if (!E.hasAttributeNS(
- XML_LANG_URI,
- currentAncestorAttr.getLocalName())) {
-
- // the xml:* attr is not in E
- if (!loa.containsKey(currentAncestorAttr.getName())) {
- loa.put(currentAncestorAttr.getName(),
- currentAncestorAttr);
- }
- }
- }
- }
- }
- }
-
- result.addAll( loa.values());
-
- }
-
/**
* Returns the Attr[]s to be outputted for the given element.
*
@@ -192,7 +229,8 @@ public abstract class Canonicalizer20010315 extends CanonicalizerBase {
*/
Iterator handleAttributes(Element E, NameSpaceSymbTable ns ) throws CanonicalizationException {
// result will contain the attrs which have to be outputted
- boolean isRealVisible=isVisible(E);
+ xmlattrStack.push(ns.getLevel());
+ boolean isRealVisible=isVisibleDO(E,ns.getLevel())==1;
NamedNodeMap attrs = null;
int attrsLength = 0;
if (E.hasAttributes()) {
@@ -204,16 +242,15 @@ public abstract class Canonicalizer20010315 extends CanonicalizerBase {
SortedSet result = this.result;
result.clear();
-
for (int i = 0; i < attrsLength; i++) {
Attr N = (Attr) attrs.item(i);
- String NName=N.getLocalName();
- String NValue=N.getValue();
String NUri =N.getNamespaceURI();
- if (!XMLNS_URI.equals(NUri)) {
+ if (XMLNS_URI!=NUri) {
//A non namespace definition node.
- if (isRealVisible){
+ if (XML_LANG_URI==NUri) {
+ xmlattrStack.addXmlnsAttr(N);
+ } else if (isRealVisible){
//The node is visible add the attribute to the list of output attributes.
result.add(N);
}
@@ -221,7 +258,8 @@ public abstract class Canonicalizer20010315 extends CanonicalizerBase {
continue;
}
-
+ String NName=N.getLocalName();
+ String NValue=N.getValue();
if ("xml".equals(NName)
&& XML_LANG_URI.equals(NValue)) {
/* except omit namespace node with local name xml, which defines
@@ -232,16 +270,26 @@ public abstract class Canonicalizer20010315 extends CanonicalizerBase {
//add the prefix binding to the ns symb table.
//ns.addInclusiveMapping(NName,NValue,N,isRealVisible);
if (isVisible(N)) {
- //The xpath select this node output it if needed.
- Node n=ns.addMappingAndRenderXNodeSet(NName,NValue,N,isRealVisible);
- if (n!=null) {
+ if (!isRealVisible && ns.removeMappingIfRender(NName)) {
+ continue;
+ }
+ //The xpath select this node output it if needed.
+ //Node n=ns.addMappingAndRenderXNodeSet(NName,NValue,N,isRealVisible);
+ Node n=ns.addMappingAndRender(NName,NValue,N);
+ if (n!=null) {
result.add(n);
if (C14nHelper.namespaceIsRelative(N)) {
Object exArgs[] = { E.getTagName(), NName, N.getNodeValue() };
throw new CanonicalizationException(
"c14n.Canonicalizer.RelativeNamespace", exArgs);
- }
- }
+ }
+ }
+ } else {
+ if (isRealVisible && NName!=XMLNS) {
+ ns.removeMapping(NName);
+ } else {
+ ns.addMapping(NName,NValue,N);
+ }
}
}
if (isRealVisible) {
@@ -254,84 +302,21 @@ public abstract class Canonicalizer20010315 extends CanonicalizerBase {
} else if ( !isVisible(xmlns)) {
//There is a definition but the xmlns is not selected by the xpath.
//then xmlns=""
- n=ns.addMappingAndRenderXNodeSet(XMLNS,"",nullNode,true);
+ n=ns.addMappingAndRender(XMLNS,"",nullNode);
}
//output the xmlns def if needed.
if (n!=null) {
result.add(n);
}
//Float all xml:* attributes of the unselected parent elements to this one.
- addXmlAttributes(E,result);
+ //addXmlAttributes(E,result);
+ xmlattrStack.getXmlnsAttr(result);
+ ns.getUnrenderedNodes(result);
+
}
return result.iterator();
}
- /**
- * Float the xml:* attributes of the unselected parent nodes to the ciurrent node.
- * @param E
- * @param result
- */
- private void addXmlAttributes(Element E, SortedSet result) {
- /* The processing of an element node E MUST be modified slightly when an
- * XPath node-set is given as input and the element's parent is omitted
- * from the node-set. The method for processing the attribute axis of an
- * element E in the node-set is enhanced. All element nodes along E's
- * ancestor axis are examined for nearest occurrences of attributes in
- * the xml namespace, such as xml:lang and xml:space (whether or not they
- * are in the node-set). From this list of attributes, remove any that are
- * in E's attribute axis (whether or not they are in the node-set). Then,
- * lexicographically merge this attribute list with the nodes of E's
- * attribute axis that are in the node-set. The result of visiting the
- * attribute axis is computed by processing the attribute nodes in this
- * merged attribute list.
- */
-
- // E is in the node-set
- Node parent = E.getParentNode();
- Map loa = new HashMap();
-
- if ((parent != null) && (parent.getNodeType() == Node.ELEMENT_NODE)
- &&!isVisible(parent)) {
-
- // parent element is not in node set
- for (Node ancestor = parent;
- (ancestor != null)
- && (ancestor.getNodeType() == Node.ELEMENT_NODE);
- ancestor = ancestor.getParentNode()) {
- Element el=((Element) ancestor);
- if (!el.hasAttributes()) {
- continue;
- }
- // for all ancestor elements
- NamedNodeMap ancestorAttrs =el.getAttributes();
-
- for (int i = 0; i < ancestorAttrs.getLength(); i++) {
-
- // for all attributes in the ancestor element
- Attr currentAncestorAttr = (Attr) ancestorAttrs.item(i);
-
- if (XML_LANG_URI.equals(
- currentAncestorAttr.getNamespaceURI())) {
-
- // do we have an xml:* ?
- if (!E.hasAttributeNS(
- XML_LANG_URI,
- currentAncestorAttr.getLocalName())) {
-
- // the xml:* attr is not in E
- if (!loa.containsKey(currentAncestorAttr.getName())) {
- loa.put(currentAncestorAttr.getName(),
- currentAncestorAttr);
- }
- }
- }
- }
- }
- }
- result.addAll(loa.values());
-
-}
-
/**
* Always throws a CanonicalizationException because this is inclusive c14n.
*
@@ -363,4 +348,43 @@ public abstract class Canonicalizer20010315 extends CanonicalizerBase {
throw new CanonicalizationException(
"c14n.Canonicalizer.UnsupportedOperation");
}
+ void circumventBugIfNeeded(XMLSignatureInput input) throws CanonicalizationException, ParserConfigurationException, IOException, SAXException {
+ if (!input.isNeedsToBeExpanded())
+ return;
+ Document doc = null;
+ if (input.getSubNode() != null) {
+ doc=XMLUtils.getOwnerDocument(input.getSubNode());
+ } else {
+ doc=XMLUtils.getOwnerDocument(input.getNodeSet());
+ }
+ XMLUtils.circumventBug2650(doc);
+
+ }
+
+ void handleParent(Element e, NameSpaceSymbTable ns) {
+ if (!e.hasAttributes()) {
+ return;
+ }
+ xmlattrStack.push(-1);
+ NamedNodeMap attrs = e.getAttributes();
+ int attrsLength = attrs.getLength();
+ for (int i = 0; i < attrsLength; i++) {
+ Attr N = (Attr) attrs.item(i);
+ if (Constants.NamespaceSpecNS!=N.getNamespaceURI()) {
+ //Not a namespace definition, ignore.
+ if (XML_LANG_URI==N.getNamespaceURI()) {
+ xmlattrStack.addXmlnsAttr(N);
+ }
+ continue;
+ }
+
+ String NName=N.getLocalName();
+ String NValue=N.getNodeValue();
+ if (XML.equals(NName)
+ && Constants.XML_LANG_SPACE_SpecNS.equals(NValue)) {
+ continue;
+ }
+ ns.addMapping(NName,NValue,N);
+ }
+ }
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315Excl.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315Excl.java
index 18f697366cf..679c7b5088b 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315Excl.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315Excl.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -21,20 +20,26 @@
*/
package com.sun.org.apache.xml.internal.security.c14n.implementations;
+import java.io.IOException;
import java.util.Iterator;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
+import javax.xml.parsers.ParserConfigurationException;
+
import com.sun.org.apache.xml.internal.security.c14n.CanonicalizationException;
import com.sun.org.apache.xml.internal.security.c14n.helper.C14nHelper;
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput;
import com.sun.org.apache.xml.internal.security.transforms.params.InclusiveNamespaces;
import com.sun.org.apache.xml.internal.security.utils.Constants;
+import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
/**
* Implements " Exclusive XML
@@ -47,6 +52,7 @@ import org.w3c.dom.Node;
* THIS implementation is a complete rewrite of the algorithm.
*
* @author Christian Geuer-Pollmann
+ * @version $Revision: 1.5 $
* @see
* XML Canonicalization, Version 1.0
*/
@@ -55,7 +61,7 @@ public abstract class Canonicalizer20010315Excl extends CanonicalizerBase {
* This Set contains the names (Strings like "xmlns" or "xmlns:foo") of
* the inclusive namespaces.
*/
- TreeSet _inclusiveNSSet = null;
+ TreeSet _inclusiveNSSet = new TreeSet();
static final String XMLNS_URI=Constants.NamespaceSpecNS;
final SortedSet result = new TreeSet(COMPARE);
/**
@@ -143,10 +149,8 @@ public abstract class Canonicalizer20010315Excl extends CanonicalizerBase {
for (int i = 0; i < attrsLength; i++) {
Attr N = (Attr) attrs.item(i);
- String NName=N.getLocalName();
- String NNodeValue=N.getNodeValue();
- if (!XMLNS_URI.equals(N.getNamespaceURI())) {
+ if (XMLNS_URI!=N.getNamespaceURI()) {
//Not a namespace definition.
//The Element is output element, add his prefix(if used) to visibyUtilized
String prefix = N.getPrefix();
@@ -157,6 +161,8 @@ public abstract class Canonicalizer20010315Excl extends CanonicalizerBase {
result.add(N);
continue;
}
+ String NName=N.getLocalName();
+ String NNodeValue=N.getNodeValue();
if (ns.addMapping(NName, NNodeValue,N)) {
//New definition check if it is relative.
@@ -168,17 +174,17 @@ public abstract class Canonicalizer20010315Excl extends CanonicalizerBase {
}
}
}
-
+ String prefix;
if (E.getNamespaceURI() != null) {
- String prefix = E.getPrefix();
+ prefix = E.getPrefix();
if ((prefix == null) || (prefix.length() == 0)) {
- visiblyUtilized.add(XMLNS);
- } else {
- visiblyUtilized.add(prefix);
+ prefix=XMLNS;
}
+
} else {
- visiblyUtilized.add(XMLNS);
+ prefix=XMLNS;
}
+ visiblyUtilized.add(prefix);
//This can be optimezed by I don't have time
Iterator it=visiblyUtilized.iterator();
@@ -211,12 +217,6 @@ public abstract class Canonicalizer20010315Excl extends CanonicalizerBase {
}
- /** @inheritDoc */
- public byte[] engineCanonicalizeXPathNodeSet(Set xpathNodeSet
- ) throws CanonicalizationException {
- return engineCanonicalizeXPathNodeSet(xpathNodeSet,"");
- }
-
/**
* @inheritDoc
* @param E
@@ -236,21 +236,20 @@ public abstract class Canonicalizer20010315Excl extends CanonicalizerBase {
//The prefix visibly utilized(in the attribute or in the name) in the element
Set visiblyUtilized =null;
//It's the output selected.
- boolean isOutputElement = isVisible(E);
+ boolean isOutputElement=isVisibleDO(E,ns.getLevel())==1;
if (isOutputElement) {
visiblyUtilized = (Set) this._inclusiveNSSet.clone();
}
for (int i = 0; i < attrsLength; i++) {
Attr N = (Attr) attrs.item(i);
- String NName=N.getLocalName();
- String NNodeValue=N.getNodeValue();
- if ( !isVisible(N) ) {
- //The node is not in the nodeset(if there is a nodeset)
- continue;
- }
- if (!XMLNS_URI.equals(N.getNamespaceURI())) {
+
+ if (XMLNS_URI!=N.getNamespaceURI()) {
+ if ( !isVisible(N) ) {
+ //The node is not in the nodeset(if there is a nodeset)
+ continue;
+ }
//Not a namespace definition.
if (isOutputElement) {
//The Element is output element, add his prefix(if used) to visibyUtilized
@@ -263,6 +262,25 @@ public abstract class Canonicalizer20010315Excl extends CanonicalizerBase {
}
continue;
}
+ String NName=N.getLocalName();
+ if (isOutputElement && !isVisible(N) && NName!=XMLNS) {
+ ns.removeMappingIfNotRender(NName);
+ continue;
+ }
+ String NNodeValue=N.getNodeValue();
+
+ if (!isOutputElement && isVisible(N) && _inclusiveNSSet.contains(NName) && !ns.removeMappingIfRender(NName)) {
+ Node n=ns.addMappingAndRender(NName,NNodeValue,N);
+ if (n!=null) {
+ result.add(n);
+ if (C14nHelper.namespaceIsRelative(N)) {
+ Object exArgs[] = { E.getTagName(), NName, N.getNodeValue() };
+ throw new CanonicalizationException(
+ "c14n.Canonicalizer.RelativeNamespace", exArgs);
+ }
+ }
+ }
+
if (ns.addMapping(NName, NNodeValue,N)) {
@@ -306,18 +324,20 @@ public abstract class Canonicalizer20010315Excl extends CanonicalizerBase {
}
result.add(key);
}
- } else /*if (_circunvented)*/ {
- Iterator it=this._inclusiveNSSet.iterator();
- while (it.hasNext()) {
- String s=(String)it.next();
- Attr key=ns.getMappingWithoutRendered(s);
- if (key==null) {
- continue;
- }
- result.add(key);
- }
}
return result.iterator();
}
+ void circumventBugIfNeeded(XMLSignatureInput input) throws CanonicalizationException, ParserConfigurationException, IOException, SAXException {
+ if (!input.isNeedsToBeExpanded() || _inclusiveNSSet.isEmpty())
+ return;
+ Document doc = null;
+ if (input.getSubNode() != null) {
+ doc=XMLUtils.getOwnerDocument(input.getSubNode());
+ } else {
+ doc=XMLUtils.getOwnerDocument(input.getNodeSet());
+ }
+
+ XMLUtils.circumventBug2650(doc);
+ }
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315ExclWithComments.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315ExclWithComments.java
index 025502bd5fe..37550124879 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315ExclWithComments.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315ExclWithComments.java
@@ -28,6 +28,7 @@ import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
/**
* Class Canonicalizer20010315ExclWithComments
*
+ * @version $Revision: 1.5 $
*/
public class Canonicalizer20010315ExclWithComments
extends Canonicalizer20010315Excl {
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315WithComments.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315WithComments.java
index 539bb3a3957..4714e165bba 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315WithComments.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/Canonicalizer20010315WithComments.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/CanonicalizerBase.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/CanonicalizerBase.java
index 8108763750f..05f22d8c1e8 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/CanonicalizerBase.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/CanonicalizerBase.java
@@ -27,9 +27,11 @@ import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
+import java.util.Map;
import java.util.Set;
import javax.xml.parsers.DocumentBuilderFactory;
@@ -45,7 +47,6 @@ import com.sun.org.apache.xml.internal.security.utils.UnsyncByteArrayOutputStrea
import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
import org.w3c.dom.Attr;
import org.w3c.dom.Comment;
-import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
@@ -57,6 +58,7 @@ import org.xml.sax.SAXException;
* Abstract base class for canonicalization algorithms.
*
* @author Christian Geuer-Pollmann
+ * @version $Revision: 1.5 $
*/
public abstract class CanonicalizerBase extends CanonicalizerSpi {
//Constants to be outputed, In char array form, so
@@ -122,6 +124,18 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
throws CanonicalizationException {
return engineCanonicalizeSubTree(rootNode,(Node)null);
}
+ /**
+ * Method engineCanonicalizeXPathNodeSet
+ * @inheritDoc
+ * @param xpathNodeSet
+ * @throws CanonicalizationException
+ */
+ public byte[] engineCanonicalizeXPathNodeSet(Set xpathNodeSet)
+ throws CanonicalizationException {
+ this._xpathNodeSet = xpathNodeSet;
+ return engineCanonicalizeXPathNodeSetInternal(XMLUtils.getOwnerDocument(this._xpathNodeSet));
+ }
+
/**
* Canonicalizes a Subtree node.
* @param input the root of the subtree to canicalize
@@ -143,15 +157,8 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
return bytes;
} else if (input.isNodeSet()) {
nodeFilter=input.getNodeFilters();
- Document doc = null;
- if (input.getSubNode() != null) {
- doc=XMLUtils.getOwnerDocument(input.getSubNode());
- } else {
- doc=XMLUtils.getOwnerDocument(input.getNodeSet());
- }
- if (input.isNeedsToBeExpanded()) {
- XMLUtils.circumventBug2650(doc);
- }
+
+ circumventBugIfNeeded(input);
if (input.getSubNode() != null) {
bytes = engineCanonicalizeXPathNodeSetInternal(input.getSubNode());
@@ -173,6 +180,13 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
}
}
/**
+ * @param _writer The _writer to set.
+ */
+ public void setWriter(OutputStream _writer) {
+ this._writer = _writer;
+ }
+
+ /**
* Canonicalizes a Subtree node.
*
* @param rootNode
@@ -187,11 +201,13 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
this._excludeNode = excludeNode;
try {
NameSpaceSymbTable ns=new NameSpaceSymbTable();
+ int nodeLevel=NODE_BEFORE_DOCUMENT_ELEMENT;
if (rootNode instanceof Element) {
//Fills the nssymbtable with the definitions of the parent of the root subnode
getParentNameSpaces((Element)rootNode,ns);
+ nodeLevel=NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT;
}
- this.canonicalizeSubTree(rootNode,ns,rootNode);
+ this.canonicalizeSubTree(rootNode,ns,rootNode,nodeLevel);
this._writer.close();
if (this._writer instanceof ByteArrayOutputStream) {
byte []result=((ByteArrayOutputStream)this._writer).toByteArray();
@@ -199,6 +215,12 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
((ByteArrayOutputStream)this._writer).reset();
}
return result;
+ } else if (this._writer instanceof UnsyncByteArrayOutputStream) {
+ byte []result=((UnsyncByteArrayOutputStream)this._writer).toByteArray();
+ if (reset) {
+ ((UnsyncByteArrayOutputStream)this._writer).reset();
+ }
+ return result;
}
return null;
@@ -219,13 +241,17 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
* @throws CanonicalizationException
* @throws IOException
*/
- final void canonicalizeSubTree(Node currentNode, NameSpaceSymbTable ns,Node endnode)
+ final void canonicalizeSubTree(Node currentNode, NameSpaceSymbTable ns,Node endnode,
+ int documentLevel)
throws CanonicalizationException, IOException {
+ if (isVisibleInt(currentNode)==-1)
+ return;
Node sibling=null;
Node parentNode=null;
final OutputStream writer=this._writer;
final Node excludeNode=this._excludeNode;
final boolean includeComments=this._includeComments;
+ Map cache=new HashMap();
do {
switch (currentNode.getNodeType()) {
@@ -242,18 +268,17 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
case Node.DOCUMENT_FRAGMENT_NODE :
case Node.DOCUMENT_NODE :
ns.outputNodePush();
- //currentNode = currentNode.getFirstChild();
sibling= currentNode.getFirstChild();
break;
case Node.COMMENT_NODE :
if (includeComments) {
- outputCommentToWriter((Comment) currentNode, writer);
+ outputCommentToWriter((Comment) currentNode, writer, documentLevel);
}
break;
case Node.PROCESSING_INSTRUCTION_NODE :
- outputPItoWriter((ProcessingInstruction) currentNode, writer);
+ outputPItoWriter((ProcessingInstruction) currentNode, writer, documentLevel);
break;
case Node.TEXT_NODE :
@@ -262,6 +287,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
break;
case Node.ELEMENT_NODE :
+ documentLevel=NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT;
if (currentNode==excludeNode) {
break;
}
@@ -270,27 +296,27 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
ns.outputNodePush();
writer.write('<');
String name=currentElement.getTagName();
- writeStringToUtf8(name,writer);
+ UtfHelpper.writeByte(name,writer,cache);
Iterator attrs = this.handleAttributesSubtree(currentElement,ns);
if (attrs!=null) {
//we output all Attrs which are available
while (attrs.hasNext()) {
Attr attr = (Attr) attrs.next();
- outputAttrToWriter(attr.getNodeName(),attr.getNodeValue(), writer);
+ outputAttrToWriter(attr.getNodeName(),attr.getNodeValue(), writer,cache);
}
}
writer.write('>');
sibling= currentNode.getFirstChild();
if (sibling==null) {
writer.write(_END_TAG);
- writeStringToUtf8(name,writer);
+ UtfHelpper.writeStringToUtf8(name,writer);
writer.write('>');
//We fineshed with this level, pop to the previous definitions.
ns.outputNodePop();
- if (parentNode != null) {
+ if (parentNode != null) {
sibling= currentNode.getNextSibling();
- }
+ }
} else {
parentNode=currentElement;
}
@@ -298,7 +324,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
}
while (sibling==null && parentNode!=null) {
writer.write(_END_TAG);
- writeStringToUtf8(((Element)parentNode).getTagName(),writer);
+ UtfHelpper.writeByte(((Element)parentNode).getTagName(),writer,cache);
writer.write('>');
//We fineshed with this level, pop to the previous definitions.
ns.outputNodePop();
@@ -307,6 +333,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
sibling=parentNode.getNextSibling();
parentNode=parentNode.getParentNode();
if (!(parentNode instanceof Element)) {
+ documentLevel=NODE_AFTER_DOCUMENT_ELEMENT;
parentNode=null;
}
}
@@ -317,47 +344,8 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
} while(true);
}
- /**
- * Checks whether a Comment or ProcessingInstruction is before or after the
- * document element. This is needed for prepending or appending "\n"s.
- *
- * @param currentNode comment or pi to check
- * @return NODE_BEFORE_DOCUMENT_ELEMENT, NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT or NODE_AFTER_DOCUMENT_ELEMENT
- * @see #NODE_BEFORE_DOCUMENT_ELEMENT
- * @see #NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT
- * @see #NODE_AFTER_DOCUMENT_ELEMENT
- */
- final static int getPositionRelativeToDocumentElement(Node currentNode) {
- if ((currentNode == null) ||
- (currentNode.getParentNode().getNodeType() != Node.DOCUMENT_NODE) ) {
- return CanonicalizerBase.NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT;
- }
- Element documentElement = currentNode.getOwnerDocument().getDocumentElement();
- if ( (documentElement == null) || (documentElement == currentNode) ){
- return CanonicalizerBase.NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT;
- }
- for (Node x = currentNode; x != null; x = x.getNextSibling()) {
- if (x == documentElement) {
- return CanonicalizerBase.NODE_BEFORE_DOCUMENT_ELEMENT;
- }
- }
-
- return CanonicalizerBase.NODE_AFTER_DOCUMENT_ELEMENT;
- }
-
- /**
- * Method engineCanonicalizeXPathNodeSet
- * @inheritDoc
- * @param xpathNodeSet
- * @throws CanonicalizationException
- */
- public byte[] engineCanonicalizeXPathNodeSet(Set xpathNodeSet)
- throws CanonicalizationException {
- this._xpathNodeSet = xpathNodeSet;
- return engineCanonicalizeXPathNodeSetInternal(XMLUtils.getOwnerDocument(this._xpathNodeSet));
- }
private byte[] engineCanonicalizeXPathNodeSetInternal(Node doc)
throws CanonicalizationException {
@@ -370,6 +358,12 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
((ByteArrayOutputStream)this._writer).reset();
}
return sol;
+ } else if (this._writer instanceof UnsyncByteArrayOutputStream) {
+ byte []result=((UnsyncByteArrayOutputStream)this._writer).toByteArray();
+ if (reset) {
+ ((UnsyncByteArrayOutputStream)this._writer).reset();
+ }
+ return result;
}
return null;
} catch (UnsupportedEncodingException ex) {
@@ -390,11 +384,17 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
*/
final void canonicalizeXPathNodeSet(Node currentNode,Node endnode )
throws CanonicalizationException, IOException {
- boolean currentNodeIsVisible = false;
- NameSpaceSymbTable ns=new NameSpaceSymbTable();
+ if (isVisibleInt(currentNode)==-1)
+ return;
+ boolean currentNodeIsVisible = false;
+ NameSpaceSymbTable ns=new NameSpaceSymbTable();
+ if (currentNode instanceof Element)
+ getParentNameSpaces((Element)currentNode,ns);
Node sibling=null;
Node parentNode=null;
OutputStream writer=this._writer;
+ int documentLevel=NODE_BEFORE_DOCUMENT_ELEMENT;
+ Map cache=new HashMap();
do {
switch (currentNode.getNodeType()) {
@@ -416,14 +416,14 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
break;
case Node.COMMENT_NODE :
- if (this._includeComments && isVisible(currentNode)) {
- outputCommentToWriter((Comment) currentNode, writer);
+ if (this._includeComments && (isVisibleDO(currentNode,ns.getLevel())==1)) {
+ outputCommentToWriter((Comment) currentNode, writer, documentLevel);
}
break;
case Node.PROCESSING_INSTRUCTION_NODE :
if (isVisible(currentNode))
- outputPItoWriter((ProcessingInstruction) currentNode, writer);
+ outputPItoWriter((ProcessingInstruction) currentNode, writer, documentLevel);
break;
case Node.TEXT_NODE :
@@ -436,12 +436,6 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
|| (nextSibling.getNodeType()
== Node.CDATA_SECTION_NODE));
nextSibling = nextSibling.getNextSibling()) {
- /* The XPath data model allows to select only the first of a
- * sequence of mixed text and CDATA nodes. But we must output
- * them all, so we must search:
- *
- * @see http://nagoya.apache.org/bugzilla/show_bug.cgi?id=6329
- */
outputTextToWriter(nextSibling.getNodeValue(), writer);
currentNode=nextSibling;
sibling=currentNode.getNextSibling();
@@ -451,15 +445,21 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
break;
case Node.ELEMENT_NODE :
+ documentLevel=NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT;
Element currentElement = (Element) currentNode;
//Add a level to the nssymbtable. So latter can be pop-back.
String name=null;
- currentNodeIsVisible=isVisible(currentNode);
+ int i=isVisibleDO(currentNode,ns.getLevel());
+ if (i==-1) {
+ sibling= currentNode.getNextSibling();
+ break;
+ }
+ currentNodeIsVisible=(i==1);
if (currentNodeIsVisible) {
ns.outputNodePush();
writer.write('<');
name=currentElement.getTagName();
- writeStringToUtf8(name,writer);
+ UtfHelpper.writeByte(name,writer,cache);
} else {
ns.push();
}
@@ -469,7 +469,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
//we output all Attrs which are available
while (attrs.hasNext()) {
Attr attr = (Attr) attrs.next();
- outputAttrToWriter(attr.getNodeName(),attr.getNodeValue(), writer);
+ outputAttrToWriter(attr.getNodeName(),attr.getNodeValue(), writer,cache);
}
}
if (currentNodeIsVisible) {
@@ -480,7 +480,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
if (sibling==null) {
if (currentNodeIsVisible) {
writer.write(_END_TAG);
- writeStringToUtf8(name,writer);
+ UtfHelpper.writeByte(name,writer,cache);
writer.write('>');
//We fineshed with this level, pop to the previous definitions.
ns.outputNodePop();
@@ -498,7 +498,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
while (sibling==null && parentNode!=null) {
if (isVisible(parentNode)) {
writer.write(_END_TAG);
- writeStringToUtf8(((Element)parentNode).getTagName(),writer);
+ UtfHelpper.writeByte(((Element)parentNode).getTagName(),writer,cache);
writer.write('>');
//We fineshed with this level, pop to the previous definitions.
ns.outputNodePop();
@@ -511,6 +511,7 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
parentNode=parentNode.getParentNode();
if (!(parentNode instanceof Element)) {
parentNode=null;
+ documentLevel=NODE_AFTER_DOCUMENT_ELEMENT;
}
}
if (sibling==null)
@@ -519,12 +520,38 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
sibling=currentNode.getNextSibling();
} while(true);
}
+ int isVisibleDO(Node currentNode,int level) {
+ if (nodeFilter!=null) {
+ Iterator it=nodeFilter.iterator();
+ while (it.hasNext()) {
+ int i=((NodeFilter)it.next()).isNodeIncludeDO(currentNode,level);
+ if (i!=1)
+ return i;
+ }
+ }
+ if ((this._xpathNodeSet!=null) && !this._xpathNodeSet.contains(currentNode))
+ return 0;
+ return 1;
+ }
+ int isVisibleInt(Node currentNode) {
+ if (nodeFilter!=null) {
+ Iterator it=nodeFilter.iterator();
+ while (it.hasNext()) {
+ int i=((NodeFilter)it.next()).isNodeInclude(currentNode);
+ if (i!=1)
+ return i;
+ }
+ }
+ if ((this._xpathNodeSet!=null) && !this._xpathNodeSet.contains(currentNode))
+ return 0;
+ return 1;
+ }
boolean isVisible(Node currentNode) {
if (nodeFilter!=null) {
Iterator it=nodeFilter.iterator();
while (it.hasNext()) {
- if (!((NodeFilter)it.next()).isNodeInclude(currentNode))
+ if (((NodeFilter)it.next()).isNodeInclude(currentNode)!=1)
return false;
}
}
@@ -533,19 +560,42 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
return true;
}
+ void handleParent(Element e,NameSpaceSymbTable ns) {
+ if (!e.hasAttributes()) {
+ return;
+ }
+ NamedNodeMap attrs = e.getAttributes();
+ int attrsLength = attrs.getLength();
+ for (int i = 0; i < attrsLength; i++) {
+ Attr N = (Attr) attrs.item(i);
+ if (Constants.NamespaceSpecNS!=N.getNamespaceURI()) {
+ //Not a namespace definition, ignore.
+ continue;
+ }
+
+ String NName=N.getLocalName();
+ String NValue=N.getNodeValue();
+ if (XML.equals(NName)
+ && Constants.XML_LANG_SPACE_SpecNS.equals(NValue)) {
+ continue;
+ }
+ ns.addMapping(NName,NValue,N);
+ }
+ }
+
/**
* Adds to ns the definitons from the parent elements of el
* @param el
* @param ns
*/
- final static void getParentNameSpaces(Element el,NameSpaceSymbTable ns) {
- List parents=new ArrayList();
+ final void getParentNameSpaces(Element el,NameSpaceSymbTable ns) {
+ List parents=new ArrayList(10);
Node n1=el.getParentNode();
if (!(n1 instanceof Element)) {
return;
}
//Obtain all the parents of the elemnt
- Element parent=(Element) el.getParentNode();
+ Element parent=(Element) n1;
while (parent!=null) {
parents.add(parent);
Node n=parent.getParentNode();
@@ -557,297 +607,15 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
//Visit them in reverse order.
ListIterator it=parents.listIterator(parents.size());
while (it.hasPrevious()) {
- Element ele=(Element)it.previous();
- if (!ele.hasAttributes()) {
- continue;
+ Element ele=(Element)it.previous();
+ handleParent(ele, ns);
}
- NamedNodeMap attrs = ele.getAttributes();
- int attrsLength = attrs.getLength();
- for (int i = 0; i < attrsLength; i++) {
- Attr N = (Attr) attrs.item(i);
- if (!Constants.NamespaceSpecNS.equals(N.getNamespaceURI())) {
- //Not a namespace definition, ignore.
- continue;
- }
-
- String NName=N.getLocalName();
- String NValue=N.getNodeValue();
- if (XML.equals(NName)
- && Constants.XML_LANG_SPACE_SpecNS.equals(NValue)) {
- continue;
- }
- ns.addMapping(NName,NValue,N);
- }
- }
Attr nsprefix;
if (((nsprefix=ns.getMappingWithoutRendered("xmlns"))!=null)
&& "".equals(nsprefix.getValue())) {
ns.addMappingAndRender("xmlns","",nullNode);
}
}
- /**
- * Outputs an Attribute to the internal Writer.
- *
- * The string value of the node is modified by replacing
- *
- * all ampersands (&) with &
- * all open angle brackets (<) with <
- * all quotation mark characters with "
- * and the whitespace characters #x9
, #xA, and #xD, with character
- * references. The character references are written in uppercase
- * hexadecimal with no leading zeroes (for example, #xD
is represented
- * by the character reference 
)
- *
- *
- * @param name
- * @param value
- * @param writer
- * @throws IOException
- */
- static final void outputAttrToWriter(final String name, final String value, final OutputStream writer) throws IOException {
- writer.write(' ');
- writeStringToUtf8(name,writer);
- writer.write(equalsStr);
- byte []toWrite;
- final int length = value.length();
- for (int i=0;i < length; i++) {
- char c = value.charAt(i);
-
- switch (c) {
-
- case '&' :
- toWrite=_AMP_;
- //writer.write(_AMP_);
- break;
-
- case '<' :
- toWrite=_LT_;
- //writer.write(_LT_);
- break;
-
- case '"' :
- toWrite=_QUOT_;
- //writer.write(_QUOT_);
- break;
-
- case 0x09 : // '\t'
- toWrite=__X9_;
- //writer.write(__X9_);
- break;
-
- case 0x0A : // '\n'
- toWrite=__XA_;
- //writer.write(__XA_);
- break;
-
- case 0x0D : // '\r'
- toWrite=__XD_;
- //writer.write(__XD_);
- break;
-
- default :
- writeCharToUtf8(c,writer);
- //this._writer.write(c);
- continue;
- }
- writer.write(toWrite);
- }
-
- writer.write('\"');
- }
-
- final static void writeCharToUtf8(final char c,final OutputStream out) throws IOException{
- char ch;
- if (/*(c >= 0x0001) &&*/ (c <= 0x007F)) {
- out.write(c);
- return;
- }
- int bias;
- int write;
- if (c > 0x07FF) {
- ch=(char)(c>>>12);
- write=0xE0;
- if (ch>0) {
- write |= ( ch & 0x0F);
- }
- out.write(write);
- write=0x80;
- bias=0x3F;
- } else {
- write=0xC0;
- bias=0x1F;
- }
- ch=(char)(c>>>6);
- if (ch>0) {
- write|= (ch & bias);
- }
- out.write(write);
- out.write(0x80 | ((c) & 0x3F));
-
- }
-
- final static void writeStringToUtf8(final String str,final OutputStream out) throws IOException{
- final int length=str.length();
- int i=0;
- char c;
- while (i= 0x0001) &&*/ (c <= 0x007F)) {
- out.write(c);
- continue;
- }
- char ch;
- int bias;
- int write;
- if (c > 0x07FF) {
- ch=(char)(c>>>12);
- write=0xE0;
- if (ch>0) {
- write |= ( ch & 0x0F);
- }
- out.write(write);
- write=0x80;
- bias=0x3F;
- } else {
- write=0xC0;
- bias=0x1F;
- }
- ch=(char)(c>>>6);
- if (ch>0) {
- write|= (ch & bias);
- }
- out.write(write);
- out.write(0x80 | ((c) & 0x3F));
- continue;
-
- }
-
- }
- /**
- * Outputs a PI to the internal Writer.
- *
- * @param currentPI
- * @param writer where to write the things
- * @throws IOException
- */
- static final void outputPItoWriter(ProcessingInstruction currentPI, OutputStream writer) throws IOException {
- final int position = getPositionRelativeToDocumentElement(currentPI);
-
- if (position == NODE_AFTER_DOCUMENT_ELEMENT) {
- writer.write('\n');
- }
- writer.write(_BEGIN_PI);
-
- final String target = currentPI.getTarget();
- int length = target.length();
-
- for (int i = 0; i < length; i++) {
- char c=target.charAt(i);
- if (c==0x0D) {
- writer.write(__XD_);
- } else {
- writeCharToUtf8(c,writer);
- }
- }
-
- final String data = currentPI.getData();
-
- length = data.length();
-
- if (length > 0) {
- writer.write(' ');
-
- for (int i = 0; i < length; i++) {
- char c=data.charAt(i);
- if (c==0x0D) {
- writer.write(__XD_);
- } else {
- writeCharToUtf8(c,writer);
- }
- }
- }
-
- writer.write(_END_PI);
- if (position == NODE_BEFORE_DOCUMENT_ELEMENT) {
- writer.write('\n');
- }
- }
-
- /**
- * Method outputCommentToWriter
- *
- * @param currentComment
- * @param writer writer where to write the things
- * @throws IOException
- */
- static final void outputCommentToWriter(Comment currentComment, OutputStream writer) throws IOException {
- final int position = getPositionRelativeToDocumentElement(currentComment);
- if (position == NODE_AFTER_DOCUMENT_ELEMENT) {
- writer.write('\n');
- }
- writer.write(_BEGIN_COMM);
-
- final String data = currentComment.getData();
- final int length = data.length();
-
- for (int i = 0; i < length; i++) {
- char c=data.charAt(i);
- if (c==0x0D) {
- writer.write(__XD_);
- } else {
- writeCharToUtf8(c,writer);
- }
- }
-
- writer.write(_END_COMM);
- if (position == NODE_BEFORE_DOCUMENT_ELEMENT) {
- writer.write('\n');
- }
- }
-
- /**
- * Outputs a Text of CDATA section to the internal Writer.
- *
- * @param text
- * @param writer writer where to write the things
- * @throws IOException
- */
- static final void outputTextToWriter(final String text, final OutputStream writer) throws IOException {
- final int length = text.length();
- byte []toWrite;
- for (int i = 0; i < length; i++) {
- char c = text.charAt(i);
-
- switch (c) {
-
- case '&' :
- toWrite=_AMP_;
- //writer.write(_AMP_);
- break;
-
- case '<' :
- toWrite=_LT_;
- //writer.write(_LT_);
- break;
-
- case '>' :
- toWrite=_GT_;
- //writer.write(_GT_);
- break;
-
- case 0xD :
- toWrite=__XD_;
- //writer.write(__XD_);
- break;
-
- default :
- writeCharToUtf8(c,writer);
- continue;
- }
- writer.write(toWrite);
- }
- }
-
/**
* Obtain the attributes to output for this node in XPathNodeSet c14n.
*
@@ -870,13 +638,207 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
abstract Iterator handleAttributesSubtree(Element E, NameSpaceSymbTable ns)
throws CanonicalizationException;
+ abstract void circumventBugIfNeeded(XMLSignatureInput input) throws CanonicalizationException, ParserConfigurationException, IOException, SAXException;
+ /**
+ * Outputs an Attribute to the internal Writer.
+ *
+ * The string value of the node is modified by replacing
+ *
+ * all ampersands (&) with &
+ * all open angle brackets (<) with <
+ * all quotation mark characters with "
+ * and the whitespace characters #x9
, #xA, and #xD, with character
+ * references. The character references are written in uppercase
+ * hexadecimal with no leading zeroes (for example, #xD
is represented
+ * by the character reference 
)
+ *
+ *
+ * @param name
+ * @param value
+ * @param writer
+ * @throws IOException
+ */
+ static final void outputAttrToWriter(final String name, final String value, final OutputStream writer,
+ final Map cache) throws IOException {
+ writer.write(' ');
+ UtfHelpper.writeByte(name,writer,cache);
+ writer.write(equalsStr);
+ byte []toWrite;
+ final int length = value.length();
+ int i=0;
+ while (i < length) {
+ char c = value.charAt(i++);
- /**
- * @param _writer The _writer to set.
- */
- public void setWriter(OutputStream _writer) {
- this._writer = _writer;
- }
+ switch (c) {
+
+ case '&' :
+ toWrite=_AMP_;
+ break;
+
+ case '<' :
+ toWrite=_LT_;
+ break;
+
+ case '"' :
+ toWrite=_QUOT_;
+ break;
+
+ case 0x09 : // '\t'
+ toWrite=__X9_;
+ break;
+
+ case 0x0A : // '\n'
+ toWrite=__XA_;
+ break;
+
+ case 0x0D : // '\r'
+ toWrite=__XD_;
+ break;
+
+ default :
+ if (c < 0x80 ) {
+ writer.write(c);
+ } else {
+ UtfHelpper.writeCharToUtf8(c,writer);
+ };
+ continue;
+ }
+ writer.write(toWrite);
+ }
+
+ writer.write('\"');
+ }
+
+ /**
+ * Outputs a PI to the internal Writer.
+ *
+ * @param currentPI
+ * @param writer where to write the things
+ * @throws IOException
+ */
+ static final void outputPItoWriter(ProcessingInstruction currentPI, OutputStream writer,int position) throws IOException {
+
+ if (position == NODE_AFTER_DOCUMENT_ELEMENT) {
+ writer.write('\n');
+ }
+ writer.write(_BEGIN_PI);
+
+ final String target = currentPI.getTarget();
+ int length = target.length();
+
+ for (int i = 0; i < length; i++) {
+ char c=target.charAt(i);
+ if (c==0x0D) {
+ writer.write(__XD_);
+ } else {
+ if (c < 0x80) {
+ writer.write(c);
+ } else {
+ UtfHelpper.writeCharToUtf8(c,writer);
+ };
+ }
+ }
+
+ final String data = currentPI.getData();
+
+ length = data.length();
+
+ if (length > 0) {
+ writer.write(' ');
+
+ for (int i = 0; i < length; i++) {
+ char c=data.charAt(i);
+ if (c==0x0D) {
+ writer.write(__XD_);
+ } else {
+ UtfHelpper.writeCharToUtf8(c,writer);
+ }
+ }
+ }
+
+ writer.write(_END_PI);
+ if (position == NODE_BEFORE_DOCUMENT_ELEMENT) {
+ writer.write('\n');
+ }
+ }
+
+ /**
+ * Method outputCommentToWriter
+ *
+ * @param currentComment
+ * @param writer writer where to write the things
+ * @throws IOException
+ */
+ static final void outputCommentToWriter(Comment currentComment, OutputStream writer,int position) throws IOException {
+ if (position == NODE_AFTER_DOCUMENT_ELEMENT) {
+ writer.write('\n');
+ }
+ writer.write(_BEGIN_COMM);
+
+ final String data = currentComment.getData();
+ final int length = data.length();
+
+ for (int i = 0; i < length; i++) {
+ char c=data.charAt(i);
+ if (c==0x0D) {
+ writer.write(__XD_);
+ } else {
+ if (c < 0x80) {
+ writer.write(c);
+ } else {
+ UtfHelpper.writeCharToUtf8(c,writer);
+ };
+ }
+ }
+
+ writer.write(_END_COMM);
+ if (position == NODE_BEFORE_DOCUMENT_ELEMENT) {
+ writer.write('\n');
+ }
+ }
+
+ /**
+ * Outputs a Text of CDATA section to the internal Writer.
+ *
+ * @param text
+ * @param writer writer where to write the things
+ * @throws IOException
+ */
+ static final void outputTextToWriter(final String text, final OutputStream writer) throws IOException {
+ final int length = text.length();
+ byte []toWrite;
+ for (int i = 0; i < length; i++) {
+ char c = text.charAt(i);
+
+ switch (c) {
+
+ case '&' :
+ toWrite=_AMP_;
+ break;
+
+ case '<' :
+ toWrite=_LT_;
+ break;
+
+ case '>' :
+ toWrite=_GT_;
+ break;
+
+ case 0xD :
+ toWrite=__XD_;
+ break;
+
+ default :
+ if (c < 0x80) {
+ writer.write(c);
+ } else {
+ UtfHelpper.writeCharToUtf8(c,writer);
+ };
+ continue;
+ }
+ writer.write(toWrite);
+ }
+ }
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/NameSpaceSymbTable.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/NameSpaceSymbTable.java
index bad23010f11..538d369748c 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/NameSpaceSymbTable.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/NameSpaceSymbTable.java
@@ -20,16 +20,10 @@
*/
package com.sun.org.apache.xml.internal.security.c14n.implementations;
-import java.lang.reflect.Array;
-import java.util.AbstractList;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
-import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
-import java.util.Map;
-
import org.w3c.dom.Attr;
@@ -46,21 +40,26 @@ import org.w3c.dom.Node;
public class NameSpaceSymbTable {
/**The map betwen prefix-> entry table. */
- SymbMap symb = new SymbMap();
+ SymbMap symb;
/**The level of nameSpaces (for Inclusive visibility).*/
int nameSpaces=0;
/**The stacks for removing the definitions when doing pop.*/
- List level = new ArrayList();
+ List level;
boolean cloned=true;
static final String XMLNS="xmlns";
+ final static SymbMap initialMap=new SymbMap();
+ static {
+ NameSpaceSymbEntry ne=new NameSpaceSymbEntry("",null,true,XMLNS);
+ ne.lastrendered="";
+ initialMap.put(XMLNS,ne);
+ }
/**
* Default constractor
**/
public NameSpaceSymbTable() {
+ level = new ArrayList(10);
//Insert the default binding for xmlns.
- NameSpaceSymbEntry ne=new NameSpaceSymbEntry("",null,true);
- ne.lastrendered="";
- symb.put(XMLNS,ne);
+ symb=(SymbMap) initialMap.clone();
}
/**
@@ -75,8 +74,14 @@ public class NameSpaceSymbTable {
NameSpaceSymbEntry n=(NameSpaceSymbEntry)(it.next());
//put them rendered?
if ((!n.rendered) && (n.n!=null)) {
+ n=(NameSpaceSymbEntry) n.clone();
+ needsClone();
+ symb.put(n.prefix,n);
+ n.lastrendered=n.uri;
+ n.rendered=true;
+
result.add(n.n);
- n.rendered=true;
+
}
}
}
@@ -104,10 +109,6 @@ public class NameSpaceSymbTable {
**/
public void push() {
//Put the number of namespace definitions in the stack.
- /**if (cloned) {
- Object ob[]= {symb,cloned ? symb : null};
- level.add(ob);
- } **/
level.add(null);
cloned=false;
}
@@ -124,7 +125,7 @@ public class NameSpaceSymbTable {
if (size==0) {
cloned=false;
} else
- cloned=(level.get(size-1)!=symb);
+ cloned=(level.get(size-1)!=symb);
} else {
cloned=false;
}
@@ -134,8 +135,7 @@ public class NameSpaceSymbTable {
final void needsClone() {
if (!cloned) {
- level.remove(level.size()-1);
- level.add(symb);
+ level.set(level.size()-1,symb);
symb=(SymbMap) symb.clone();
cloned=true;
}
@@ -200,7 +200,7 @@ public class NameSpaceSymbTable {
return false;
}
//Creates and entry in the table for this new definition.
- NameSpaceSymbEntry ne=new NameSpaceSymbEntry(uri,n,false);
+ NameSpaceSymbEntry ne=new NameSpaceSymbEntry(uri,n,false,prefix);
needsClone();
symb.put(prefix, ne);
if (ob != null) {
@@ -238,7 +238,7 @@ public class NameSpaceSymbTable {
return null;
}
- NameSpaceSymbEntry ne=new NameSpaceSymbEntry(uri,n,true);
+ NameSpaceSymbEntry ne=new NameSpaceSymbEntry(uri,n,true,prefix);
ne.lastrendered=uri;
needsClone();
symb.put(prefix, ne);
@@ -251,53 +251,38 @@ public class NameSpaceSymbTable {
}
return ne.n;
}
- /**
- * Adds & gets(if needed) the attribute node that defines the binding for the prefix.
- * Take on account if the rules of rendering in the inclusive c14n.
- * For inclusive c14n.
- * @param prefix the prefix to obtain the attribute.
- * @param outputNode the container element is an output element.
- * @param uri the Uri of the definition
- * @param n the attribute that have the definition
- * @return null if there is no need to render the prefix. Otherwise the node of
- * definition.
- **/
- public Node addMappingAndRenderXNodeSet(String prefix, String uri,Attr n,boolean outputNode) {
+
+ public int getLevel() {
+ // TODO Auto-generated method stub
+ return level.size();
+ }
+
+ public void removeMapping(String prefix) {
NameSpaceSymbEntry ob = symb.get(prefix);
- int visibleNameSpaces=nameSpaces;
- if ((ob!=null) && uri.equals(ob.uri)) {
- if (!ob.rendered) {
- ob=(NameSpaceSymbEntry)ob.clone();
- needsClone();
- symb.put(prefix,ob);
- ob.rendered=true;
- ob.level=visibleNameSpaces;
- return ob.n;
- }
- ob=(NameSpaceSymbEntry)ob.clone();
+
+ if (ob!=null) {
needsClone();
- symb.put(prefix,ob);
- if (outputNode && (((visibleNameSpaces-ob.level)<2) || XMLNS.equals(prefix)) ) {
- ob.level=visibleNameSpaces;
- return null; //Already rendered, just return nulll
- }
- ob.level=visibleNameSpaces;
- return ob.n;
- }
+ symb.put(prefix,null);
+ }
+ }
- NameSpaceSymbEntry ne=new NameSpaceSymbEntry(uri,n,true);
- ne.level=nameSpaces;
- ne.rendered=true;
- needsClone();
- symb.put(prefix, ne);
- if (ob != null) {
- ne.lastrendered=ob.lastrendered;
+ public void removeMappingIfNotRender(String prefix) {
+ NameSpaceSymbEntry ob = symb.get(prefix);
- if ((ob.lastrendered!=null)&& (ob.lastrendered.equals(uri))) {
- ne.rendered=true;
- }
- }
- return ne.n;
+ if (ob!=null && !ob.rendered) {
+ needsClone();
+ symb.put(prefix,null);
+ }
+ }
+
+ public boolean removeMappingIfRender(String prefix) {
+ NameSpaceSymbEntry ob = symb.get(prefix);
+
+ if (ob!=null && ob.rendered) {
+ needsClone();
+ symb.put(prefix,null);
+ }
+ return false;
}
}
@@ -305,10 +290,11 @@ public class NameSpaceSymbTable {
* The internal structure of NameSpaceSymbTable.
**/
class NameSpaceSymbEntry implements Cloneable {
- NameSpaceSymbEntry(String name,Attr n,boolean rendered) {
+ NameSpaceSymbEntry(String name,Attr n,boolean rendered,String prefix) {
this.uri=name;
this.rendered=rendered;
this.n=n;
+ this.prefix=prefix;
}
/** @inheritDoc */
public Object clone() {
@@ -320,6 +306,7 @@ class NameSpaceSymbEntry implements Cloneable {
}
/** The level where the definition was rendered(Only for inclusive) */
int level=0;
+ String prefix;
/**The URI that the prefix defines */
String uri;
/**The last output in the URI for this prefix (This for speed reason).*/
@@ -330,53 +317,57 @@ class NameSpaceSymbEntry implements Cloneable {
Attr n;
};
-class SymbMap implements Cloneable{
- int free=23;
- NameSpaceSymbEntry[] entries=new NameSpaceSymbEntry[free];
- String[] keys=new String[free];
-
- void put(String key, NameSpaceSymbEntry value) {
+class SymbMap implements Cloneable {
+ int free=23;
+ NameSpaceSymbEntry[] entries;
+ String[] keys;
+ SymbMap() {
+ entries=new NameSpaceSymbEntry[free];
+ keys=new String[free];
+ }
+ void put(String key, NameSpaceSymbEntry value) {
int index = index(key);
- Object oldKey = keys[index];
- keys[index] = key;
- entries[index] = value;
+ Object oldKey = keys[index];
+ keys[index] = key;
+ entries[index] = value;
if (oldKey==null || !oldKey.equals(key)) {
- if (--free == 0) {
- free=entries.length;
- int newCapacity = free<<2;
- rehash(newCapacity);
- }
+ if (--free == 0) {
+ free=entries.length;
+ int newCapacity = free<<2;
+ rehash(newCapacity);
+ }
}
}
List entrySet() {
- List a=new ArrayList();
- for (int i=0;iint value
@@ -384,37 +375,38 @@ class SymbMap implements Cloneable{
protected void rehash(int newCapacity) {
int oldCapacity = keys.length;
String oldKeys[] = keys;
- NameSpaceSymbEntry oldVals[] = entries;
+ NameSpaceSymbEntry oldVals[] = entries;
- keys = new String[newCapacity];
- entries = new NameSpaceSymbEntry[newCapacity];
+ keys = new String[newCapacity];
+ entries = new NameSpaceSymbEntry[newCapacity];
for (int i = oldCapacity; i-- > 0;) {
if(oldKeys[i] != null) {
String o = oldKeys[i];
int index = index(o);
- keys[index] = o;
- entries[index] = oldVals[i];
+ keys[index] = o;
+ entries[index] = oldVals[i];
}
}
}
- NameSpaceSymbEntry get(String key) {
- return entries[index(key)];
- }
- protected Object clone() {
- // TODO Auto-generated method stub
- try {
- SymbMap copy=(SymbMap) super.clone();
- copy.entries=new NameSpaceSymbEntry[entries.length];
- System.arraycopy(entries,0,copy.entries,0,entries.length);
- copy.keys=new String[keys.length];
- System.arraycopy(keys,0,copy.keys,0,keys.length);
- return copy;
- } catch (CloneNotSupportedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
+ NameSpaceSymbEntry get(String key) {
+ return entries[index(key)];
+ }
+
+ protected Object clone() {
+ try {
+ SymbMap copy=(SymbMap) super.clone();
+ copy.entries=new NameSpaceSymbEntry[entries.length];
+ System.arraycopy(entries,0,copy.entries,0,entries.length);
+ copy.keys=new String[keys.length];
+ System.arraycopy(keys,0,copy.keys,0,keys.length);
+
+ return copy;
+ } catch (CloneNotSupportedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
}
+ return null;
+ }
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/UtfHelpper.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/UtfHelpper.java
new file mode 100644
index 00000000000..cfcc06dd2c4
--- /dev/null
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/c14n/implementations/UtfHelpper.java
@@ -0,0 +1,155 @@
+package com.sun.org.apache.xml.internal.security.c14n.implementations;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Map;
+
+public class UtfHelpper {
+
+ final static void writeByte(final String str,final OutputStream out,Map cache) throws IOException {
+ byte []result=(byte[]) cache.get(str);
+ if (result==null) {
+ result=getStringInUtf8(str);
+ cache.put(str,result);
+ }
+
+ out.write(result);
+
+ }
+
+ final static void writeCharToUtf8(final char c,final OutputStream out) throws IOException{
+ if (c < 0x80) {
+ out.write(c);
+ return;
+ }
+ if ((c >= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF) ){
+ //No Surrogates in sun java
+ out.write(0x3f);
+ return;
+ }
+ int bias;
+ int write;
+ char ch;
+ if (c > 0x07FF) {
+ ch=(char)(c>>>12);
+ write=0xE0;
+ if (ch>0) {
+ write |= ( ch & 0x0F);
+ }
+ out.write(write);
+ write=0x80;
+ bias=0x3F;
+ } else {
+ write=0xC0;
+ bias=0x1F;
+ }
+ ch=(char)(c>>>6);
+ if (ch>0) {
+ write|= (ch & bias);
+ }
+ out.write(write);
+ out.write(0x80 | ((c) & 0x3F));
+
+ }
+
+ final static void writeStringToUtf8(final String str,final OutputStream out) throws IOException{
+ final int length=str.length();
+ int i=0;
+ char c;
+ while (i= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF) ){
+ //No Surrogates in sun java
+ out.write(0x3f);
+ continue;
+ }
+ char ch;
+ int bias;
+ int write;
+ if (c > 0x07FF) {
+ ch=(char)(c>>>12);
+ write=0xE0;
+ if (ch>0) {
+ write |= ( ch & 0x0F);
+ }
+ out.write(write);
+ write=0x80;
+ bias=0x3F;
+ } else {
+ write=0xC0;
+ bias=0x1F;
+ }
+ ch=(char)(c>>>6);
+ if (ch>0) {
+ write|= (ch & bias);
+ }
+ out.write(write);
+ out.write(0x80 | ((c) & 0x3F));
+
+ }
+
+ }
+ public final static byte[] getStringInUtf8(final String str) {
+ final int length=str.length();
+ boolean expanded=false;
+ byte []result=new byte[length];
+ int i=0;
+ int out=0;
+ char c;
+ while (i= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF) ){
+ //No Surrogates in sun java
+ result[out++]=0x3f;
+
+ continue;
+ }
+ if (!expanded) {
+ byte newResult[]=new byte[3*length];
+ System.arraycopy(result, 0, newResult, 0, out);
+ result=newResult;
+ expanded=true;
+ }
+ char ch;
+ int bias;
+ byte write;
+ if (c > 0x07FF) {
+ ch=(char)(c>>>12);
+ write=(byte)0xE0;
+ if (ch>0) {
+ write |= ( ch & 0x0F);
+ }
+ result[out++]=write;
+ write=(byte)0x80;
+ bias=0x3F;
+ } else {
+ write=(byte)0xC0;
+ bias=0x1F;
+ }
+ ch=(char)(c>>>6);
+ if (ch>0) {
+ write|= (ch & bias);
+ }
+ result[out++]=write;
+ result[out++]=(byte)(0x80 | ((c) & 0x3F));/**/
+
+ }
+ if (expanded) {
+ byte newResult[]=new byte[out];
+ System.arraycopy(result, 0, newResult, 0, out);
+ result=newResult;
+ }
+ return result;
+ }
+
+
+
+}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/encryption/XMLCipher.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/encryption/XMLCipher.java
index 7814216496d..683acdbf003 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/encryption/XMLCipher.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/encryption/XMLCipher.java
@@ -22,6 +22,7 @@ package com.sun.org.apache.xml.internal.security.encryption;
import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
@@ -30,6 +31,7 @@ import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@@ -204,7 +206,7 @@ public class XMLCipher {
* @since 1.0.
*/
private XMLCipher() {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Constructing XMLCipher...");
+ logger.log(java.util.logging.Level.FINE, "Constructing XMLCipher...");
_factory = new Factory();
_serializer = new Serializer();
@@ -266,7 +268,7 @@ public class XMLCipher {
public static XMLCipher getInstance(String transformation) throws
XMLEncryptionException {
// sanity checks
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Getting XMLCipher...");
+ logger.log(java.util.logging.Level.FINE, "Getting XMLCipher...");
if (null == transformation)
logger.log(java.util.logging.Level.SEVERE, "Transformation unexpectedly null...");
if(!isValidEncryptionAlgorithm(transformation))
@@ -294,7 +296,7 @@ public class XMLCipher {
try {
instance._contextCipher = Cipher.getInstance(jceAlgorithm);
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "cihper.algoritm = " +
+ logger.log(java.util.logging.Level.FINE, "cihper.algoritm = " +
instance._contextCipher.getAlgorithm());
} catch (NoSuchAlgorithmException nsae) {
throw new XMLEncryptionException("empty", nsae);
@@ -305,49 +307,6 @@ public class XMLCipher {
return (instance);
}
- public static XMLCipher getInstance(String transformation,Cipher cipher) throws
- XMLEncryptionException {
- // sanity checks
- logger.log(java.util.logging.Level.FINE, "Getting XMLCipher...");
- if (null == transformation)
- logger.log(java.util.logging.Level.SEVERE, "Transformation unexpectedly null...");
- if(!isValidEncryptionAlgorithm(transformation))
- logger.log(java.util.logging.Level.WARNING, "Algorithm non-standard, expected one of " + ENC_ALGORITHMS);
-
- XMLCipher instance = new XMLCipher();
-
- instance._algorithm = transformation;
- instance._key = null;
- instance._kek = null;
-
-
- /* Create a canonicaliser - used when serialising DOM to octets
- * prior to encryption (and for the reverse) */
-
- try {
- instance._canon = Canonicalizer.getInstance
- (Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS);
-
- } catch (InvalidCanonicalizerException ice) {
- throw new XMLEncryptionException("empty", ice);
- }
-
- String jceAlgorithm = JCEMapper.translateURItoJCEID(transformation);
-
- try {
- instance._contextCipher = cipher;
- //Cipher.getInstance(jceAlgorithm);
- logger.log(java.util.logging.Level.FINE, "cihper.algoritm = " +
- instance._contextCipher.getAlgorithm());
- }catch(Exception ex) {
- throw new XMLEncryptionException("empty", ex);
- }
-
- return (instance);
- }
-
-
-
/**
* Returns an XMLCipher
that implements the specified
* transformation, operates on the specified context document and serializes
@@ -380,6 +339,45 @@ public class XMLCipher {
return instance;
}
+ public static XMLCipher getInstance(String transformation,Cipher cipher) throws XMLEncryptionException {
+ // sanity checks
+ logger.log(java.util.logging.Level.FINE, "Getting XMLCipher...");
+ if (null == transformation)
+ logger.log(java.util.logging.Level.SEVERE, "Transformation unexpectedly null...");
+ if(!isValidEncryptionAlgorithm(transformation))
+ logger.log(java.util.logging.Level.WARNING, "Algorithm non-standard, expected one of " + ENC_ALGORITHMS);
+
+ XMLCipher instance = new XMLCipher();
+
+ instance._algorithm = transformation;
+ instance._key = null;
+ instance._kek = null;
+
+
+ /* Create a canonicaliser - used when serialising DOM to octets
+ * prior to encryption (and for the reverse) */
+
+ try {
+ instance._canon = Canonicalizer.getInstance
+ (Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS);
+
+ } catch (InvalidCanonicalizerException ice) {
+ throw new XMLEncryptionException("empty", ice);
+ }
+
+ String jceAlgorithm = JCEMapper.translateURItoJCEID(transformation);
+
+ try {
+ instance._contextCipher = cipher;
+ //Cipher.getInstance(jceAlgorithm);
+ logger.log(java.util.logging.Level.FINE, "cihper.algoritm = " +
+ instance._contextCipher.getAlgorithm());
+ }catch(Exception ex) {
+ throw new XMLEncryptionException("empty", ex);
+ }
+
+ return (instance);
+ }
/**
* Returns an XMLCipher
that implements the specified
@@ -396,7 +394,7 @@ public class XMLCipher {
public static XMLCipher getProviderInstance(String transformation, String provider)
throws XMLEncryptionException {
// sanity checks
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Getting XMLCipher...");
+ logger.log(java.util.logging.Level.FINE, "Getting XMLCipher...");
if (null == transformation)
logger.log(java.util.logging.Level.SEVERE, "Transformation unexpectedly null...");
if(null == provider)
@@ -429,9 +427,9 @@ public class XMLCipher {
instance._contextCipher = Cipher.getInstance(jceAlgorithm, provider);
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "cipher._algorithm = " +
+ logger.log(java.util.logging.Level.FINE, "cipher._algorithm = " +
instance._contextCipher.getAlgorithm());
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "provider.name = " + provider);
+ logger.log(java.util.logging.Level.FINE, "provider.name = " + provider);
} catch (NoSuchAlgorithmException nsae) {
throw new XMLEncryptionException("empty", nsae);
} catch (NoSuchProviderException nspre) {
@@ -490,7 +488,7 @@ public class XMLCipher {
public static XMLCipher getInstance()
throws XMLEncryptionException {
// sanity checks
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Getting XMLCipher for no transformation...");
+ logger.log(java.util.logging.Level.FINE, "Getting XMLCipher for no transformation...");
XMLCipher instance = new XMLCipher();
@@ -532,7 +530,7 @@ public class XMLCipher {
throws XMLEncryptionException {
// sanity checks
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Getting XMLCipher, provider but no transformation");
+ logger.log(java.util.logging.Level.FINE, "Getting XMLCipher, provider but no transformation");
if(null == provider)
logger.log(java.util.logging.Level.SEVERE, "Provider unexpectedly null..");
if("" == provider)
@@ -578,7 +576,7 @@ public class XMLCipher {
*/
public void init(int opmode, Key key) throws XMLEncryptionException {
// sanity checks
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Initializing XMLCipher...");
+ logger.log(java.util.logging.Level.FINE, "Initializing XMLCipher...");
_ek = null;
_ed = null;
@@ -586,18 +584,18 @@ public class XMLCipher {
switch (opmode) {
case ENCRYPT_MODE :
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "opmode = ENCRYPT_MODE");
+ logger.log(java.util.logging.Level.FINE, "opmode = ENCRYPT_MODE");
_ed = createEncryptedData(CipherData.VALUE_TYPE, "NO VALUE YET");
break;
case DECRYPT_MODE :
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "opmode = DECRYPT_MODE");
+ logger.log(java.util.logging.Level.FINE, "opmode = DECRYPT_MODE");
break;
case WRAP_MODE :
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "opmode = WRAP_MODE");
+ logger.log(java.util.logging.Level.FINE, "opmode = WRAP_MODE");
_ek = createEncryptedKey(CipherData.VALUE_TYPE, "NO VALUE YET");
break;
case UNWRAP_MODE :
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "opmode = UNWRAP_MODE");
+ logger.log(java.util.logging.Level.FINE, "opmode = UNWRAP_MODE");
break;
default :
logger.log(java.util.logging.Level.SEVERE, "Mode unexpectedly invalid");
@@ -622,7 +620,7 @@ public class XMLCipher {
public EncryptedData getEncryptedData() {
// Sanity checks
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Returning EncryptedData");
+ logger.log(java.util.logging.Level.FINE, "Returning EncryptedData");
return _ed;
}
@@ -640,7 +638,7 @@ public class XMLCipher {
public EncryptedKey getEncryptedKey() {
// Sanity checks
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Returning EncryptedKey");
+ logger.log(java.util.logging.Level.FINE, "Returning EncryptedKey");
return _ek;
}
@@ -750,11 +748,11 @@ public class XMLCipher {
*/
private Document encryptElement(Element element) throws Exception{
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Encrypting element...");
+ logger.log(java.util.logging.Level.FINE, "Encrypting element...");
if(null == element)
logger.log(java.util.logging.Level.SEVERE, "Element unexpectedly null...");
if(_cipherMode != ENCRYPT_MODE)
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
+ logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
if (_algorithm == null) {
throw new XMLEncryptionException("XMLCipher instance without transformation specified");
@@ -785,11 +783,11 @@ public class XMLCipher {
*/
private Document encryptElementContent(Element element) throws
/* XMLEncryption */Exception {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Encrypting element content...");
+ logger.log(java.util.logging.Level.FINE, "Encrypting element content...");
if(null == element)
logger.log(java.util.logging.Level.SEVERE, "Element unexpectedly null...");
if(_cipherMode != ENCRYPT_MODE)
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
+ logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
if (_algorithm == null) {
throw new XMLEncryptionException("XMLCipher instance without transformation specified");
@@ -815,7 +813,7 @@ public class XMLCipher {
*/
public Document doFinal(Document context, Document source) throws
/* XMLEncryption */Exception {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Processing source document...");
+ logger.log(java.util.logging.Level.FINE, "Processing source document...");
if(null == context)
logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
if(null == source)
@@ -855,7 +853,7 @@ public class XMLCipher {
*/
public Document doFinal(Document context, Element element) throws
/* XMLEncryption */Exception {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Processing source element...");
+ logger.log(java.util.logging.Level.FINE, "Processing source element...");
if(null == context)
logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
if(null == element)
@@ -898,7 +896,7 @@ public class XMLCipher {
*/
public Document doFinal(Document context, Element element, boolean content)
throws /* XMLEncryption*/ Exception {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Processing source element...");
+ logger.log(java.util.logging.Level.FINE, "Processing source element...");
if(null == context)
logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
if(null == element)
@@ -952,6 +950,34 @@ public class XMLCipher {
return encryptData(context, element, false);
}
+ /**
+ * Returns an EncryptedData
interface. Use this operation if
+ * you want to have full control over the serialization of the element
+ * or element content.
+ *
+ * This does not change the source document in any way.
+ *
+ * @param context the context Document
.
+ * @param type a URI identifying type information about the plaintext form
+ * of the encrypted content (may be null
)
+ * @param serializedData the serialized data
+ * @return the EncryptedData
+ * @throws Exception
+ */
+ public EncryptedData encryptData(Document context, String type,
+ InputStream serializedData) throws Exception {
+
+ logger.log(java.util.logging.Level.FINE, "Encrypting element...");
+ if (null == context)
+ logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
+ if (null == serializedData)
+ logger.log(java.util.logging.Level.SEVERE, "Serialized data unexpectedly null...");
+ if (_cipherMode != ENCRYPT_MODE)
+ logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
+
+ return encryptData(context, null, type, serializedData);
+ }
+
/**
* Returns an EncryptedData
interface. Use this operation if
* you want to have full control over the contents of the
@@ -966,160 +992,60 @@ public class XMLCipher {
* @return the EncryptedData
* @throws Exception
*/
- public EncryptedData encryptData(Document context, Element element, boolean contentMode) throws
- /* XMLEncryption */ Exception {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Encrypting element...");
- if (null == context)
- logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
- if (null == element)
- logger.log(java.util.logging.Level.SEVERE, "Element unexpectedly null...");
- if (_cipherMode != ENCRYPT_MODE)
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
+ public EncryptedData encryptData(
+ Document context, Element element, boolean contentMode)
+ throws /* XMLEncryption */ Exception {
- _contextDocument = context;
-
- if (_algorithm == null) {
- throw new XMLEncryptionException("XMLCipher instance without transformation specified");
- }
-
- String serializedOctets = null;
- if (contentMode) {
- NodeList children = element.getChildNodes();
- if ((null != children)) {
- serializedOctets = _serializer.serialize(children);
- } else {
- Object exArgs[] = { "Element has no content." };
- throw new XMLEncryptionException("empty", exArgs);
- }
- } else {
- serializedOctets = _serializer.serialize(element);
- }
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Serialized octets:\n" + serializedOctets);
-
- byte[] encryptedBytes = null;
-
- // Now create the working cipher if none was created already
- Cipher c;
- if (_contextCipher == null) {
- String jceAlgorithm =
- JCEMapper.translateURItoJCEID(_algorithm);
-
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "alg = " + jceAlgorithm);
-
- try {
- if (_requestedJCEProvider == null)
- c = Cipher.getInstance(jceAlgorithm);
- else
- c = Cipher.getInstance(jceAlgorithm, _requestedJCEProvider);
- } catch (NoSuchAlgorithmException nsae) {
- throw new XMLEncryptionException("empty", nsae);
- } catch (NoSuchProviderException nspre) {
- throw new XMLEncryptionException("empty", nspre);
- } catch (NoSuchPaddingException nspae) {
- throw new XMLEncryptionException("empty", nspae);
- }
- }
- else {
- c = _contextCipher;
- }
- // Now perform the encryption
-
- try {
- // Should internally generate an IV
- // todo - allow user to set an IV
- c.init(_cipherMode, _key);
- } catch (InvalidKeyException ike) {
- throw new XMLEncryptionException("empty", ike);
- }
-
- try {
- encryptedBytes =
- c.doFinal(serializedOctets.getBytes("UTF-8"));
-
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Expected cipher.outputSize = " +
- Integer.toString(c.getOutputSize(
- serializedOctets.getBytes().length)));
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Actual cipher.outputSize = " +
- Integer.toString(encryptedBytes.length));
- } catch (IllegalStateException ise) {
- throw new XMLEncryptionException("empty", ise);
- } catch (IllegalBlockSizeException ibse) {
- throw new XMLEncryptionException("empty", ibse);
- } catch (BadPaddingException bpe) {
- throw new XMLEncryptionException("empty", bpe);
- } catch (UnsupportedEncodingException uee) {
- throw new XMLEncryptionException("empty", uee);
- }
-
- // Now build up to a properly XML Encryption encoded octet stream
- // IvParameterSpec iv;
-
- byte[] iv = c.getIV();
- byte[] finalEncryptedBytes =
- new byte[iv.length + encryptedBytes.length];
- System.arraycopy(iv, 0, finalEncryptedBytes, 0,
- iv.length);
- System.arraycopy(encryptedBytes, 0, finalEncryptedBytes,
- iv.length,
- encryptedBytes.length);
-
- String base64EncodedEncryptedOctets = Base64.encode(finalEncryptedBytes);
-
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Encrypted octets:\n" + base64EncodedEncryptedOctets);
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Encrypted octets length = " +
- base64EncodedEncryptedOctets.length());
-
- try {
- CipherData cd = _ed.getCipherData();
- CipherValue cv = cd.getCipherValue();
- // cv.setValue(base64EncodedEncryptedOctets.getBytes());
- cv.setValue(base64EncodedEncryptedOctets);
-
- if (contentMode) {
- _ed.setType(
- new URI(EncryptionConstants.TYPE_CONTENT).toString());
- } else {
- _ed.setType(
- new URI(EncryptionConstants.TYPE_ELEMENT).toString());
- }
- EncryptionMethod method =
- _factory.newEncryptionMethod(new URI(_algorithm).toString());
- _ed.setEncryptionMethod(method);
- } catch (URI.MalformedURIException mfue) {
- throw new XMLEncryptionException("empty", mfue);
- }
- return (_ed);
- }
-
-
-
- public EncryptedData encryptData(Document context, byte [] serializedOctets, boolean contentMode) throws
- /* XMLEncryption */ Exception {
logger.log(java.util.logging.Level.FINE, "Encrypting element...");
if (null == context)
logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
- if (null == serializedOctets)
- logger.log(java.util.logging.Level.SEVERE, "Canonicalized Data is unexpectedly null...");
+ if (null == element)
+ logger.log(java.util.logging.Level.SEVERE, "Element unexpectedly null...");
if (_cipherMode != ENCRYPT_MODE)
logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
+ if (contentMode) {
+ return encryptData
+ (context, element, EncryptionConstants.TYPE_CONTENT, null);
+ } else {
+ return encryptData
+ (context, element, EncryptionConstants.TYPE_ELEMENT, null);
+ }
+ }
+
+ private EncryptedData encryptData(
+ Document context, Element element, String type,
+ InputStream serializedData) throws /* XMLEncryption */ Exception {
+
_contextDocument = context;
if (_algorithm == null) {
- throw new XMLEncryptionException("XMLCipher instance without transformation specified");
+ throw new XMLEncryptionException
+ ("XMLCipher instance without transformation specified");
}
-
- logger.log(java.util.logging.Level.FINE, "Serialized octets:\n" + serializedOctets);
+ String serializedOctets = null;
+ if (serializedData == null) {
+ if (type == EncryptionConstants.TYPE_CONTENT) {
+ NodeList children = element.getChildNodes();
+ if (null != children) {
+ serializedOctets = _serializer.serialize(children);
+ } else {
+ Object exArgs[] = { "Element has no content." };
+ throw new XMLEncryptionException("empty", exArgs);
+ }
+ } else {
+ serializedOctets = _serializer.serialize(element);
+ }
+ logger.log(java.util.logging.Level.FINE, "Serialized octets:\n" + serializedOctets);
+ }
byte[] encryptedBytes = null;
// Now create the working cipher if none was created already
Cipher c;
if (_contextCipher == null) {
- String jceAlgorithm =
- JCEMapper.translateURItoJCEID(_algorithm);
-
+ String jceAlgorithm = JCEMapper.translateURItoJCEID(_algorithm);
logger.log(java.util.logging.Level.FINE, "alg = " + jceAlgorithm);
try {
@@ -1148,41 +1074,47 @@ public class XMLCipher {
}
try {
- encryptedBytes =
- c.doFinal(serializedOctets);
-
- logger.log(java.util.logging.Level.FINE, "Expected cipher.outputSize = " +
+ if (serializedData != null) {
+ int numBytes;
+ byte[] buf = new byte[8192];
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ while ((numBytes = serializedData.read(buf)) != -1) {
+ byte[] data = c.update(buf, 0, numBytes);
+ baos.write(data);
+ }
+ baos.write(c.doFinal());
+ encryptedBytes = baos.toByteArray();
+ } else {
+ encryptedBytes = c.doFinal(serializedOctets.getBytes("UTF-8"));
+ logger.log(java.util.logging.Level.FINE, "Expected cipher.outputSize = " +
Integer.toString(c.getOutputSize(
- serializedOctets.length)));
+ serializedOctets.getBytes().length)));
+ }
logger.log(java.util.logging.Level.FINE, "Actual cipher.outputSize = " +
- Integer.toString(encryptedBytes.length));
+ Integer.toString(encryptedBytes.length));
} catch (IllegalStateException ise) {
throw new XMLEncryptionException("empty", ise);
} catch (IllegalBlockSizeException ibse) {
throw new XMLEncryptionException("empty", ibse);
} catch (BadPaddingException bpe) {
throw new XMLEncryptionException("empty", bpe);
- } catch (Exception uee) {
+ } catch (UnsupportedEncodingException uee) {
throw new XMLEncryptionException("empty", uee);
}
// Now build up to a properly XML Encryption encoded octet stream
// IvParameterSpec iv;
-
byte[] iv = c.getIV();
byte[] finalEncryptedBytes =
new byte[iv.length + encryptedBytes.length];
- System.arraycopy(iv, 0, finalEncryptedBytes, 0,
- iv.length);
- System.arraycopy(encryptedBytes, 0, finalEncryptedBytes,
- iv.length,
- encryptedBytes.length);
-
+ System.arraycopy(iv, 0, finalEncryptedBytes, 0, iv.length);
+ System.arraycopy(encryptedBytes, 0, finalEncryptedBytes, iv.length,
+ encryptedBytes.length);
String base64EncodedEncryptedOctets = Base64.encode(finalEncryptedBytes);
logger.log(java.util.logging.Level.FINE, "Encrypted octets:\n" + base64EncodedEncryptedOctets);
logger.log(java.util.logging.Level.FINE, "Encrypted octets length = " +
- base64EncodedEncryptedOctets.length());
+ base64EncodedEncryptedOctets.length());
try {
CipherData cd = _ed.getCipherData();
@@ -1190,15 +1122,11 @@ public class XMLCipher {
// cv.setValue(base64EncodedEncryptedOctets.getBytes());
cv.setValue(base64EncodedEncryptedOctets);
- if (contentMode) {
- _ed.setType(
- new URI(EncryptionConstants.TYPE_CONTENT).toString());
- } else {
- _ed.setType(
- new URI(EncryptionConstants.TYPE_ELEMENT).toString());
+ if (type != null) {
+ _ed.setType(new URI(type).toString());
}
EncryptionMethod method =
- _factory.newEncryptionMethod(new URI(_algorithm).toString());
+ _factory.newEncryptionMethod(new URI(_algorithm).toString());
_ed.setEncryptionMethod(method);
} catch (URI.MalformedURIException mfue) {
throw new XMLEncryptionException("empty", mfue);
@@ -1206,7 +1134,6 @@ public class XMLCipher {
return (_ed);
}
-
/**
* Returns an EncryptedData
interface. Use this operation if
* you want to load an EncryptedData
structure from a DOM
@@ -1219,7 +1146,7 @@ public class XMLCipher {
*/
public EncryptedData loadEncryptedData(Document context, Element element)
throws XMLEncryptionException {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Loading encrypted element...");
+ logger.log(java.util.logging.Level.FINE, "Loading encrypted element...");
if(null == context)
logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
if(null == element)
@@ -1246,13 +1173,13 @@ public class XMLCipher {
public EncryptedKey loadEncryptedKey(Document context, Element element)
throws XMLEncryptionException {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Loading encrypted key...");
+ logger.log(java.util.logging.Level.FINE, "Loading encrypted key...");
if(null == context)
logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
if(null == element)
logger.log(java.util.logging.Level.SEVERE, "Element unexpectedly null...");
if(_cipherMode != UNWRAP_MODE && _cipherMode != DECRYPT_MODE)
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in UNWRAP_MODE or DECRYPT_MODE...");
+ logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in UNWRAP_MODE or DECRYPT_MODE...");
_contextDocument = context;
_ek = _factory.newEncryptedKey(element);
@@ -1290,12 +1217,12 @@ public class XMLCipher {
public EncryptedKey encryptKey(Document doc, Key key) throws
XMLEncryptionException {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Encrypting key ...");
+ logger.log(java.util.logging.Level.FINE, "Encrypting key ...");
if(null == key)
logger.log(java.util.logging.Level.SEVERE, "Key unexpectedly null...");
if(_cipherMode != WRAP_MODE)
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in WRAP_MODE...");
+ logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in WRAP_MODE...");
if (_algorithm == null) {
@@ -1313,7 +1240,7 @@ public class XMLCipher {
String jceAlgorithm =
JCEMapper.translateURItoJCEID(_algorithm);
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "alg = " + jceAlgorithm);
+ logger.log(java.util.logging.Level.FINE, "alg = " + jceAlgorithm);
try {
if (_requestedJCEProvider == null)
@@ -1345,8 +1272,8 @@ public class XMLCipher {
String base64EncodedEncryptedOctets = Base64.encode(encryptedBytes);
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Encrypted key octets:\n" + base64EncodedEncryptedOctets);
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Encrypted key octets length = " +
+ logger.log(java.util.logging.Level.FINE, "Encrypted key octets:\n" + base64EncodedEncryptedOctets);
+ logger.log(java.util.logging.Level.FINE, "Encrypted key octets length = " +
base64EncodedEncryptedOctets.length());
CipherValue cv = _ek.getCipherData().getCipherValue();
@@ -1376,10 +1303,10 @@ public class XMLCipher {
public Key decryptKey(EncryptedKey encryptedKey, String algorithm) throws
XMLEncryptionException {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Decrypting key from previously loaded EncryptedKey...");
+ logger.log(java.util.logging.Level.FINE, "Decrypting key from previously loaded EncryptedKey...");
if(_cipherMode != UNWRAP_MODE)
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in UNWRAP_MODE...");
+ logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in UNWRAP_MODE...");
if (algorithm == null) {
throw new XMLEncryptionException("Cannot decrypt a key without knowing the algorithm");
@@ -1387,7 +1314,7 @@ public class XMLCipher {
if (_key == null) {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Trying to find a KEK via key resolvers");
+ logger.log(java.util.logging.Level.FINE, "Trying to find a KEK via key resolvers");
KeyInfo ki = encryptedKey.getKeyInfo();
if (ki != null) {
@@ -1418,7 +1345,7 @@ public class XMLCipher {
JCEMapper.translateURItoJCEID(
encryptedKey.getEncryptionMethod().getAlgorithm());
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "JCE Algorithm = " + jceAlgorithm);
+ logger.log(java.util.logging.Level.FINE, "JCE Algorithm = " + jceAlgorithm);
try {
if (_requestedJCEProvider == null)
@@ -1448,7 +1375,7 @@ public class XMLCipher {
throw new XMLEncryptionException("empty", nsae);
}
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Decryption of key type " + algorithm + " OK");
+ logger.log(java.util.logging.Level.FINE, "Decryption of key type " + algorithm + " OK");
return ret;
@@ -1478,14 +1405,9 @@ public class XMLCipher {
*
* @param node the Node
to clear.
*/
- private void removeContent(Node node) {
- NodeList list = node.getChildNodes();
- if (list.getLength() > 0) {
- Node n = list.item(0);
- if (null != n) {
- n.getParentNode().removeChild(n);
- }
- removeContent(node);
+ private static void removeContent(Node node) {
+ while (node.hasChildNodes()) {
+ node.removeChild(node.getFirstChild());
}
}
@@ -1499,7 +1421,7 @@ public class XMLCipher {
private Document decryptElement(Element element) throws
XMLEncryptionException {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Decrypting element...");
+ logger.log(java.util.logging.Level.FINE, "Decrypting element...");
if(_cipherMode != DECRYPT_MODE)
logger.log(java.util.logging.Level.SEVERE, "XMLCipher unexpectedly not in DECRYPT_MODE...");
@@ -1512,7 +1434,7 @@ public class XMLCipher {
}
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Decrypted octets:\n" + octets);
+ logger.log(java.util.logging.Level.FINE, "Decrypted octets:\n" + octets);
Node sourceParent = element.getParentNode();
@@ -1573,7 +1495,7 @@ public class XMLCipher {
public byte[] decryptToByteArray(Element element)
throws XMLEncryptionException {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Decrypting to ByteArray...");
+ logger.log(java.util.logging.Level.FINE, "Decrypting to ByteArray...");
if(_cipherMode != DECRYPT_MODE)
logger.log(java.util.logging.Level.SEVERE, "XMLCipher unexpectedly not in DECRYPT_MODE...");
@@ -2226,7 +2148,7 @@ public class XMLCipher {
AgreementMethod newAgreementMethod(Element element) throws
XMLEncryptionException {
if (null == element) {
- //complain
+ throw new NullPointerException("element is null");
}
String algorithm = element.getAttributeNS(null,
@@ -2292,7 +2214,7 @@ public class XMLCipher {
CipherData newCipherData(Element element) throws
XMLEncryptionException {
if (null == element) {
- // complain
+ throw new NullPointerException("element is null");
}
int type = 0;
@@ -2352,7 +2274,7 @@ public class XMLCipher {
(Element) transformsElements.item(0);
if (transformsElement != null) {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Creating a DSIG based Transforms element");
+ logger.log(java.util.logging.Level.FINE, "Creating a DSIG based Transforms element");
try {
result.setTransforms(new TransformsImpl(transformsElement));
}
@@ -2411,34 +2333,28 @@ public class XMLCipher {
XMLEncryptionException {
EncryptedData result = null;
- NodeList dataElements = element.getElementsByTagNameNS(
- EncryptionConstants.EncryptionSpecNS,
- EncryptionConstants._TAG_CIPHERDATA);
+ NodeList dataElements = element.getElementsByTagNameNS(
+ EncryptionConstants.EncryptionSpecNS,
+ EncryptionConstants._TAG_CIPHERDATA);
- // Need to get the last CipherData found, as earlier ones will
- // be for elements in the KeyInfo lists
+ // Need to get the last CipherData found, as earlier ones will
+ // be for elements in the KeyInfo lists
Element dataElement =
- (Element) dataElements.item(dataElements.getLength() - 1);
+ (Element) dataElements.item(dataElements.getLength() - 1);
CipherData data = newCipherData(dataElement);
result = newEncryptedData(data);
- try {
- result.setId(element.getAttributeNS(
- null, EncryptionConstants._ATT_ID));
- result.setType(new URI(
- element.getAttributeNS(
- null, EncryptionConstants._ATT_TYPE)).toString());
- result.setMimeType(element.getAttributeNS(
- null, EncryptionConstants._ATT_MIMETYPE));
- result.setEncoding(new URI(
- element.getAttributeNS(
- null, Constants._ATT_ENCODING)).toString());
- } catch (URI.MalformedURIException mfue) {
- // do nothing
- }
+ result.setId(element.getAttributeNS(
+ null, EncryptionConstants._ATT_ID));
+ result.setType(
+ element.getAttributeNS(null, EncryptionConstants._ATT_TYPE));
+ result.setMimeType(element.getAttributeNS(
+ null, EncryptionConstants._ATT_MIMETYPE));
+ result.setEncoding(
+ element.getAttributeNS(null, Constants._ATT_ENCODING));
Element encryptionMethodElement =
(Element) element.getElementsByTagNameNS(
@@ -2450,18 +2366,18 @@ public class XMLCipher {
}
// BFL 16/7/03 - simple implementation
- // TODO: Work out how to handle relative URI
+ // TODO: Work out how to handle relative URI
Element keyInfoElement =
(Element) element.getElementsByTagNameNS(
Constants.SignatureSpecNS, Constants._TAG_KEYINFO).item(0);
if (null != keyInfoElement) {
- try {
- result.setKeyInfo(new KeyInfo(keyInfoElement, null));
- } catch (XMLSecurityException xse) {
- throw new XMLEncryptionException("Error loading Key Info",
- xse);
- }
+ try {
+ result.setKeyInfo(new KeyInfo(keyInfoElement, null));
+ } catch (XMLSecurityException xse) {
+ throw new XMLEncryptionException("Error loading Key Info",
+ xse);
+ }
}
// TODO: Implement
@@ -2511,31 +2427,25 @@ public class XMLCipher {
EncryptedKey newEncryptedKey(Element element) throws
XMLEncryptionException {
EncryptedKey result = null;
- NodeList dataElements = element.getElementsByTagNameNS(
- EncryptionConstants.EncryptionSpecNS,
- EncryptionConstants._TAG_CIPHERDATA);
+ NodeList dataElements = element.getElementsByTagNameNS(
+ EncryptionConstants.EncryptionSpecNS,
+ EncryptionConstants._TAG_CIPHERDATA);
Element dataElement =
- (Element) dataElements.item(dataElements.getLength() - 1);
+ (Element) dataElements.item(dataElements.getLength() - 1);
CipherData data = newCipherData(dataElement);
result = newEncryptedKey(data);
- try {
- result.setId(element.getAttributeNS(
- null, EncryptionConstants._ATT_ID));
- result.setType(new URI(
- element.getAttributeNS(
- null, EncryptionConstants._ATT_TYPE)).toString());
- result.setMimeType(element.getAttributeNS(
- null, EncryptionConstants._ATT_MIMETYPE));
- result.setEncoding(new URI(
- element.getAttributeNS(
- null, Constants._ATT_ENCODING)).toString());
- result.setRecipient(element.getAttributeNS(
- null, EncryptionConstants._ATT_RECIPIENT));
- } catch (URI.MalformedURIException mfue) {
- // do nothing
- }
+ result.setId(element.getAttributeNS(
+ null, EncryptionConstants._ATT_ID));
+ result.setType(
+ element.getAttributeNS(null, EncryptionConstants._ATT_TYPE));
+ result.setMimeType(element.getAttributeNS(
+ null, EncryptionConstants._ATT_MIMETYPE));
+ result.setEncoding(
+ element.getAttributeNS(null, Constants._ATT_ENCODING));
+ result.setRecipient(element.getAttributeNS(
+ null, EncryptionConstants._ATT_RECIPIENT));
Element encryptionMethodElement =
(Element) element.getElementsByTagNameNS(
@@ -2550,12 +2460,12 @@ public class XMLCipher {
(Element) element.getElementsByTagNameNS(
Constants.SignatureSpecNS, Constants._TAG_KEYINFO).item(0);
if (null != keyInfoElement) {
- try {
- result.setKeyInfo(new KeyInfo(keyInfoElement, null));
- } catch (XMLSecurityException xse) {
- throw new XMLEncryptionException("Error loading Key Info",
- xse);
- }
+ try {
+ result.setKeyInfo(new KeyInfo(keyInfoElement, null));
+ } catch (XMLSecurityException xse) {
+ throw new XMLEncryptionException
+ ("Error loading Key Info", xse);
+ }
}
// TODO: Implement
@@ -2581,7 +2491,8 @@ public class XMLCipher {
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_CARRIEDKEYNAME).item(0);
if (null != carriedNameElement) {
- result.setCarriedName(carriedNameElement.getNodeValue());
+ result.setCarriedName
+ (carriedNameElement.getFirstChild().getNodeValue());
}
return (result);
@@ -2680,13 +2591,8 @@ public class XMLCipher {
EncryptionProperty newEncryptionProperty(Element element) {
EncryptionProperty result = newEncryptionProperty();
- try {
- result.setTarget(new URI(
- element.getAttributeNS(
- null, EncryptionConstants._ATT_TARGET)).toString());
- } catch (URI.MalformedURIException mfue) {
- // do nothing
- }
+ result.setTarget(
+ element.getAttributeNS(null, EncryptionConstants._ATT_TARGET));
result.setId(element.getAttributeNS(
null, EncryptionConstants._ATT_ID));
// TODO: Make this lot work...
@@ -2943,7 +2849,7 @@ public class XMLCipher {
} catch (URI.MalformedURIException mfue) {
//complain
}
- algorithm = tmpAlgorithm.toString();
+ algorithmURI = tmpAlgorithm.toString();
}
//
@@ -3183,7 +3089,7 @@ public class XMLCipher {
_contextDocument, EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_CIPHERVALUE);
result.appendChild(_contextDocument.createTextNode(
- new String(cipherValue)));
+ cipherValue));
return (result);
}
@@ -3247,8 +3153,7 @@ public class XMLCipher {
}
if (null != super.getType()) {
result.setAttributeNS(
- null, EncryptionConstants._ATT_TYPE,
- super.getType().toString());
+ null, EncryptionConstants._ATT_TYPE, super.getType());
}
if (null != super.getMimeType()) {
result.setAttributeNS(
@@ -3258,7 +3163,7 @@ public class XMLCipher {
if (null != super.getEncoding()) {
result.setAttributeNS(
null, EncryptionConstants._ATT_ENCODING,
- super.getEncoding().toString());
+ super.getEncoding());
}
if (null != super.getEncryptionMethod()) {
result.appendChild(((EncryptionMethodImpl)
@@ -3383,8 +3288,7 @@ public class XMLCipher {
}
if (null != super.getType()) {
result.setAttributeNS(
- null, EncryptionConstants._ATT_TYPE,
- super.getType().toString());
+ null, EncryptionConstants._ATT_TYPE, super.getType());
}
if (null != super.getMimeType()) {
result.setAttributeNS(null,
@@ -3392,7 +3296,7 @@ public class XMLCipher {
}
if (null != super.getEncoding()) {
result.setAttributeNS(null, Constants._ATT_ENCODING,
- super.getEncoding().toString());
+ super.getEncoding());
}
if (null != getRecipient()) {
result.setAttributeNS(null,
@@ -3468,13 +3372,17 @@ public class XMLCipher {
* @param type
*/
public void setType(String type) {
- URI tmpType = null;
- try {
- tmpType = new URI(type);
- } catch (URI.MalformedURIException mfue) {
- // complain
+ if (type == null || type.length() == 0) {
+ this.type = null;
+ } else {
+ URI tmpType = null;
+ try {
+ tmpType = new URI(type);
+ } catch (URI.MalformedURIException mfue) {
+ // complain
+ }
+ this.type = tmpType.toString();
}
- this.type = tmpType.toString();
}
/**
*
@@ -3502,13 +3410,17 @@ public class XMLCipher {
* @param encoding
*/
public void setEncoding(String encoding) {
- URI tmpEncoding = null;
- try {
- tmpEncoding = new URI(encoding);
- } catch (URI.MalformedURIException mfue) {
- // complain
+ if (encoding == null || encoding.length() == 0) {
+ this.encoding = null;
+ } else {
+ URI tmpEncoding = null;
+ try {
+ tmpEncoding = new URI(encoding);
+ } catch (URI.MalformedURIException mfue) {
+ // complain
+ }
+ this.encoding = tmpEncoding.toString();
}
- this.encoding = tmpEncoding.toString();
}
/**
*
@@ -3635,7 +3547,7 @@ public class XMLCipher {
_contextDocument, EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_ENCRYPTIONMETHOD);
result.setAttributeNS(null, EncryptionConstants._ATT_ALGORITHM,
- algorithm.toString());
+ algorithm);
if (keySize > 0) {
result.appendChild(
ElementProxy.createElementForFamily(_contextDocument,
@@ -3735,8 +3647,7 @@ public class XMLCipher {
private class EncryptionPropertyImpl implements EncryptionProperty {
private String target = null;
private String id = null;
- private String attributeName = null;
- private String attributeValue = null;
+ private HashMap attributeMap = new HashMap();
private List encryptionInformation = null;
/**
@@ -3752,13 +3663,24 @@ public class XMLCipher {
}
/** @inheritDoc */
public void setTarget(String target) {
- URI tmpTarget = null;
- try {
- tmpTarget = new URI(target);
- } catch (URI.MalformedURIException mfue) {
- // complain
+ if (target == null || target.length() == 0) {
+ this.target = null;
+ } else if (target.startsWith("#")) {
+ /*
+ * This is a same document URI reference. Do not parse,
+ * because com.sun.org.apache.xml.internal.utils.URI considers this an
+ * illegal URI because it has no scheme.
+ */
+ this.target = target;
+ } else {
+ URI tmpTarget = null;
+ try {
+ tmpTarget = new URI(target);
+ } catch (URI.MalformedURIException mfue) {
+ // complain
+ }
+ this.target = tmpTarget.toString();
}
- this.target = tmpTarget.toString();
}
/** @inheritDoc */
public String getId() {
@@ -3770,12 +3692,11 @@ public class XMLCipher {
}
/** @inheritDoc */
public String getAttribute(String attribute) {
- return (attributeValue);
+ return (String) attributeMap.get(attribute);
}
/** @inheritDoc */
public void setAttribute(String attribute, String value) {
- attributeName = attribute;
- attributeValue = value;
+ attributeMap.put(attribute, value);
}
/** @inheritDoc */
public Iterator getEncryptionInformation() {
@@ -3805,7 +3726,7 @@ public class XMLCipher {
EncryptionConstants._TAG_ENCRYPTIONPROPERTY);
if (null != target) {
result.setAttributeNS(null, EncryptionConstants._ATT_TARGET,
- target.toString());
+ target);
}
if (null != id) {
result.setAttributeNS(null, EncryptionConstants._ATT_ID,
@@ -3839,7 +3760,13 @@ public class XMLCipher {
* @param doc
*/
public TransformsImpl(Document doc) {
- super(doc);
+ if (doc == null) {
+ throw new RuntimeException("Document is null");
+ }
+
+ this._doc = doc;
+ this._constructionElement = createElementForFamilyLocal(this._doc,
+ this.getBaseNamespace(), this.getBaseLocalName());
}
/**
*
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/encryption/XMLCipherInput.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/encryption/XMLCipherInput.java
index 9d1db588eb6..65b9a604b66 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/encryption/XMLCipherInput.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/encryption/XMLCipherInput.java
@@ -108,84 +108,78 @@ public class XMLCipherInput {
return null;
}
- /**
- * Internal method to get bytes in decryption mode
+ /**
+ * Internal method to get bytes in decryption mode
* @return the decripted bytes
* @throws XMLEncryptionException
- */
+ */
+ private byte[] getDecryptBytes() throws XMLEncryptionException {
- private byte[] getDecryptBytes() throws XMLEncryptionException {
-
- String base64EncodedEncryptedOctets = null;
+ String base64EncodedEncryptedOctets = null;
if (_cipherData.getDataType() == CipherData.REFERENCE_TYPE) {
- // Fun time!
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Found a reference type CipherData");
- CipherReference cr = _cipherData.getCipherReference();
+ // Fun time!
+ logger.log(java.util.logging.Level.FINE, "Found a reference type CipherData");
+ CipherReference cr = _cipherData.getCipherReference();
- // Need to wrap the uri in an Attribute node so that we can
- // Pass to the resource resolvers
+ // Need to wrap the uri in an Attribute node so that we can
+ // Pass to the resource resolvers
- Attr uriAttr = cr.getURIAsAttr();
- XMLSignatureInput input = null;
+ Attr uriAttr = cr.getURIAsAttr();
+ XMLSignatureInput input = null;
- try {
- ResourceResolver resolver =
- ResourceResolver.getInstance(uriAttr, null);
- input = resolver.resolve(uriAttr, null);
- } catch (ResourceResolverException ex) {
- throw new XMLEncryptionException("empty", ex);
- }
+ try {
+ ResourceResolver resolver =
+ ResourceResolver.getInstance(uriAttr, null);
+ input = resolver.resolve(uriAttr, null);
+ } catch (ResourceResolverException ex) {
+ throw new XMLEncryptionException("empty", ex);
+ }
- if (input != null) {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Managed to resolve URI \"" + cr.getURI() + "\"");
- }
- else {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Failed to resolve URI \"" + cr.getURI() + "\"");
- }
+ if (input != null) {
+ logger.log(java.util.logging.Level.FINE, "Managed to resolve URI \"" + cr.getURI() + "\"");
+ } else {
+ logger.log(java.util.logging.Level.FINE, "Failed to resolve URI \"" + cr.getURI() + "\"");
+ }
- // Lets see if there are any transforms
- Transforms transforms = cr.getTransforms();
- if (transforms != null) {
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Have transforms in cipher reference");
- try {
- com.sun.org.apache.xml.internal.security.transforms.Transforms dsTransforms =
- transforms.getDSTransforms();
- input = dsTransforms.performTransforms(input);
- } catch (TransformationException ex) {
- throw new XMLEncryptionException("empty", ex);
- }
- }
-
- try {
- return input.getBytes();
- }
- catch (IOException ex) {
- throw new XMLEncryptionException("empty", ex);
- } catch (CanonicalizationException ex) {
- throw new XMLEncryptionException("empty", ex);
- }
-
- // retrieve the cipher text
- } else if (_cipherData.getDataType() == CipherData.VALUE_TYPE) {
- CipherValue cv = _cipherData.getCipherValue();
- base64EncodedEncryptedOctets = new String(cv.getValue());
- } else {
- throw new XMLEncryptionException("CipherData.getDataType() returned unexpected value");
+ // Lets see if there are any transforms
+ Transforms transforms = cr.getTransforms();
+ if (transforms != null) {
+ logger.log(java.util.logging.Level.FINE, "Have transforms in cipher reference");
+ try {
+ com.sun.org.apache.xml.internal.security.transforms.Transforms dsTransforms =
+ transforms.getDSTransforms();
+ input = dsTransforms.performTransforms(input);
+ } catch (TransformationException ex) {
+ throw new XMLEncryptionException("empty", ex);
}
+ }
- if (logger.isLoggable(java.util.logging.Level.FINE)) logger.log(java.util.logging.Level.FINE, "Encrypted octets:\n" + base64EncodedEncryptedOctets);
+ try {
+ return input.getBytes();
+ } catch (IOException ex) {
+ throw new XMLEncryptionException("empty", ex);
+ } catch (CanonicalizationException ex) {
+ throw new XMLEncryptionException("empty", ex);
+ }
+
+ // retrieve the cipher text
+ } else if (_cipherData.getDataType() == CipherData.VALUE_TYPE) {
+ base64EncodedEncryptedOctets =
+ _cipherData.getCipherValue().getValue();
+ } else {
+ throw new XMLEncryptionException("CipherData.getDataType() returned unexpected value");
+ }
+
+ logger.log(java.util.logging.Level.FINE, "Encrypted octets:\n" + base64EncodedEncryptedOctets);
byte[] encryptedBytes = null;
-
try {
- encryptedBytes = Base64.decode(base64EncodedEncryptedOctets);
+ encryptedBytes = Base64.decode(base64EncodedEncryptedOctets);
} catch (Base64DecodingException bde) {
throw new XMLEncryptionException("empty", bde);
}
- return (encryptedBytes);
-
- }
-
+ return (encryptedBytes);
+ }
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/ContentHandlerAlreadyRegisteredException.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/ContentHandlerAlreadyRegisteredException.java
index e071b1474c6..6477d9bba2c 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/ContentHandlerAlreadyRegisteredException.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/ContentHandlerAlreadyRegisteredException.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -28,7 +27,7 @@ import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class ContentHandlerAlreadyRegisteredException
extends XMLSecurityException {
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/KeyInfo.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/KeyInfo.java
index 1750257f625..cf588b8d488 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/KeyInfo.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/KeyInfo.java
@@ -25,6 +25,8 @@ package com.sun.org.apache.xml.internal.security.keys;
import java.security.PublicKey;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
import java.util.List;
import javax.crypto.SecretKey;
@@ -88,15 +90,22 @@ import org.w3c.dom.NodeList;
* The containsXXX()
methods return whether the KeyInfo
* contains the corresponding type.
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class KeyInfo extends SignatureElementProxy {
/** {@link java.util.logging} logging facility */
static java.util.logging.Logger log =
java.util.logging.Logger.getLogger(KeyInfo.class.getName());
+ List x509Datas=null;
+ List encryptedKeys=null;
-
+ static final List nullList;
+ static {
+ List list = new ArrayList();
+ list.add(null);
+ nullList = Collections.unmodifiableList(list);
+ }
/**
* Constructor KeyInfo
@@ -108,7 +117,6 @@ public class KeyInfo extends SignatureElementProxy {
XMLUtils.addReturnToElement(this._constructionElement);
-
}
/**
@@ -119,8 +127,8 @@ public class KeyInfo extends SignatureElementProxy {
* @throws XMLSecurityException
*/
public KeyInfo(Element element, String BaseURI) throws XMLSecurityException {
-
super(element, BaseURI);
+ // _storageResolvers.add(null);
}
@@ -131,7 +139,7 @@ public class KeyInfo extends SignatureElementProxy {
*/
public void setId(String Id) {
- if ((this._state == MODE_SIGN) && (Id != null)) {
+ if ((Id != null)) {
this._constructionElement.setAttributeNS(null, Constants._ATT_ID, Id);
IdResolver.registerElementById(this._constructionElement, Id);
}
@@ -162,10 +170,8 @@ public class KeyInfo extends SignatureElementProxy {
*/
public void add(KeyName keyname) {
- if (this._state == MODE_SIGN) {
this._constructionElement.appendChild(keyname.getElement());
XMLUtils.addReturnToElement(this._constructionElement);
- }
}
/**
@@ -219,11 +225,8 @@ public class KeyInfo extends SignatureElementProxy {
* @param keyvalue
*/
public void add(KeyValue keyvalue) {
-
- if (this._state == MODE_SIGN) {
this._constructionElement.appendChild(keyvalue.getElement());
XMLUtils.addReturnToElement(this._constructionElement);
- }
}
/**
@@ -241,11 +244,8 @@ public class KeyInfo extends SignatureElementProxy {
* @param mgmtdata
*/
public void add(MgmtData mgmtdata) {
-
- if (this._state == MODE_SIGN) {
this._constructionElement.appendChild(mgmtdata.getElement());
XMLUtils.addReturnToElement(this._constructionElement);
- }
}
/**
@@ -254,11 +254,8 @@ public class KeyInfo extends SignatureElementProxy {
* @param pgpdata
*/
public void add(PGPData pgpdata) {
-
- if (this._state == MODE_SIGN) {
this._constructionElement.appendChild(pgpdata.getElement());
XMLUtils.addReturnToElement(this._constructionElement);
- }
}
/**
@@ -279,11 +276,8 @@ public class KeyInfo extends SignatureElementProxy {
* @param retrievalmethod
*/
public void add(RetrievalMethod retrievalmethod) {
-
- if (this._state == MODE_SIGN) {
this._constructionElement.appendChild(retrievalmethod.getElement());
XMLUtils.addReturnToElement(this._constructionElement);
- }
}
/**
@@ -292,11 +286,8 @@ public class KeyInfo extends SignatureElementProxy {
* @param spkidata
*/
public void add(SPKIData spkidata) {
-
- if (this._state == MODE_SIGN) {
this._constructionElement.appendChild(spkidata.getElement());
XMLUtils.addReturnToElement(this._constructionElement);
- }
}
/**
@@ -305,11 +296,11 @@ public class KeyInfo extends SignatureElementProxy {
* @param x509data
*/
public void add(X509Data x509data) {
-
- if (this._state == MODE_SIGN) {
+ if (x509Datas==null)
+ x509Datas=new ArrayList();
+ x509Datas.add(x509data);
this._constructionElement.appendChild(x509data.getElement());
XMLUtils.addReturnToElement(this._constructionElement);
- }
}
/**
@@ -321,12 +312,11 @@ public class KeyInfo extends SignatureElementProxy {
public void add(EncryptedKey encryptedKey)
throws XMLEncryptionException {
-
- if (this._state == MODE_SIGN) {
+ if (encryptedKeys==null)
+ encryptedKeys=new ArrayList();
+ encryptedKeys.add(encryptedKey);
XMLCipher cipher = XMLCipher.getInstance();
this._constructionElement.appendChild(cipher.martial(encryptedKey));
- }
-
}
/**
@@ -335,11 +325,8 @@ public class KeyInfo extends SignatureElementProxy {
* @param element
*/
public void addUnknownElement(Element element) {
-
- if (this._state == MODE_SIGN) {
this._constructionElement.appendChild(element);
XMLUtils.addReturnToElement(this._constructionElement);
- }
}
/**
@@ -403,6 +390,9 @@ public class KeyInfo extends SignatureElementProxy {
*@return the number of the X509Data tags
*/
public int lengthX509Data() {
+ if (x509Datas!=null) {
+ return x509Datas.size();
+ }
return this.length(Constants.SignatureSpecNS, Constants._TAG_X509DATA);
}
@@ -550,7 +540,9 @@ public class KeyInfo extends SignatureElementProxy {
* @throws XMLSecurityException
*/
public X509Data itemX509Data(int i) throws XMLSecurityException {
-
+ if (x509Datas!=null) {
+ return (X509Data) x509Datas.get(i);
+ }
Element e = XMLUtils.selectDsNode(this._constructionElement.getFirstChild(),
Constants._TAG_X509DATA,i);
@@ -569,7 +561,9 @@ public class KeyInfo extends SignatureElementProxy {
*/
public EncryptedKey itemEncryptedKey(int i) throws XMLSecurityException {
-
+ if (encryptedKeys!=null) {
+ return (EncryptedKey) encryptedKeys.get(i);
+ }
Element e =
XMLUtils.selectXencNode(this._constructionElement.getFirstChild(),
EncryptionConstants._TAG_ENCRYPTEDKEY,i);
@@ -707,20 +701,20 @@ public class KeyInfo extends SignatureElementProxy {
PublicKey pk = this.getPublicKeyFromInternalResolvers();
if (pk != null) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "I could find a key using the per-KeyInfo key resolvers");
+ log.log(java.util.logging.Level.FINE, "I could find a key using the per-KeyInfo key resolvers");
return pk;
}
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "I couldn't find a key using the per-KeyInfo key resolvers");
+ log.log(java.util.logging.Level.FINE, "I couldn't find a key using the per-KeyInfo key resolvers");
pk = this.getPublicKeyFromStaticResolvers();
if (pk != null) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "I could find a key using the system-wide key resolvers");
+ log.log(java.util.logging.Level.FINE, "I could find a key using the system-wide key resolvers");
return pk;
}
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "I couldn't find a key using the system-wide key resolvers");
+ log.log(java.util.logging.Level.FINE, "I couldn't find a key using the system-wide key resolvers");
return null;
}
@@ -732,46 +726,29 @@ public class KeyInfo extends SignatureElementProxy {
* @throws KeyResolverException
*/
PublicKey getPublicKeyFromStaticResolvers() throws KeyResolverException {
-
- for (int i = 0; i < KeyResolver.length(); i++) {
- KeyResolver keyResolver = KeyResolver.item(i);
+ int length=KeyResolver.length();
+ int storageLength=this._storageResolvers.size();
+ Iterator it= KeyResolver.iterator();
+ for (int i = 0; i < length; i++) {
+ KeyResolverSpi keyResolver = (KeyResolverSpi) it.next();
Node currentChild=this._constructionElement.getFirstChild();
+ String uri= this.getBaseURI();
while (currentChild!=null) {
if (currentChild.getNodeType() == Node.ELEMENT_NODE) {
- if (this._storageResolvers.size() == 0) {
-
- // if we do not have storage resolvers, we verify with null
- StorageResolver storage = null;
-
- if (keyResolver.canResolve((Element) currentChild,
- this.getBaseURI(), storage)) {
- PublicKey pk =
- keyResolver.resolvePublicKey((Element) currentChild,
- this.getBaseURI(),
- storage);
-
- if (pk != null) {
- return pk;
- }
- }
- } else {
- for (int k = 0; k < this._storageResolvers.size(); k++) {
+ for (int k = 0; k < storageLength; k++) {
StorageResolver storage =
(StorageResolver) this._storageResolvers.get(k);
- if (keyResolver.canResolve((Element) currentChild,
- this.getBaseURI(), storage)) {
- PublicKey pk =
- keyResolver.resolvePublicKey((Element) currentChild,
- this.getBaseURI(),
+ PublicKey pk =
+ keyResolver.engineLookupAndResolvePublicKey((Element) currentChild,
+ uri,
storage);
- if (pk != null) {
- return pk;
- }
+ if (pk != null) {
+ KeyResolver.hit(it);
+ return pk;
}
}
- }
}
currentChild=currentChild.getNextSibling();
}
@@ -786,50 +763,27 @@ public class KeyInfo extends SignatureElementProxy {
* @throws KeyResolverException
*/
PublicKey getPublicKeyFromInternalResolvers() throws KeyResolverException {
-
- for (int i = 0; i < this.lengthInternalKeyResolver(); i++) {
+ int length=lengthInternalKeyResolver();
+ int storageLength=this._storageResolvers.size();
+ for (int i = 0; i < length; i++) {
KeyResolverSpi keyResolver = this.itemInternalKeyResolver(i);
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Try " + keyResolver.getClass().getName());
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Try " + keyResolver.getClass().getName());
Node currentChild=this._constructionElement.getFirstChild();
+ String uri=this.getBaseURI();
while (currentChild!=null) {
if (currentChild.getNodeType() == Node.ELEMENT_NODE) {
- if (this._storageResolvers.size() == 0) {
-
- // if we do not have storage resolvers, we verify with null
- StorageResolver storage = null;
-
- if (keyResolver.engineCanResolve((Element) currentChild,
- this.getBaseURI(),
- storage)) {
- PublicKey pk =
- keyResolver
- .engineResolvePublicKey((Element) currentChild, this
- .getBaseURI(), storage);
+ for (int k = 0; k < storageLength; k++) {
+ StorageResolver storage =
+ (StorageResolver) this._storageResolvers.get(k);
+ PublicKey pk = keyResolver
+ .engineLookupAndResolvePublicKey((Element) currentChild, uri, storage);
if (pk != null) {
- return pk;
+ return pk;
}
}
- } else {
- for (int k = 0; k < this._storageResolvers.size(); k++) {
- StorageResolver storage =
- (StorageResolver) this._storageResolvers.get(k);
-
- if (keyResolver.engineCanResolve((Element) currentChild,
- this.getBaseURI(),
- storage)) {
- PublicKey pk = keyResolver
- .engineResolvePublicKey((Element) currentChild, this
- .getBaseURI(), storage);
-
- if (pk != null) {
- return pk;
- }
- }
- }
- }
}
currentChild=currentChild.getNextSibling();
}
@@ -850,12 +804,12 @@ public class KeyInfo extends SignatureElementProxy {
X509Certificate cert = this.getX509CertificateFromInternalResolvers();
if (cert != null) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE,
+ log.log(java.util.logging.Level.FINE,
"I could find a X509Certificate using the per-KeyInfo key resolvers");
return cert;
}
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE,
+ log.log(java.util.logging.Level.FINE,
"I couldn't find a X509Certificate using the per-KeyInfo key resolvers");
@@ -863,12 +817,12 @@ public class KeyInfo extends SignatureElementProxy {
cert = this.getX509CertificateFromStaticResolvers();
if (cert != null) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE,
+ log.log(java.util.logging.Level.FINE,
"I could find a X509Certificate using the system-wide key resolvers");
return cert;
}
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE,
+ log.log(java.util.logging.Level.FINE,
"I couldn't find a X509Certificate using the system-wide key resolvers");
@@ -885,53 +839,44 @@ public class KeyInfo extends SignatureElementProxy {
*/
X509Certificate getX509CertificateFromStaticResolvers()
throws KeyResolverException {
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Start getX509CertificateFromStaticResolvers() with "
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Start getX509CertificateFromStaticResolvers() with "
+ KeyResolver.length() + " resolvers");
+ String uri=this.getBaseURI();
+ int length= KeyResolver.length();
+ int storageLength=this._storageResolvers.size();
+ Iterator it = KeyResolver.iterator();
+ for (int i = 0; i com.sun.org.apache.xml.internal.security.keys package.
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class KeyUtils {
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/KeyInfoContent.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/KeyInfoContent.java
index ba9769043a3..4d5a7a6b975 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/KeyInfoContent.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/KeyInfoContent.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -28,7 +27,7 @@ package com.sun.org.apache.xml.internal.security.keys.content;
/**
* Empty interface just to identify Elements that can be cildren of ds:KeyInfo.
*
- * @author $Author: blautenb $
+ * @author $Author: mullan $
*/
public interface KeyInfoContent {
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/KeyName.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/KeyName.java
index dfff3c32211..6794ea67586 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/KeyName.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/KeyName.java
@@ -20,25 +20,18 @@
*/
package com.sun.org.apache.xml.internal.security.keys.content;
-
-
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
import com.sun.org.apache.xml.internal.security.utils.Constants;
import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class KeyName extends SignatureElementProxy implements KeyInfoContent {
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(KeyName.class.getName());
-
/**
* Constructor KeyName
*
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/KeyValue.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/KeyValue.java
index ab8b959f75c..0d3ee810d23 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/KeyValue.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/KeyValue.java
@@ -20,11 +20,8 @@
*/
package com.sun.org.apache.xml.internal.security.keys.content;
-
-
import java.security.PublicKey;
-
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
import com.sun.org.apache.xml.internal.security.keys.content.keyvalues.DSAKeyValue;
import com.sun.org.apache.xml.internal.security.keys.content.keyvalues.RSAKeyValue;
@@ -34,140 +31,131 @@ import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-
/**
* The KeyValue element contains a single public key that may be useful in
* validating the signature. Structured formats for defining DSA (REQUIRED)
* and RSA (RECOMMENDED) public keys are defined in Signature Algorithms
* (section 6.4). The KeyValue element may include externally defined public
- * keys values represented as PCDATA or element types from an external namespace.
+ * keys values represented as PCDATA or element types from an external
+ * namespace.
*
- * @author $Author: vishal $
+ * @author $Author: mullan $
*/
public class KeyValue extends SignatureElementProxy implements KeyInfoContent {
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(KeyValue.class.getName());
+ /**
+ * Constructor KeyValue
+ *
+ * @param doc
+ * @param dsaKeyValue
+ */
+ public KeyValue(Document doc, DSAKeyValue dsaKeyValue) {
- /**
- * Constructor KeyValue
- *
- * @param doc
- * @param dsaKeyValue
- */
- public KeyValue(Document doc, DSAKeyValue dsaKeyValue) {
+ super(doc);
- super(doc);
+ XMLUtils.addReturnToElement(this._constructionElement);
+ this._constructionElement.appendChild(dsaKeyValue.getElement());
+ XMLUtils.addReturnToElement(this._constructionElement);
+ }
- XMLUtils.addReturnToElement(this._constructionElement);
- this._constructionElement.appendChild(dsaKeyValue.getElement());
- XMLUtils.addReturnToElement(this._constructionElement);
- }
+ /**
+ * Constructor KeyValue
+ *
+ * @param doc
+ * @param rsaKeyValue
+ */
+ public KeyValue(Document doc, RSAKeyValue rsaKeyValue) {
- /**
- * Constructor KeyValue
- *
- * @param doc
- * @param rsaKeyValue
- */
- public KeyValue(Document doc, RSAKeyValue rsaKeyValue) {
+ super(doc);
- super(doc);
+ XMLUtils.addReturnToElement(this._constructionElement);
+ this._constructionElement.appendChild(rsaKeyValue.getElement());
+ XMLUtils.addReturnToElement(this._constructionElement);
+ }
- XMLUtils.addReturnToElement(this._constructionElement);
- this._constructionElement.appendChild(rsaKeyValue.getElement());
- XMLUtils.addReturnToElement(this._constructionElement);
- }
+ /**
+ * Constructor KeyValue
+ *
+ * @param doc
+ * @param unknownKeyValue
+ */
+ public KeyValue(Document doc, Element unknownKeyValue) {
- /**
- * Constructor KeyValue
- *
- * @param doc
- * @param unknownKeyValue
- */
- public KeyValue(Document doc, Element unknownKeyValue) {
+ super(doc);
- super(doc);
+ XMLUtils.addReturnToElement(this._constructionElement);
+ this._constructionElement.appendChild(unknownKeyValue);
+ XMLUtils.addReturnToElement(this._constructionElement);
+ }
- XMLUtils.addReturnToElement(this._constructionElement);
- this._constructionElement.appendChild(unknownKeyValue);
- XMLUtils.addReturnToElement(this._constructionElement);
- }
+ /**
+ * Constructor KeyValue
+ *
+ * @param doc
+ * @param pk
+ */
+ public KeyValue(Document doc, PublicKey pk) {
- /**
- * Constructor KeyValue
- *
- * @param doc
- * @param pk
- */
- public KeyValue(Document doc, PublicKey pk) {
+ super(doc);
- super(doc);
+ XMLUtils.addReturnToElement(this._constructionElement);
- XMLUtils.addReturnToElement(this._constructionElement);
+ if (pk instanceof java.security.interfaces.DSAPublicKey) {
+ DSAKeyValue dsa = new DSAKeyValue(this._doc, pk);
- if (pk instanceof java.security.interfaces.DSAPublicKey) {
- DSAKeyValue dsa = new DSAKeyValue(this._doc, pk);
+ this._constructionElement.appendChild(dsa.getElement());
+ XMLUtils.addReturnToElement(this._constructionElement);
+ } else if (pk instanceof java.security.interfaces.RSAPublicKey) {
+ RSAKeyValue rsa = new RSAKeyValue(this._doc, pk);
- this._constructionElement.appendChild(dsa.getElement());
- XMLUtils.addReturnToElement(this._constructionElement);
- } else if (pk instanceof java.security.interfaces.RSAPublicKey) {
- RSAKeyValue rsa = new RSAKeyValue(this._doc, pk);
+ this._constructionElement.appendChild(rsa.getElement());
+ XMLUtils.addReturnToElement(this._constructionElement);
+ }
+ }
- this._constructionElement.appendChild(rsa.getElement());
- XMLUtils.addReturnToElement(this._constructionElement);
- }
- }
-
- /**
- * Constructor KeyValue
- *
- * @param element
- * @param BaseURI
- * @throws XMLSecurityException
- */
- public KeyValue(Element element, String BaseURI)
+ /**
+ * Constructor KeyValue
+ *
+ * @param element
+ * @param BaseURI
+ * @throws XMLSecurityException
+ */
+ public KeyValue(Element element, String BaseURI)
throws XMLSecurityException {
- super(element, BaseURI);
- }
+ super(element, BaseURI);
+ }
- /**
- * Method getPublicKey
- *
- * @return the public key
- * @throws XMLSecurityException
- */
- public PublicKey getPublicKey() throws XMLSecurityException {
+ /**
+ * Method getPublicKey
+ *
+ * @return the public key
+ * @throws XMLSecurityException
+ */
+ public PublicKey getPublicKey() throws XMLSecurityException {
+ Element rsa = XMLUtils.selectDsNode
+ (this._constructionElement.getFirstChild(),
+ Constants._TAG_RSAKEYVALUE,0);
- Element rsa = XMLUtils.selectDsNode(this._constructionElement.getFirstChild(),
- Constants._TAG_RSAKEYVALUE,0);
-
- if (rsa != null) {
- RSAKeyValue kv = new RSAKeyValue(rsa,
- this._baseURI);
-
+ if (rsa != null) {
+ RSAKeyValue kv = new RSAKeyValue(rsa, this._baseURI);
return kv.getPublicKey();
- }
+ }
- Element dsa = XMLUtils.selectDsNode(this._constructionElement,
- Constants._TAG_DSAKEYVALUE,0);
-
-
- if (dsa != null) {
- DSAKeyValue kv = new DSAKeyValue(dsa,
- this._baseURI);
+ Element dsa = XMLUtils.selectDsNode
+ (this._constructionElement.getFirstChild(),
+ Constants._TAG_DSAKEYVALUE,0);
+ if (dsa != null) {
+ DSAKeyValue kv = new DSAKeyValue(dsa, this._baseURI);
return kv.getPublicKey();
- }
+ }
+ return null;
+ }
- return null;
- }
-
- /** @inheritDoc */
- public String getBaseLocalName() {
- return Constants._TAG_KEYVALUE;
- }
+ /** @inheritDoc */
+ public String getBaseLocalName() {
+ return Constants._TAG_KEYVALUE;
+ }
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/MgmtData.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/MgmtData.java
index 52662d9129b..185e3557170 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/MgmtData.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/MgmtData.java
@@ -20,25 +20,18 @@
*/
package com.sun.org.apache.xml.internal.security.keys.content;
-
-
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
import com.sun.org.apache.xml.internal.security.utils.Constants;
import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class MgmtData extends SignatureElementProxy implements KeyInfoContent {
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(MgmtData.class.getName());
-
/**
* Constructor MgmtData
*
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/PGPData.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/PGPData.java
index 7829c36527f..010c907a8d9 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/PGPData.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/PGPData.java
@@ -20,25 +20,18 @@
*/
package com.sun.org.apache.xml.internal.security.keys.content;
-
-
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
import com.sun.org.apache.xml.internal.security.utils.Constants;
import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy;
import org.w3c.dom.Element;
-
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
* $todo$ Implement
*/
public class PGPData extends SignatureElementProxy implements KeyInfoContent {
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(PGPData.class.getName());
-
/**
* Constructor PGPData
*
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/RetrievalMethod.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/RetrievalMethod.java
index feb8b26d3b5..3c4956b7787 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/RetrievalMethod.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/RetrievalMethod.java
@@ -20,9 +20,6 @@
*/
package com.sun.org.apache.xml.internal.security.keys.content;
-
-
-
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
import com.sun.org.apache.xml.internal.security.transforms.Transforms;
@@ -33,17 +30,13 @@ import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class RetrievalMethod extends SignatureElementProxy
implements KeyInfoContent {
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(RetrievalMethod.class.getName());
//J-
/** DSA retrieval */
public static final String TYPE_DSA = Constants.SignatureSpecNS + "DSAKeyValue";
@@ -133,7 +126,7 @@ public class RetrievalMethod extends SignatureElementProxy
try {
Element transformsElem =
- XMLUtils.selectDsNode(this._constructionElement,
+ XMLUtils.selectDsNode(this._constructionElement.getFirstChild(),
Constants
._TAG_TRANSFORMS, 0);
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/SPKIData.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/SPKIData.java
index 64bb23c6231..95cef8d5491 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/SPKIData.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/SPKIData.java
@@ -20,25 +20,18 @@
*/
package com.sun.org.apache.xml.internal.security.keys.content;
-
-
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
import com.sun.org.apache.xml.internal.security.utils.Constants;
import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy;
import org.w3c.dom.Element;
-
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
* $todo$ implement
*/
public class SPKIData extends SignatureElementProxy implements KeyInfoContent {
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(SPKIData.class.getName());
-
/**
* Constructor SPKIData
*
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/X509Data.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/X509Data.java
index d60f3ad6518..199b1dcb020 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/X509Data.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/X509Data.java
@@ -41,7 +41,7 @@ import org.w3c.dom.Node;
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class X509Data extends SignatureElementProxy implements KeyInfoContent {
@@ -72,60 +72,17 @@ public class X509Data extends SignatureElementProxy implements KeyInfoContent {
throws XMLSecurityException {
super(element, BaseURI);
-
- boolean noElements=true;
Node sibling=this._constructionElement.getFirstChild();
while (sibling!=null) {
if (sibling.getNodeType()!=Node.ELEMENT_NODE) {
sibling=sibling.getNextSibling();
continue;
}
- noElements=false;
- Element currentElem = (Element) sibling;
- sibling=sibling.getNextSibling();
- String localname = currentElem.getLocalName();
-
- if (currentElem.getNamespaceURI().equals(Constants.SignatureSpecNS)) {
- if (localname.equals(Constants._TAG_X509ISSUERSERIAL)) {
- XMLX509IssuerSerial is = new XMLX509IssuerSerial(currentElem,
- BaseURI);
-
- this.add(is);
- } else if (localname.equals(Constants._TAG_X509SKI)) {
- XMLX509SKI ski = new XMLX509SKI(currentElem, BaseURI);
-
- this.add(ski);
- } else if (localname.equals(Constants._TAG_X509SUBJECTNAME)) {
- XMLX509SubjectName sn = new XMLX509SubjectName(currentElem,
- BaseURI);
-
- this.add(sn);
- } else if (localname.equals(Constants._TAG_X509CERTIFICATE)) {
- XMLX509Certificate cert = new XMLX509Certificate(currentElem,
- BaseURI);
-
- this.add(cert);
- } else if (localname.equals(Constants._TAG_X509CRL)) {
- XMLX509CRL crl = new XMLX509CRL(currentElem, BaseURI);
-
- this.add(crl);
- } else {
- log.log(java.util.logging.Level.WARNING, "Found a " + currentElem.getTagName() + " element in "
- + Constants._TAG_X509DATA);
- this.addUnknownElement(currentElem);
- }
- } else {
- log.log(java.util.logging.Level.WARNING, "Found a " + currentElem.getTagName() + " element in "
- + Constants._TAG_X509DATA);
- this.addUnknownElement(currentElem);
- }
+ return;
}
- if (noElements) {
- Object exArgs[] = { "Elements", Constants._TAG_X509DATA };
-
- throw new XMLSecurityException("xml.WrongContent", exArgs);
- }
-
+ /* No Elements found */
+ Object exArgs[] = { "Elements", Constants._TAG_X509DATA };
+ throw new XMLSecurityException("xml.WrongContent", exArgs);
}
/**
@@ -169,11 +126,9 @@ public class X509Data extends SignatureElementProxy implements KeyInfoContent {
*/
public void add(XMLX509IssuerSerial xmlX509IssuerSerial) {
- if (this._state == MODE_SIGN) {
this._constructionElement
.appendChild(xmlX509IssuerSerial.getElement());
XMLUtils.addReturnToElement(this._constructionElement);
- }
}
/**
@@ -202,11 +157,8 @@ public class X509Data extends SignatureElementProxy implements KeyInfoContent {
* @param xmlX509SKI
*/
public void add(XMLX509SKI xmlX509SKI) {
-
- if (this._state == MODE_SIGN) {
this._constructionElement.appendChild(xmlX509SKI.getElement());
XMLUtils.addReturnToElement(this._constructionElement);
- }
}
/**
@@ -233,11 +185,8 @@ public class X509Data extends SignatureElementProxy implements KeyInfoContent {
* @param xmlX509SubjectName
*/
public void add(XMLX509SubjectName xmlX509SubjectName) {
-
- if (this._state == MODE_SIGN) {
this._constructionElement.appendChild(xmlX509SubjectName.getElement());
XMLUtils.addReturnToElement(this._constructionElement);
- }
}
/**
@@ -266,11 +215,8 @@ public class X509Data extends SignatureElementProxy implements KeyInfoContent {
* @param xmlX509Certificate
*/
public void add(XMLX509Certificate xmlX509Certificate) {
-
- if (this._state == MODE_SIGN) {
this._constructionElement.appendChild(xmlX509Certificate.getElement());
XMLUtils.addReturnToElement(this._constructionElement);
- }
}
/**
@@ -288,11 +234,8 @@ public class X509Data extends SignatureElementProxy implements KeyInfoContent {
* @param xmlX509CRL
*/
public void add(XMLX509CRL xmlX509CRL) {
-
- if (this._state == MODE_SIGN) {
this._constructionElement.appendChild(xmlX509CRL.getElement());
XMLUtils.addReturnToElement(this._constructionElement);
- }
}
/**
@@ -301,11 +244,8 @@ public class X509Data extends SignatureElementProxy implements KeyInfoContent {
* @param element
*/
public void addUnknownElement(Element element) {
-
- if (this._state == MODE_SIGN) {
this._constructionElement.appendChild(element);
XMLUtils.addReturnToElement(this._constructionElement);
- }
}
/**
@@ -479,7 +419,7 @@ public class X509Data extends SignatureElementProxy implements KeyInfoContent {
* TODO implement
**/
public Element itemUnknownElement(int i) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "itemUnknownElement not implemented:"+i);
+ log.log(java.util.logging.Level.FINE, "itemUnknownElement not implemented:"+i);
return null;
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/keyvalues/DSAKeyValue.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/keyvalues/DSAKeyValue.java
index 19fb7758f62..ef735c3dad6 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/keyvalues/DSAKeyValue.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/keyvalues/DSAKeyValue.java
@@ -20,8 +20,6 @@
*/
package com.sun.org.apache.xml.internal.security.keys.content.keyvalues;
-
-
import java.math.BigInteger;
import java.security.Key;
import java.security.KeyFactory;
@@ -39,18 +37,13 @@ import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class DSAKeyValue extends SignatureElementProxy
implements KeyValueContent {
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(DSAKeyValue.class.getName());
-
/**
* Constructor DSAKeyValue
*
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/keyvalues/KeyValueContent.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/keyvalues/KeyValueContent.java
index 608758e16ce..31e761443c5 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/keyvalues/KeyValueContent.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/keyvalues/KeyValueContent.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -32,7 +31,7 @@ import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
*
*
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*
*/
public interface KeyValueContent {
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/keyvalues/RSAKeyValue.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/keyvalues/RSAKeyValue.java
index 6fc33aded20..71b23cda593 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/keyvalues/RSAKeyValue.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/keyvalues/RSAKeyValue.java
@@ -20,8 +20,6 @@
*/
package com.sun.org.apache.xml.internal.security.keys.content.keyvalues;
-
-
import java.math.BigInteger;
import java.security.Key;
import java.security.KeyFactory;
@@ -39,19 +37,13 @@ import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class RSAKeyValue extends SignatureElementProxy
implements KeyValueContent {
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(
- RSAKeyValue.class.getName());
-
/**
* Constructor RSAKeyValue
*
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509CRL.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509CRL.java
index 7c9f5be1f69..b68c444dc08 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509CRL.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509CRL.java
@@ -20,30 +20,20 @@
*/
package com.sun.org.apache.xml.internal.security.keys.content.x509;
-
-
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
import com.sun.org.apache.xml.internal.security.utils.Constants;
import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-
/**
*
- *
- *
- *
- * @author $Author: raul $
+ * @author $Author: mullan $
*
*/
public class XMLX509CRL extends SignatureElementProxy
implements XMLX509DataContent {
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(XMLX509CRL.class.getName());
-
/**
* Constructor XMLX509CRL
*
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509Certificate.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509Certificate.java
index 51f81e52901..630d9ccc279 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509Certificate.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509Certificate.java
@@ -20,8 +20,6 @@
*/
package com.sun.org.apache.xml.internal.security.keys.content.x509;
-
-
import java.io.ByteArrayInputStream;
import java.security.PublicKey;
import java.security.cert.CertificateException;
@@ -34,18 +32,13 @@ import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class XMLX509Certificate extends SignatureElementProxy
implements XMLX509DataContent {
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(XMLX509Certificate.class.getName());
-
/** Field JCA_CERT_ID */
public static final String JCA_CERT_ID = "X.509";
@@ -146,23 +139,25 @@ public class XMLX509Certificate extends SignatureElementProxy
return null;
}
- /** @inheritDoc */
- public boolean equals(Object obj) {
+ /** @inheritDoc */
+ public boolean equals(Object obj) {
- try {
- if (!obj.getClass().getName().equals(this.getClass().getName())) {
+ if (obj == null) {
return false;
- }
+ }
+ if (!this.getClass().getName().equals(obj.getClass().getName())) {
+ return false;
+ }
+ XMLX509Certificate other = (XMLX509Certificate) obj;
+ try {
- XMLX509Certificate other = (XMLX509Certificate) obj;
-
- /** $todo$ or should be create X509Certificates and use the equals() from the Certs */
- return java.security.MessageDigest.isEqual(other.getCertificateBytes(),
- this.getCertificateBytes());
- } catch (XMLSecurityException ex) {
- return false;
- }
- }
+ /** $todo$ or should be create X509Certificates and use the equals() from the Certs */
+ return java.security.MessageDigest.isEqual
+ (other.getCertificateBytes(), this.getCertificateBytes());
+ } catch (XMLSecurityException ex) {
+ return false;
+ }
+ }
/** @inheritDoc */
public String getBaseLocalName() {
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509DataContent.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509DataContent.java
index adbf4978fec..02bf9f82d39 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509DataContent.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509DataContent.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -28,7 +27,7 @@ package com.sun.org.apache.xml.internal.security.keys.content.x509;
/**
* Just used for tagging contents that are allowed inside a ds:X509Data Element.
*
- * @author $Author: blautenb $
+ * @author $Author: mullan $
*/
public interface XMLX509DataContent {
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509IssuerSerial.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509IssuerSerial.java
index d0701592d54..1d16b2b622f 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509IssuerSerial.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509IssuerSerial.java
@@ -20,8 +20,6 @@
*/
package com.sun.org.apache.xml.internal.security.keys.content.x509;
-
-
import java.math.BigInteger;
import java.security.cert.X509Certificate;
@@ -33,148 +31,139 @@ import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class XMLX509IssuerSerial extends SignatureElementProxy
implements XMLX509DataContent {
- /** {@link java.util.logging} logging facility */
+ /** {@link java.util.logging} logging facility */
static java.util.logging.Logger log =
java.util.logging.Logger.getLogger(
XMLX509IssuerSerial.class.getName());
- /**
- * Constructor XMLX509IssuerSerial
- *
- * @param element
- * @param BaseURI
- * @throws XMLSecurityException
- */
- public XMLX509IssuerSerial(Element element, String BaseURI)
+ /**
+ * Constructor XMLX509IssuerSerial
+ *
+ * @param element
+ * @param baseURI
+ * @throws XMLSecurityException
+ */
+ public XMLX509IssuerSerial(Element element, String baseURI)
throws XMLSecurityException {
- super(element, BaseURI);
- }
+ super(element, baseURI);
+ }
- /**
- * Constructor XMLX509IssuerSerial
- *
- * @param doc
- * @param X509IssuerName
- * @param X509SerialNumber
- */
- public XMLX509IssuerSerial(Document doc, String X509IssuerName,
- BigInteger X509SerialNumber) {
+ /**
+ * Constructor XMLX509IssuerSerial
+ *
+ * @param doc
+ * @param x509IssuerName
+ * @param x509SerialNumber
+ */
+ public XMLX509IssuerSerial(Document doc, String x509IssuerName,
+ BigInteger x509SerialNumber) {
- super(doc);
+ super(doc);
+ XMLUtils.addReturnToElement(this._constructionElement);
+ addTextElement(x509IssuerName, Constants._TAG_X509ISSUERNAME);
+ addTextElement(x509SerialNumber.toString(), Constants._TAG_X509SERIALNUMBER);
+ }
- XMLUtils.addReturnToElement(this._constructionElement);
- this.addTextElement(X509IssuerName, Constants._TAG_X509ISSUERNAME);
- XMLUtils.addReturnToElement(this._constructionElement);
- this.addTextElement(X509SerialNumber.toString(), Constants._TAG_X509SERIALNUMBER);
- }
+ /**
+ * Constructor XMLX509IssuerSerial
+ *
+ * @param doc
+ * @param x509IssuerName
+ * @param x509SerialNumber
+ */
+ public XMLX509IssuerSerial(Document doc, String x509IssuerName,
+ String x509SerialNumber) {
+ this(doc, x509IssuerName, new BigInteger(x509SerialNumber));
+ }
- /**
- * Constructor XMLX509IssuerSerial
- *
- * @param doc
- * @param X509IssuerName
- * @param X509SerialNumber
- */
- public XMLX509IssuerSerial(Document doc, String X509IssuerName,
- String X509SerialNumber) {
- this(doc, X509IssuerName, new BigInteger(X509SerialNumber));
- }
+ /**
+ * Constructor XMLX509IssuerSerial
+ *
+ * @param doc
+ * @param x509IssuerName
+ * @param x509SerialNumber
+ */
+ public XMLX509IssuerSerial(Document doc, String x509IssuerName,
+ int x509SerialNumber) {
+ this(doc, x509IssuerName,
+ new BigInteger(Integer.toString(x509SerialNumber)));
+ }
- /**
- * Constructor XMLX509IssuerSerial
- *
- * @param doc
- * @param X509IssuerName
- * @param X509SerialNumber
- */
- public XMLX509IssuerSerial(Document doc, String X509IssuerName,
- int X509SerialNumber) {
- this(doc, X509IssuerName,
- new BigInteger(Integer.toString(X509SerialNumber)));
- }
+ /**
+ * Constructor XMLX509IssuerSerial
+ *
+ * @param doc
+ * @param x509certificate
+ */
+ public XMLX509IssuerSerial(Document doc, X509Certificate x509certificate) {
- /**
- * Constructor XMLX509IssuerSerial
- *
- * @param doc
- * @param x509certificate
- */
- public XMLX509IssuerSerial(Document doc, X509Certificate x509certificate) {
+ this(doc,
+ RFC2253Parser.normalize(x509certificate.getIssuerDN().getName()),
+ x509certificate.getSerialNumber());
+ }
- this(doc,
- RFC2253Parser.normalize(x509certificate.getIssuerDN().getName()),
- x509certificate.getSerialNumber());
- }
+ /**
+ * Method getSerialNumber
+ *
+ * @return the serial number
+ */
+ public BigInteger getSerialNumber() {
- /**
- * Method getSerialNumber
- *
- *
- * @return the serial number
- */
- public BigInteger getSerialNumber() {
+ String text = this.getTextFromChildElement
+ (Constants._TAG_X509SERIALNUMBER, Constants.SignatureSpecNS);
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "X509SerialNumber text: " + text);
- String text =
- this.getTextFromChildElement(Constants._TAG_X509SERIALNUMBER,
- Constants.SignatureSpecNS);
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "In dem X509SerialNumber wurde gefunden: " + text);
+ return new BigInteger(text);
+ }
- return new BigInteger(text);
- }
+ /**
+ * Method getSerialNumberInteger
+ *
+ * @return the serial number as plain int
+ */
+ public int getSerialNumberInteger() {
+ return this.getSerialNumber().intValue();
+ }
- /**
- * Method getSerialNumberInteger
- *
- *
- * @return the serial number as plain int
- */
- public int getSerialNumberInteger() {
- return this.getSerialNumber().intValue();
- }
+ /**
+ * Method getIssuerName
+ *
+ * @return the issuer name
+ */
+ public String getIssuerName() {
- /**
- * Method getIssuerName
- *
- *
- * @return the issuer name
- */
- public String getIssuerName() {
+ return RFC2253Parser
+ .normalize(this
+ .getTextFromChildElement(Constants._TAG_X509ISSUERNAME,
+ Constants.SignatureSpecNS));
+ }
- return RFC2253Parser
- .normalize(this
- .getTextFromChildElement(Constants._TAG_X509ISSUERNAME,
- Constants.SignatureSpecNS));
- }
+ /** @inheritDoc */
+ public boolean equals(Object obj) {
- /** @inheritDoc */
- public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (!this.getClass().getName().equals(obj.getClass().getName())) {
+ return false;
+ }
- if (!obj.getClass().getName().equals(this.getClass().getName())) {
- return false;
- }
+ XMLX509IssuerSerial other = (XMLX509IssuerSerial) obj;
- XMLX509IssuerSerial other = (XMLX509IssuerSerial) obj;
+ return this.getSerialNumber().equals(other.getSerialNumber())
+ && this.getIssuerName().equals(other.getIssuerName());
+ }
-
- if (other.getSerialNumber().equals(this.getSerialNumber())
- && other.getIssuerName().equals(this.getIssuerName())) {
- return true;
- }
-
- return false;
- }
-
- /** @inheritDoc */
- public String getBaseLocalName() {
- return Constants._TAG_X509ISSUERSERIAL;
- }
+ /** @inheritDoc */
+ public String getBaseLocalName() {
+ return Constants._TAG_X509ISSUERSERIAL;
+ }
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509SKI.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509SKI.java
index fcbb19e245a..fbbb17e6a54 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509SKI.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509SKI.java
@@ -20,8 +20,6 @@
*/
package com.sun.org.apache.xml.internal.security.keys.content.x509;
-
-
import java.io.IOException;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
@@ -36,192 +34,143 @@ import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-import sun.security.util.DerValue;
-
-
/**
* Handles SubjectKeyIdentifier (SKI) for X.509v3.
*
- * @author $Author: raul $
- * @see Interface X509Extension
+ * @author $Author: mullan $
+ * @see Interface X509Extension
*/
public class XMLX509SKI extends SignatureElementProxy
implements XMLX509DataContent {
- /** {@link java.util.logging} logging facility */
+ /** {@link java.util.logging} logging facility */
static java.util.logging.Logger log =
java.util.logging.Logger.getLogger(XMLX509SKI.class.getName());
- /**
- * SubjectKeyIdentifier (id-ce-subjectKeyIdentifier) (2.5.29.14)
:
- * This extension identifies the public key being certified. It enables
- * distinct keys used by the same subject to be differentiated
- * (e.g., as key updating occurs).
- *
- * A key identifer shall be unique with respect to all key identifiers
- * for the subject with which it is used. This extension is always non-critical.
- */
- public static final String SKI_OID = "2.5.29.14";
+ /**
+ * SubjectKeyIdentifier (id-ce-subjectKeyIdentifier) (2.5.29.14)
:
+ * This extension identifies the public key being certified. It enables
+ * distinct keys used by the same subject to be differentiated
+ * (e.g., as key updating occurs).
+ *
+ * A key identifer shall be unique with respect to all key identifiers
+ * for the subject with which it is used. This extension is always non-critical.
+ */
+ public static final String SKI_OID = "2.5.29.14";
- /**
- * Constructor X509SKI
- *
- * @param doc
- * @param skiBytes
- */
- public XMLX509SKI(Document doc, byte[] skiBytes) {
+ /**
+ * Constructor X509SKI
+ *
+ * @param doc
+ * @param skiBytes
+ */
+ public XMLX509SKI(Document doc, byte[] skiBytes) {
+ super(doc);
+ this.addBase64Text(skiBytes);
+ }
- super(doc);
-
- this.addBase64Text(skiBytes);
- }
-
- /**
- * Constructor XMLX509SKI
- *
- * @param doc
- * @param x509certificate
- * @throws XMLSecurityException
- */
- public XMLX509SKI(Document doc, X509Certificate x509certificate)
+ /**
+ * Constructor XMLX509SKI
+ *
+ * @param doc
+ * @param x509certificate
+ * @throws XMLSecurityException
+ */
+ public XMLX509SKI(Document doc, X509Certificate x509certificate)
throws XMLSecurityException {
+ super(doc);
+ this.addBase64Text(XMLX509SKI.getSKIBytesFromCert(x509certificate));
+ }
- super(doc);
-
- this.addBase64Text(XMLX509SKI.getSKIBytesFromCert(x509certificate));
- }
-
- /**
- * Constructor XMLX509SKI
- *
- * @param element
- * @param BaseURI
- * @throws XMLSecurityException
- */
- public XMLX509SKI(Element element, String BaseURI)
+ /**
+ * Constructor XMLX509SKI
+ *
+ * @param element
+ * @param BaseURI
+ * @throws XMLSecurityException
+ */
+ public XMLX509SKI(Element element, String BaseURI)
throws XMLSecurityException {
- super(element, BaseURI);
- }
+ super(element, BaseURI);
+ }
- /**
- * Method getSKIBytes
- *
- * @return the skibytes
- * @throws XMLSecurityException
- */
- public byte[] getSKIBytes() throws XMLSecurityException {
- return this.getBytesFromTextChild();
- }
+ /**
+ * Method getSKIBytes
+ *
+ * @return the skibytes
+ * @throws XMLSecurityException
+ */
+ public byte[] getSKIBytes() throws XMLSecurityException {
+ return this.getBytesFromTextChild();
+ }
- /**
- * Method getSKIBytesFromCert
- *
- * @param cert
- * @return sky bytes from the given certificate
- *
- * @throws XMLSecurityException
- * @see java.security.cert.X509Extension#getExtensionValue(java.lang.String)
- */
- public static byte[] getSKIBytesFromCert(X509Certificate cert)
- throws XMLSecurityException {
+ /**
+ * Method getSKIBytesFromCert
+ *
+ * @param cert
+ * @return ski bytes from the given certificate
+ *
+ * @throws XMLSecurityException
+ * @see java.security.cert.X509Extension#getExtensionValue(java.lang.String)
+ */
+ public static byte[] getSKIBytesFromCert(X509Certificate cert)
+ throws XMLSecurityException {
- try {
-
- /*
- * Gets the DER-encoded OCTET string for the extension value (extnValue)
- * identified by the passed-in oid String. The oid string is
- * represented by a set of positive whole numbers separated by periods.
- */
- byte[] derEncodedValue = cert.getExtensionValue(XMLX509SKI.SKI_OID);
-
- if (cert.getVersion() < 3) {
+ if (cert.getVersion() < 3) {
Object exArgs[] = { new Integer(cert.getVersion()) };
-
throw new XMLSecurityException("certificate.noSki.lowVersion",
exArgs);
- }
+ }
- byte[] extensionValue = null;
-
- /**
- * Use sun.security.util.DerValue if it is present.
- */
- try {
- DerValue dervalue = new DerValue(derEncodedValue);
- if (dervalue == null) {
- throw new XMLSecurityException("certificate.noSki.null");
- }
- if (dervalue.tag != DerValue.tag_OctetString) {
- throw new XMLSecurityException("certificate.noSki.notOctetString");
- }
- extensionValue = dervalue.getOctetString();
- } catch (NoClassDefFoundError e) {
- }
-
- /**
- * Fall back to org.bouncycastle.asn1.DERInputStream
- */
- if (extensionValue == null) {
- try {
- Class clazz = Class.forName("org.bouncycastle.asn1.DERInputStream");
- if (clazz != null) {
- Constructor constructor = clazz.getConstructor(new Class[]{InputStream.class});
- InputStream is = (InputStream) constructor.newInstance(new Object[]{new ByteArrayInputStream(derEncodedValue)});
- Method method = clazz.getMethod("readObject", new Class[]{});
- Object obj = method.invoke(is, new Object[]{});
- if (obj == null) {
- throw new XMLSecurityException("certificate.noSki.null");
- }
- Class clazz2 = Class.forName("org.bouncycastle.asn1.ASN1OctetString");
- if (!clazz2.isInstance(obj)) {
- throw new XMLSecurityException("certificate.noSki.notOctetString");
- }
- Method method2 = clazz2.getMethod("getOctets", new Class[]{});
- extensionValue = (byte[]) method2.invoke(obj, new Object[]{});
- }
- } catch (Throwable t) {
- }
- }
-
- /**
- * Strip away first two bytes from the DerValue (tag and length)
- */
- byte abyte0[] = new byte[extensionValue.length - 2];
-
- System.arraycopy(extensionValue, 2, abyte0, 0, abyte0.length);
-
- /*
- byte abyte0[] = new byte[derEncodedValue.length - 4];
- System.arraycopy(derEncodedValue, 4, abyte0, 0, abyte0.length);
+ /*
+ * Gets the DER-encoded OCTET string for the extension value
+ * (extnValue) identified by the passed-in oid String. The oid
+ * string is represented by a set of positive whole numbers
+ * separated by periods.
*/
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Base64 of SKI is " + Base64.encode(abyte0));
+ byte[] extensionValue = cert.getExtensionValue(XMLX509SKI.SKI_OID);
+ if (extensionValue == null) {
+ throw new XMLSecurityException("certificate.noSki.null");
+ }
- return abyte0;
- } catch (IOException ex) {
- throw new XMLSecurityException("generic.EmptyMessage", ex);
- }
- }
+ /**
+ * Strip away first four bytes from the extensionValue
+ * The first two bytes are the tag and length of the extensionValue
+ * OCTET STRING, and the next two bytes are the tag and length of
+ * the skid OCTET STRING.
+ */
+ byte skidValue[] = new byte[extensionValue.length - 4];
- /** @inheritDoc */
- public boolean equals(Object obj) {
+ System.arraycopy(extensionValue, 4, skidValue, 0, skidValue.length);
- if (!obj.getClass().getName().equals(this.getClass().getName())) {
- return false;
- }
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "Base64 of SKI is " + Base64.encode(skidValue));
+ }
- XMLX509SKI other = (XMLX509SKI) obj;
+ return skidValue;
+ }
- try {
- return java.security.MessageDigest.isEqual(other.getSKIBytes(),
+ /** @inheritDoc */
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+ if (!this.getClass().getName().equals(obj.getClass().getName())) {
+ return false;
+ }
+
+ XMLX509SKI other = (XMLX509SKI) obj;
+
+ try {
+ return java.security.MessageDigest.isEqual(other.getSKIBytes(),
this.getSKIBytes());
- } catch (XMLSecurityException ex) {
- return false;
- }
- }
+ } catch (XMLSecurityException ex) {
+ return false;
+ }
+ }
- /** @inheritDoc */
- public String getBaseLocalName() {
- return Constants._TAG_X509SKI;
- }
+ /** @inheritDoc */
+ public String getBaseLocalName() {
+ return Constants._TAG_X509SKI;
+ }
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509SubjectName.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509SubjectName.java
index 548ec7ba57d..8d51da2e2fd 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509SubjectName.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/content/x509/XMLX509SubjectName.java
@@ -20,8 +20,6 @@
*/
package com.sun.org.apache.xml.internal.security.keys.content.x509;
-
-
import java.security.cert.X509Certificate;
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
@@ -33,15 +31,11 @@ import org.w3c.dom.Element;
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class XMLX509SubjectName extends SignatureElementProxy
implements XMLX509DataContent {
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(XMLX509SubjectName.class.getName());
-
/**
* Constructor X509SubjectName
*
@@ -88,23 +82,21 @@ public class XMLX509SubjectName extends SignatureElementProxy
return RFC2253Parser.normalize(this.getTextFromTextChild());
}
- /** @inheritDoc */
- public boolean equals(Object obj) {
+ /** @inheritDoc */
+ public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
- if (!obj.getClass().getName().equals(this.getClass().getName())) {
- return false;
- }
+ if (!this.getClass().getName().equals(obj.getClass().getName())) {
+ return false;
+ }
- XMLX509SubjectName other = (XMLX509SubjectName) obj;
- String otherSubject = other.getSubjectName();
- String thisSubject = this.getSubjectName();
-
- if (otherSubject.equals(thisSubject)) {
- return true;
- }
-
- return false;
+ XMLX509SubjectName other = (XMLX509SubjectName) obj;
+ String otherSubject = other.getSubjectName();
+ String thisSubject = this.getSubjectName();
+ return thisSubject.equals(otherSubject);
}
/** @inheritDoc */
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/InvalidKeyResolverException.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/InvalidKeyResolverException.java
index 6e3d408d43d..3b3508005cb 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/InvalidKeyResolverException.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/InvalidKeyResolverException.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -29,7 +28,7 @@ import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
/**
*
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class InvalidKeyResolverException extends XMLSecurityException {
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java
index 488a59731c4..1da9dbb362f 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -26,6 +25,7 @@ package com.sun.org.apache.xml.internal.security.keys.keyresolver;
import java.security.PublicKey;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import javax.crypto.SecretKey;
@@ -39,7 +39,8 @@ import org.w3c.dom.Node;
* KeyResolver is factory class for subclass of KeyResolverSpi that
* represent child element of KeyInfo.
*
- * @author $Author: raul $
+ * @author $Author: mullan $
+ * @version %I%, %G%
*/
public class KeyResolver {
@@ -72,6 +73,7 @@ public class KeyResolver {
InstantiationException {
this._resolverSpi =
(KeyResolverSpi) Class.forName(className).newInstance();
+ this._resolverSpi.setGlobalResolver(true);
}
/**
@@ -83,21 +85,17 @@ public class KeyResolver {
return KeyResolver._resolverVector.size();
}
- /**
- * Method item
- *
- * @param i
- * @return the number i resolver registerd
- * @throws KeyResolverException
- */
- public static KeyResolver item(int i) throws KeyResolverException {
-
- KeyResolver resolver = (KeyResolver) KeyResolver._resolverVector.get(i);
- if (resolver==null) {
- throw new KeyResolverException("utils.resolver.noClass");
- }
-
- return resolver;
+ public static void hit(Iterator hintI) {
+ ResolverIterator hint = (ResolverIterator) hintI;
+ int i = hint.i;
+ if (i!=1 && hint.res ==_resolverVector) {
+ List resolverVector=(List)((ArrayList)_resolverVector).clone();
+ Object ob=resolverVector.remove(i-1);
+ resolverVector.add(0,ob);
+ _resolverVector=resolverVector;
+ } else {
+ //System.out.println("KeyResolver hitting");
+ }
}
/**
@@ -106,17 +104,19 @@ public class KeyResolver {
* @param element
* @param BaseURI
* @param storage
- * @return the instance that happends to implement the thing.
+ * @return The certificate represented by the element.
*
* @throws KeyResolverException
*/
- public static final KeyResolver getInstance(
+ public static final X509Certificate getX509Certificate(
Element element, String BaseURI, StorageResolver storage)
throws KeyResolverException {
- for (int i = 0; i < KeyResolver._resolverVector.size(); i++) {
+ // use the old vector to not be hit by updates
+ List resolverVector = KeyResolver._resolverVector;
+ for (int i = 0; i < resolverVector.size(); i++) {
KeyResolver resolver=
- (KeyResolver) KeyResolver._resolverVector.get(i);
+ (KeyResolver) resolverVector.get(i);
if (resolver==null) {
Object exArgs[] = {
@@ -127,11 +127,63 @@ public class KeyResolver {
throw new KeyResolverException("utils.resolver.noClass", exArgs);
}
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "check resolvability by class " + resolver.getClass());
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "check resolvability by class " + resolver.getClass());
- if (resolver.canResolve(element, BaseURI, storage)) {
- return resolver;
+ X509Certificate cert=resolver.resolveX509Certificate(element, BaseURI, storage);
+ if (cert!=null) {
+ return cert;
+ }
+ }
+
+ Object exArgs[] = {
+ (((element != null) && (element.getNodeType() == Node.ELEMENT_NODE))
+ ? element.getTagName()
+ : "null") };
+
+ throw new KeyResolverException("utils.resolver.noClass", exArgs);
+ }
+ /**
+ * Method getInstance
+ *
+ * @param element
+ * @param BaseURI
+ * @param storage
+ * @return the public key contained in the element
+ *
+ * @throws KeyResolverException
+ */
+ public static final PublicKey getPublicKey(
+ Element element, String BaseURI, StorageResolver storage)
+ throws KeyResolverException {
+
+ List resolverVector = KeyResolver._resolverVector;
+ for (int i = 0; i < resolverVector.size(); i++) {
+ KeyResolver resolver=
+ (KeyResolver) resolverVector.get(i);
+
+ if (resolver==null) {
+ Object exArgs[] = {
+ (((element != null)
+ && (element.getNodeType() == Node.ELEMENT_NODE))
+ ? element.getTagName()
+ : "null") };
+
+ throw new KeyResolverException("utils.resolver.noClass", exArgs);
+ }
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "check resolvability by class " + resolver.getClass());
+
+ PublicKey cert=resolver.resolvePublicKey(element, BaseURI, storage);
+ if (cert!=null) {
+ if (i!=0 && resolverVector==_resolverVector) {
+ //update resolver.
+ resolverVector=(List)((ArrayList)_resolverVector).clone();
+ Object ob=resolverVector.remove(i);
+ resolverVector.add(0,ob);
+ _resolverVector=resolverVector;
+ }
+ return cert;
}
}
@@ -182,34 +234,6 @@ public class KeyResolver {
KeyResolver._resolverVector.add(0, className);
}
- /*
- * Method resolve
- *
- * @param element
- *
- * @throws KeyResolverException
- */
-
- /**
- * Method resolveStatic
- *
- * @param element
- * @param BaseURI
- * @param storage
- * @return resolve from the static register an element
- *
- * @throws KeyResolverException
- */
- public static PublicKey resolveStatic(
- Element element, String BaseURI, StorageResolver storage)
- throws KeyResolverException {
-
- KeyResolver myResolver = KeyResolver.getInstance(element, BaseURI,
- storage);
-
- return myResolver.resolvePublicKey(element, BaseURI, storage);
- }
-
/**
* Method resolve
*
@@ -223,7 +247,7 @@ public class KeyResolver {
public PublicKey resolvePublicKey(
Element element, String BaseURI, StorageResolver storage)
throws KeyResolverException {
- return this._resolverSpi.engineResolvePublicKey(element, BaseURI, storage);
+ return this._resolverSpi.engineLookupAndResolvePublicKey(element, BaseURI, storage);
}
/**
@@ -239,7 +263,7 @@ public class KeyResolver {
public X509Certificate resolveX509Certificate(
Element element, String BaseURI, StorageResolver storage)
throws KeyResolverException {
- return this._resolverSpi.engineResolveX509Certificate(element, BaseURI,
+ return this._resolverSpi.engineLookupResolveX509Certificate(element, BaseURI,
storage);
}
@@ -253,7 +277,7 @@ public class KeyResolver {
public SecretKey resolveSecretKey(
Element element, String BaseURI, StorageResolver storage)
throws KeyResolverException {
- return this._resolverSpi.engineResolveSecretKey(element, BaseURI,
+ return this._resolverSpi.engineLookupAndResolveSecretKey(element, BaseURI,
storage);
}
@@ -277,14 +301,6 @@ public class KeyResolver {
return this._resolverSpi.engineGetProperty(key);
}
- /**
- * Method getPropertyKeys
- *
- * @return the properties key registerd in this resolver
- */
- public String[] getPropertyKeys() {
- return this._resolverSpi.engineGetPropertyKeys();
- }
/**
* Method understandsProperty
@@ -296,18 +312,6 @@ public class KeyResolver {
return this._resolverSpi.understandsProperty(propertyToTest);
}
- /**
- * Method canResolve
- *
- * @param element
- * @param BaseURI
- * @param storage
- * @return true if can resolve the key in the element
- */
- public boolean canResolve(Element element, String BaseURI,
- StorageResolver storage) {
- return this._resolverSpi.engineCanResolve(element, BaseURI, storage);
- }
/**
* Method resolverClassName
@@ -317,4 +321,37 @@ public class KeyResolver {
public String resolverClassName() {
return this._resolverSpi.getClass().getName();
}
+
+ static class ResolverIterator implements Iterator {
+ List res;
+ Iterator it;
+ int i;
+ public ResolverIterator(List list) {
+ res = list;
+ it = res.iterator();
+ }
+ public boolean hasNext() {
+ // TODO Auto-generated method stub
+ return it.hasNext();
+ }
+
+ public Object next() {
+ i++;
+ KeyResolver resolver = (KeyResolver) it.next();
+ if (resolver==null) {
+ throw new RuntimeException("utils.resolver.noClass");
+ }
+
+ return resolver._resolverSpi;
+ }
+
+ public void remove() {
+ // TODO Auto-generated method stub
+
+ }
+
+ };
+ public static Iterator iterator() {
+ return new ResolverIterator(_resolverVector);
+ }
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolverException.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolverException.java
index 4248c8dfa6b..f0069949b2f 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolverException.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolverException.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -31,7 +30,7 @@ import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
*
*
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*
*/
public class KeyResolverException extends XMLSecurityException {
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolverSpi.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolverSpi.java
index a6b99825ebc..dc2865bcfc4 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolverSpi.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolverSpi.java
@@ -20,17 +20,15 @@
*/
package com.sun.org.apache.xml.internal.security.keys.keyresolver;
-
-
import java.security.PublicKey;
import java.security.cert.X509Certificate;
+import java.util.HashMap;
import javax.crypto.SecretKey;
import com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver;
import org.w3c.dom.Element;
-
/**
* This class is abstract class for a child KeyInfo Elemnet.
*
@@ -41,14 +39,10 @@ import org.w3c.dom.Element;
* JAVACLASS="MyPackage.MyKeyValueImpl"//gt;
*
*
- * @author $Author: raul $
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
*/
public abstract class KeyResolverSpi {
-
- /** {@link java.util.logging} logging facility */
- static java.util.logging.Logger log =
- java.util.logging.Logger.getLogger(KeyResolverSpi.class.getName());
-
/**
* This method helps the {@link com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolver} to decide whether a
* {@link com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverSpi} is able to perform the requested action.
@@ -56,10 +50,12 @@ public abstract class KeyResolverSpi {
* @param element
* @param BaseURI
* @param storage
- * @return true if can resolve the key in the element
+ * @return
*/
- abstract public boolean engineCanResolve(Element element, String BaseURI,
- StorageResolver storage);
+ public boolean engineCanResolve(Element element, String BaseURI,
+ StorageResolver storage) {
+ throw new UnsupportedOperationException();
+ }
/**
* Method engineResolvePublicKey
@@ -71,9 +67,60 @@ public abstract class KeyResolverSpi {
*
* @throws KeyResolverException
*/
- abstract public PublicKey engineResolvePublicKey(
+ public PublicKey engineResolvePublicKey(
Element element, String BaseURI, StorageResolver storage)
- throws KeyResolverException;
+ throws KeyResolverException {
+ throw new UnsupportedOperationException();
+ };
+
+ /**
+ * Method engineResolvePublicKey
+ *
+ * @param element
+ * @param BaseURI
+ * @param storage
+ * @return resolved public key from the registered from the element.
+ *
+ * @throws KeyResolverException
+ */
+ public PublicKey engineLookupAndResolvePublicKey(
+ Element element, String BaseURI, StorageResolver storage)
+ throws KeyResolverException {
+ KeyResolverSpi tmp = cloneIfNeeded();
+ if (!tmp.engineCanResolve(element, BaseURI, storage))
+ return null;
+ return tmp.engineResolvePublicKey(element, BaseURI, storage);
+ }
+
+ private KeyResolverSpi cloneIfNeeded() throws KeyResolverException {
+ KeyResolverSpi tmp=this;
+ if (globalResolver) {
+ try {
+ tmp = (KeyResolverSpi) getClass().newInstance();
+ } catch (InstantiationException e) {
+ throw new KeyResolverException("",e);
+ } catch (IllegalAccessException e) {
+ throw new KeyResolverException("",e);
+ }
+ }
+ return tmp;
+ }
+
+ /**
+ * Method engineResolveCertificate
+ *
+ * @param element
+ * @param BaseURI
+ * @param storage
+ * @return resolved X509Certificate key from the registered from the elements
+ *
+ * @throws KeyResolverException
+ */
+ public X509Certificate engineResolveX509Certificate(
+ Element element, String BaseURI, StorageResolver storage)
+ throws KeyResolverException{
+ throw new UnsupportedOperationException();
+ };
/**
* Method engineResolveCertificate
@@ -85,9 +132,30 @@ public abstract class KeyResolverSpi {
*
* @throws KeyResolverException
*/
- abstract public X509Certificate engineResolveX509Certificate(
+ public X509Certificate engineLookupResolveX509Certificate(
Element element, String BaseURI, StorageResolver storage)
- throws KeyResolverException;
+ throws KeyResolverException {
+ KeyResolverSpi tmp = cloneIfNeeded();
+ if (!tmp.engineCanResolve(element, BaseURI, storage))
+ return null;
+ return tmp.engineResolveX509Certificate(element, BaseURI, storage);
+
+ }
+ /**
+ * Method engineResolveSecretKey
+ *
+ * @param element
+ * @param BaseURI
+ * @param storage
+ * @return resolved SecretKey key from the registered from the elements
+ *
+ * @throws KeyResolverException
+ */
+ public SecretKey engineResolveSecretKey(
+ Element element, String BaseURI, StorageResolver storage)
+ throws KeyResolverException{
+ throw new UnsupportedOperationException();
+ };
/**
* Method engineResolveSecretKey
@@ -99,12 +167,19 @@ public abstract class KeyResolverSpi {
*
* @throws KeyResolverException
*/
- abstract public SecretKey engineResolveSecretKey(
+ public SecretKey engineLookupAndResolveSecretKey(
Element element, String BaseURI, StorageResolver storage)
- throws KeyResolverException;
+ throws KeyResolverException {
+ KeyResolverSpi tmp = cloneIfNeeded();
+ if (!tmp.engineCanResolve(element, BaseURI, storage))
+ return null;
+ return tmp.engineResolveSecretKey(element, BaseURI, storage);
+ }
/** Field _properties */
- protected java.util.Map _properties = new java.util.HashMap(10);
+ protected java.util.Map _properties = null;
+
+ protected boolean globalResolver=false;
/**
* Method engineSetProperty
@@ -113,19 +188,8 @@ public abstract class KeyResolverSpi {
* @param value
*/
public void engineSetProperty(String key, String value) {
-
- java.util.Iterator i = this._properties.keySet().iterator();
-
- while (i.hasNext()) {
- String c = (String) i.next();
-
- if (c.equals(key)) {
- key = c;
-
- break;
- }
- }
-
+ if (_properties==null)
+ _properties=new HashMap();
this._properties.put(key, value);
}
@@ -136,31 +200,12 @@ public abstract class KeyResolverSpi {
* @return obtain the property appointed by key
*/
public String engineGetProperty(String key) {
-
- java.util.Iterator i = this._properties.keySet().iterator();
-
- while (i.hasNext()) {
- String c = (String) i.next();
-
- if (c.equals(key)) {
- key = c;
-
- break;
- }
- }
+ if (_properties==null)
+ return null;
return (String) this._properties.get(key);
}
- /**
- * Method engineGetPropertyKeys
- *
- * @return the keys of properties known by this resolver
- */
- public String[] engineGetPropertyKeys() {
- return new String[0];
- }
-
/**
* Method understandsProperty
*
@@ -168,17 +213,13 @@ public abstract class KeyResolverSpi {
* @return true if understood the property
*/
public boolean understandsProperty(String propertyToTest) {
+ if (_properties==null)
+ return false;
- String[] understood = this.engineGetPropertyKeys();
-
- if (understood != null) {
- for (int i = 0; i < understood.length; i++) {
- if (understood[i].equals(propertyToTest)) {
- return true;
- }
- }
- }
-
- return false;
+ return this._properties.get(propertyToTest)!=null;
}
+ public void setGlobalResolver(boolean globalResolver) {
+ this.globalResolver = globalResolver;
+ }
+
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/DSAKeyValueResolver.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/DSAKeyValueResolver.java
index efda14c1a4a..20bf7bad777 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/DSAKeyValueResolver.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/DSAKeyValueResolver.java
@@ -37,46 +37,10 @@ import org.w3c.dom.Element;
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class DSAKeyValueResolver extends KeyResolverSpi {
- /** Field _dsaKeyElement */
- private Element _dsaKeyElement = null;
-
- /** @inheritDoc */
- public boolean engineCanResolve(Element element, String BaseURI,
- StorageResolver storage) {
-
- if (element == null) {
- return false;
- }
-
- boolean isKeyValue = XMLUtils.elementIsInSignatureSpace(element,
- Constants._TAG_KEYVALUE);
- boolean isDSAKeyValue = XMLUtils.elementIsInSignatureSpace(element,
- Constants._TAG_DSAKEYVALUE);
-
- if (isKeyValue) {
-
- this._dsaKeyElement =
- XMLUtils.selectDsNode(element.getFirstChild(),Constants._TAG_DSAKEYVALUE,0);
-
- if (this._dsaKeyElement != null) {
- return true;
- }
- } else if (isDSAKeyValue) {
-
- // this trick is needed to allow the RetrievalMethodResolver to eat a
- // ds:DSAKeyValue directly (without KeyValue)
- this._dsaKeyElement = element;
-
- return true;
- }
-
- return false;
- }
-
/**
* Method engineResolvePublicKey
*
@@ -85,20 +49,30 @@ public class DSAKeyValueResolver extends KeyResolverSpi {
* @param storage
* @return null if no {@link PublicKey} could be obtained
*/
- public PublicKey engineResolvePublicKey(
+ public PublicKey engineLookupAndResolvePublicKey(
Element element, String BaseURI, StorageResolver storage) {
+ if (element == null) {
+ return null;
+ }
+ Element dsaKeyElement=null;
+ boolean isKeyValue = XMLUtils.elementIsInSignatureSpace(element,
+ Constants._TAG_KEYVALUE);
+ if (isKeyValue) {
+ dsaKeyElement =
+ XMLUtils.selectDsNode(element.getFirstChild(),Constants._TAG_DSAKEYVALUE,0);
+ } else if (XMLUtils.elementIsInSignatureSpace(element,
+ Constants._TAG_DSAKEYVALUE)) {
+ // this trick is needed to allow the RetrievalMethodResolver to eat a
+ // ds:DSAKeyValue directly (without KeyValue)
+ dsaKeyElement = element;
+ }
- if (this._dsaKeyElement == null) {
- boolean weCanResolve = this.engineCanResolve(element, BaseURI,
- storage);
-
- if (!weCanResolve || (this._dsaKeyElement == null)) {
- return null;
- }
+ if (dsaKeyElement == null) {
+ return null;
}
try {
- DSAKeyValue dsaKeyValue = new DSAKeyValue(this._dsaKeyElement,
+ DSAKeyValue dsaKeyValue = new DSAKeyValue(dsaKeyElement,
BaseURI);
PublicKey pk = dsaKeyValue.getPublicKey();
@@ -112,13 +86,13 @@ public class DSAKeyValueResolver extends KeyResolverSpi {
/** @inheritDoc */
- public X509Certificate engineResolveX509Certificate(
+ public X509Certificate engineLookupResolveX509Certificate(
Element element, String BaseURI, StorageResolver storage) {
return null;
}
/** @inheritDoc */
- public javax.crypto.SecretKey engineResolveSecretKey(
+ public javax.crypto.SecretKey engineLookupAndResolveSecretKey(
Element element, String BaseURI, StorageResolver storage){
return null;
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/EncryptedKeyResolver.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/EncryptedKeyResolver.java
index 4b44f1c50d1..6adc050e893 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/EncryptedKeyResolver.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/EncryptedKeyResolver.java
@@ -56,7 +56,6 @@ public class EncryptedKeyResolver extends KeyResolverSpi {
RSAKeyValueResolver.class.getName());
- Key _key;
Key _kek;
String _algorithm;
@@ -66,7 +65,6 @@ public class EncryptedKeyResolver extends KeyResolverSpi {
* @param algorithm
*/
public EncryptedKeyResolver(String algorithm) {
- _key = null;
_kek = null;
_algorithm=algorithm;
}
@@ -78,64 +76,49 @@ public class EncryptedKeyResolver extends KeyResolverSpi {
*/
public EncryptedKeyResolver(String algorithm, Key kek) {
- _key = null;
_algorithm = algorithm;
_kek = kek;
}
- /**
- * Method engineCanResolve
- *
- * @param element
- * @param BaseURI
- * @param storage
- * @return true if can resolve the key in the element
- *
- */
-
- public boolean engineCanResolve(Element element, String BaseURI,
- StorageResolver storage) {
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "EncryptedKeyResolver - Can I resolve " + element.getTagName());
-
- if (element == null) {
- return false;
- }
-
- boolean isEncryptedKey = XMLUtils.elementIsInEncryptionSpace(element,
- EncryptionConstants._TAG_ENCRYPTEDKEY);
-
- if (isEncryptedKey) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Passed an Encrypted Key");
- try {
- XMLCipher cipher = XMLCipher.getInstance();
- cipher.init(XMLCipher.UNWRAP_MODE, _kek);
- EncryptedKey ek = cipher.loadEncryptedKey(element);
- _key = cipher.decryptKey(ek, _algorithm);
- }
- catch (Exception e) {}
- }
-
- return (_key != null);
- }
-
/** @inheritDoc */
- public PublicKey engineResolvePublicKey(
+ public PublicKey engineLookupAndResolvePublicKey(
Element element, String BaseURI, StorageResolver storage) {
return null;
}
/** @inheritDoc */
- public X509Certificate engineResolveX509Certificate(
+ public X509Certificate engineLookupResolveX509Certificate(
Element element, String BaseURI, StorageResolver storage) {
return null;
}
/** @inheritDoc */
- public javax.crypto.SecretKey engineResolveSecretKey(
+ public javax.crypto.SecretKey engineLookupAndResolveSecretKey(
Element element, String BaseURI, StorageResolver storage) {
- return (SecretKey) _key;
+ SecretKey key=null;
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "EncryptedKeyResolver - Can I resolve " + element.getTagName());
+
+ if (element == null) {
+ return null;
+ }
+
+ boolean isEncryptedKey = XMLUtils.elementIsInEncryptionSpace(element,
+ EncryptionConstants._TAG_ENCRYPTEDKEY);
+
+ if (isEncryptedKey) {
+ log.log(java.util.logging.Level.FINE, "Passed an Encrypted Key");
+ try {
+ XMLCipher cipher = XMLCipher.getInstance();
+ cipher.init(XMLCipher.UNWRAP_MODE, _kek);
+ EncryptedKey ek = cipher.loadEncryptedKey(element);
+ key = (SecretKey) cipher.decryptKey(ek, _algorithm);
+ }
+ catch (Exception e) {}
+ }
+
+ return key;
}
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/RSAKeyValueResolver.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/RSAKeyValueResolver.java
index 541de7307f4..fb38e872590 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/RSAKeyValueResolver.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/RSAKeyValueResolver.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -38,7 +37,7 @@ import org.w3c.dom.Element;
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class RSAKeyValueResolver extends KeyResolverSpi {
@@ -48,75 +47,55 @@ public class RSAKeyValueResolver extends KeyResolverSpi {
RSAKeyValueResolver.class.getName());
/** Field _rsaKeyElement */
- private Element _rsaKeyElement = null;
+
/** @inheritDoc */
- public boolean engineCanResolve(Element element, String BaseURI,
- StorageResolver storage) {
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Can I resolve " + element.getTagName());
-
+ public PublicKey engineLookupAndResolvePublicKey(
+ Element element, String BaseURI, StorageResolver storage) {
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Can I resolve " + element.getTagName());
if (element == null) {
- return false;
+ return null;
}
- boolean isKeyValue = XMLUtils.elementIsInSignatureSpace(element,
- Constants._TAG_KEYVALUE);
- boolean isRSAKeyValue = XMLUtils.elementIsInSignatureSpace(element,
- Constants._TAG_RSAKEYVALUE);
-
- if (isKeyValue) {
- this._rsaKeyElement = XMLUtils.selectDsNode(element.getFirstChild(),
- Constants._TAG_RSAKEYVALUE, 0);
-
- if (this._rsaKeyElement != null) {
- return true;
- }
- } else if (isRSAKeyValue) {
-
+ boolean isKeyValue = XMLUtils.elementIsInSignatureSpace(element,
+ Constants._TAG_KEYVALUE);
+ Element rsaKeyElement=null;
+ if (isKeyValue) {
+ rsaKeyElement = XMLUtils.selectDsNode(element.getFirstChild(),
+ Constants._TAG_RSAKEYVALUE, 0);
+ } else if (XMLUtils.elementIsInSignatureSpace(element,
+ Constants._TAG_RSAKEYVALUE)) {
// this trick is needed to allow the RetrievalMethodResolver to eat a
// ds:RSAKeyValue directly (without KeyValue)
- this._rsaKeyElement = element;
+ rsaKeyElement = element;
+ }
- return true;
- }
- return false;
- }
-
- /** @inheritDoc */
- public PublicKey engineResolvePublicKey(
- Element element, String BaseURI, StorageResolver storage) {
-
- if (this._rsaKeyElement == null) {
- boolean weCanResolve = this.engineCanResolve(element, BaseURI,
- storage);
-
- if (!weCanResolve || (this._rsaKeyElement == null)) {
- return null;
- }
+ if (rsaKeyElement == null) {
+ return null;
}
try {
- RSAKeyValue rsaKeyValue = new RSAKeyValue(this._rsaKeyElement,
+ RSAKeyValue rsaKeyValue = new RSAKeyValue(rsaKeyElement,
BaseURI);
return rsaKeyValue.getPublicKey();
} catch (XMLSecurityException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "XMLSecurityException", ex);
+ log.log(java.util.logging.Level.FINE, "XMLSecurityException", ex);
}
return null;
}
/** @inheritDoc */
- public X509Certificate engineResolveX509Certificate(
+ public X509Certificate engineLookupResolveX509Certificate(
Element element, String BaseURI, StorageResolver storage) {
return null;
}
/** @inheritDoc */
- public javax.crypto.SecretKey engineResolveSecretKey(
+ public javax.crypto.SecretKey engineLookupAndResolveSecretKey(
Element element, String BaseURI, StorageResolver storage) {
return null;
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/RetrievalMethodResolver.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/RetrievalMethodResolver.java
index d8d98bdb9e9..3dff2182445 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/RetrievalMethodResolver.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/RetrievalMethodResolver.java
@@ -28,7 +28,15 @@ import java.security.PublicKey;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Set;
+import javax.xml.parsers.ParserConfigurationException;
+
+import com.sun.org.apache.xml.internal.security.c14n.CanonicalizationException;
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
import com.sun.org.apache.xml.internal.security.keys.content.RetrievalMethod;
import com.sun.org.apache.xml.internal.security.keys.content.x509.XMLX509Certificate;
@@ -44,6 +52,7 @@ import com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolver;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
/**
@@ -55,7 +64,7 @@ import org.w3c.dom.Node;
* RetrievalMethodResolver cannot handle itself, resolving of the extracted
* element is delegated back to the KeyResolver mechanism.
*
- * @author $Author: raul $
+ * @author $Author: mullan $ modified by Dave Garcia
*/
public class RetrievalMethodResolver extends KeyResolverSpi {
@@ -64,26 +73,6 @@ public class RetrievalMethodResolver extends KeyResolverSpi {
java.util.logging.Logger.getLogger(
RetrievalMethodResolver.class.getName());
- /**
- * Method engineCanResolve
- * @inheritDoc
- * @param element
- * @param BaseURI
- * @param storage
- *
- */
- public boolean engineCanResolve(Element element, String BaseURI,
- StorageResolver storage) {
-
- if
- (!XMLUtils.elementIsInSignatureSpace(element,
- Constants._TAG_RETRIEVALMETHOD)) {
- return false;
- }
-
- return true;
- }
-
/**
* Method engineResolvePublicKey
* @inheritDoc
@@ -92,84 +81,61 @@ public class RetrievalMethodResolver extends KeyResolverSpi {
* @param storage
*
*/
- public PublicKey engineResolvePublicKey(
+ public PublicKey engineLookupAndResolvePublicKey(
Element element, String BaseURI, StorageResolver storage)
{
+ if (!XMLUtils.elementIsInSignatureSpace(element,
+ Constants._TAG_RETRIEVALMETHOD)) {
+ return null;
+ }
try {
- RetrievalMethod rm = new RetrievalMethod(element, BaseURI);
- Attr uri = rm.getURIAttr();
-
- // type can be null because it's optional
- String type = rm.getType();
- Transforms transforms = rm.getTransforms();
- ResourceResolver resRes = ResourceResolver.getInstance(uri, BaseURI);
-
- if (resRes != null) {
- XMLSignatureInput resource = resRes.resolve(uri, BaseURI);
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Before applying Transforms, resource has "
- + resource.getBytes().length + "bytes");
-
- if (transforms != null) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "We have Transforms");
-
- resource = transforms.performTransforms(resource);
- }
- if (true) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "After applying Transforms, resource has "
- + resource.getBytes().length + "bytes");
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Resolved to resource " + resource.getSourceURI());
- }
-
- byte inputBytes[] = resource.getBytes();
-
- if ((type != null) && type.equals(RetrievalMethod.TYPE_RAWX509)) {
-
- // if the resource stores a raw certificate, we have to handle it
- CertificateFactory certFact =
- CertificateFactory
- .getInstance(XMLX509Certificate.JCA_CERT_ID);
- X509Certificate cert =
- (X509Certificate) certFact
- .generateCertificate(new ByteArrayInputStream(inputBytes));
-
- if (cert != null) {
- return cert.getPublicKey();
- }
- } else {
-
- // otherwise, we parse the resource, create an Element and delegate
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "we have to parse " + inputBytes.length + " bytes");
-
- Element e = this.getDocFromBytes(inputBytes);
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Now we have a {" + e.getNamespaceURI() + "}"
- + e.getLocalName() + " Element");
-
- if (e != null) {
- KeyResolver newKeyResolver = KeyResolver.getInstance(getFirstElementChild(e),
- BaseURI, storage);
-
- if (newKeyResolver != null) {
- return newKeyResolver.resolvePublicKey(getFirstElementChild(e), BaseURI,
- storage);
- }
- }
- }
- }
- } catch (XMLSecurityException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "XMLSecurityException", ex);
+ //Create a retrieval method over the given element
+ RetrievalMethod rm = new RetrievalMethod(element, BaseURI);
+ String type = rm.getType();
+ XMLSignatureInput resource=resolveInput(rm,BaseURI);
+ if (RetrievalMethod.TYPE_RAWX509.equals(type)) {
+ //a raw certificate, direct parsing is done!
+ X509Certificate cert=getRawCertificate(resource);
+ if (cert != null) {
+ return cert.getPublicKey();
+ }
+ return null;
+ };
+ Element e = obtainRefrenceElement(resource);
+ return resolveKey(e,BaseURI,storage);
+ } catch (XMLSecurityException ex) {
+ log.log(java.util.logging.Level.FINE, "XMLSecurityException", ex);
} catch (CertificateException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "CertificateException", ex);
+ log.log(java.util.logging.Level.FINE, "CertificateException", ex);
} catch (IOException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "IOException", ex);
- }
-
+ log.log(java.util.logging.Level.FINE, "IOException", ex);
+ } catch (ParserConfigurationException e) {
+ log.log(java.util.logging.Level.FINE, "ParserConfigurationException", e);
+ } catch (SAXException e) {
+ log.log(java.util.logging.Level.FINE, "SAXException", e);
+ }
return null;
}
+ static private Element obtainRefrenceElement(XMLSignatureInput resource) throws CanonicalizationException, ParserConfigurationException, IOException, SAXException, KeyResolverException {
+ Element e;
+ if (resource.isElement()){
+ e=(Element) resource.getSubNode();
+ } else if (resource.isNodeSet()) {
+ //Retrieved resource is a nodeSet
+ e=getDocumentElement(resource.getNodeSet());
+ } else {
+ //Retrieved resource is an inputStream
+ byte inputBytes[] = resource.getBytes();
+ e = getDocFromBytes(inputBytes);
+ //otherwise, we parse the resource, create an Element and delegate
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "we have to parse " + inputBytes.length + " bytes");
+ }
+ return e;
+ }
+
/**
* Method engineResolveX509Certificate
* @inheritDoc
@@ -178,87 +144,102 @@ public class RetrievalMethodResolver extends KeyResolverSpi {
* @param storage
*
*/
- public X509Certificate engineResolveX509Certificate(
+ public X509Certificate engineLookupResolveX509Certificate(
Element element, String BaseURI, StorageResolver storage)
{
+ if (!XMLUtils.elementIsInSignatureSpace(element,
+ Constants._TAG_RETRIEVALMETHOD)) {
+ return null;
+ }
- try {
+ try {
RetrievalMethod rm = new RetrievalMethod(element, BaseURI);
- Attr uri = rm.getURIAttr();
- Transforms transforms = rm.getTransforms();
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Asked to resolve URI " + uri);
-
- ResourceResolver resRes = ResourceResolver.getInstance(uri, BaseURI);
-
- if (resRes != null) {
- XMLSignatureInput resource = resRes.resolve(uri, BaseURI);
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Before applying Transforms, resource has "
- + resource.getBytes().length + "bytes");
-
- if (transforms != null) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "We have Transforms");
-
- resource = transforms.performTransforms(resource);
- }
-
- if (true) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "After applying Transforms, resource has "
- + resource.getBytes().length + "bytes");
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Resolved to resource " + resource.getSourceURI());
- }
-
- byte inputBytes[] = resource.getBytes();
-
- if ((rm.getType() != null)
- && rm.getType().equals(RetrievalMethod.TYPE_RAWX509)) {
-
- // if the resource stores a raw certificate, we have to handle it
- CertificateFactory certFact =
- CertificateFactory
- .getInstance(XMLX509Certificate.JCA_CERT_ID);
- X509Certificate cert =
- (X509Certificate) certFact
- .generateCertificate(new ByteArrayInputStream(inputBytes));
-
- if (cert != null) {
- return cert;
- }
- } else {
-
- // otherwise, we parse the resource, create an Element and delegate
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "we have to parse " + inputBytes.length + " bytes");
-
- Element e = this.getDocFromBytes(inputBytes);
-
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Now we have a {" + e.getNamespaceURI() + "}"
- + e.getLocalName() + " Element");
-
- if (e != null) {
- KeyResolver newKeyResolver = KeyResolver.getInstance(getFirstElementChild(e),
- BaseURI, storage);
-
- if (newKeyResolver != null) {
- return newKeyResolver.resolveX509Certificate(getFirstElementChild(e), BaseURI,
- storage);
- }
- }
- }
- }
+ String type = rm.getType();
+ XMLSignatureInput resource=resolveInput(rm,BaseURI);
+ if (RetrievalMethod.TYPE_RAWX509.equals(type)) {
+ X509Certificate cert=getRawCertificate(resource);
+ return cert;
+ }
+ Element e = obtainRefrenceElement(resource);
+ return resolveCertificate(e,BaseURI,storage);
} catch (XMLSecurityException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "XMLSecurityException", ex);
+ log.log(java.util.logging.Level.FINE, "XMLSecurityException", ex);
} catch (CertificateException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "CertificateException", ex);
+ log.log(java.util.logging.Level.FINE, "CertificateException", ex);
} catch (IOException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "IOException", ex);
- }
-
+ log.log(java.util.logging.Level.FINE, "IOException", ex);
+ } catch (ParserConfigurationException e) {
+ log.log(java.util.logging.Level.FINE, "ParserConfigurationException", e);
+ } catch (SAXException e) {
+ log.log(java.util.logging.Level.FINE, "SAXException", e);
+ }
return null;
}
+ /**
+ * Retrieves a x509Certificate from the given information
+ * @param e
+ * @param BaseURI
+ * @param storage
+ * @return
+ * @throws KeyResolverException
+ */
+ static private X509Certificate resolveCertificate(Element e,String BaseURI,StorageResolver storage) throws KeyResolverException{
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Now we have a {" + e.getNamespaceURI() + "}"+ e.getLocalName() + " Element");
+ //An element has been provided
+ if (e != null) {
+ return KeyResolver.getX509Certificate(e,BaseURI, storage);
+ }
+ return null;
+ }
+
+ /**
+ * Retrieves a x509Certificate from the given information
+ * @param e
+ * @param BaseURI
+ * @param storage
+ * @return
+ * @throws KeyResolverException
+ */
+ static private PublicKey resolveKey(Element e,String BaseURI,StorageResolver storage) throws KeyResolverException{
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Now we have a {" + e.getNamespaceURI() + "}"+ e.getLocalName() + " Element");
+ //An element has been provided
+ if (e != null) {
+ return KeyResolver.getPublicKey(e,BaseURI, storage);
+ }
+ return null;
+ }
+
+ static private X509Certificate getRawCertificate(XMLSignatureInput resource) throws CanonicalizationException, IOException, CertificateException{
+ byte inputBytes[] = resource.getBytes();
+ // if the resource stores a raw certificate, we have to handle it
+ CertificateFactory certFact =CertificateFactory.getInstance(XMLX509Certificate.JCA_CERT_ID);
+ X509Certificate cert =(X509Certificate) certFact.generateCertificate(new ByteArrayInputStream(inputBytes));
+ return cert;
+ }
+ /**
+ * Resolves the input from the given retrieval method
+ * @return
+ * @throws XMLSecurityException
+ */
+ static private XMLSignatureInput resolveInput(RetrievalMethod rm,String BaseURI) throws XMLSecurityException{
+ Attr uri = rm.getURIAttr();
+ //Apply the trnasforms
+ Transforms transforms = rm.getTransforms();
+ ResourceResolver resRes = ResourceResolver.getInstance(uri, BaseURI);
+ if (resRes != null) {
+ XMLSignatureInput resource = resRes.resolve(uri, BaseURI);
+ if (transforms != null) {
+ log.log(java.util.logging.Level.FINE, "We have Transforms");
+ resource = transforms.performTransforms(resource);
+ }
+ return resource;
+ }
+ return null;
+ }
+
/**
* Parses a byte array and returns the parsed Element.
*
@@ -266,18 +247,13 @@ public class RetrievalMethodResolver extends KeyResolverSpi {
* @return the Document Element after parsing bytes
* @throws KeyResolverException if something goes wrong
*/
- Element getDocFromBytes(byte[] bytes) throws KeyResolverException {
-
+ static Element getDocFromBytes(byte[] bytes) throws KeyResolverException {
try {
- javax.xml.parsers.DocumentBuilderFactory dbf =
- javax.xml.parsers.DocumentBuilderFactory.newInstance();
-
+ javax.xml.parsers.DocumentBuilderFactory dbf =javax.xml.parsers.DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
-
javax.xml.parsers.DocumentBuilder db = dbf.newDocumentBuilder();
org.w3c.dom.Document doc =
db.parse(new java.io.ByteArrayInputStream(bytes));
-
return doc.getDocumentElement();
} catch (org.xml.sax.SAXException ex) {
throw new KeyResolverException("empty", ex);
@@ -296,16 +272,43 @@ public class RetrievalMethodResolver extends KeyResolverSpi {
* @param storage
*
*/
- public javax.crypto.SecretKey engineResolveSecretKey(
+ public javax.crypto.SecretKey engineLookupAndResolveSecretKey(
Element element, String BaseURI, StorageResolver storage)
{
return null;
}
- static Element getFirstElementChild(Element e){
- Node n=e.getFirstChild();
- while (n!=null && n.getNodeType()!=Node.ELEMENT_NODE) {
- n=n.getNextSibling();
- }
- return (Element)n;
+
+ static Element getDocumentElement(Set set) {
+ Iterator it=set.iterator();
+ Element e=null;
+ while (it.hasNext()) {
+ Node currentNode=(Node)it.next();
+ if (currentNode instanceof Element) {
+ e=(Element)currentNode;
+ break;
+ }
+
+ }
+ List parents=new ArrayList(10);
+
+ //Obtain all the parents of the elemnt
+ do {
+ parents.add(e);
+ Node n=e.getParentNode();
+ if (!(n instanceof Element )) {
+ break;
+ }
+ e=(Element)n;
+ } while (e!=null);
+ //Visit them in reverse order.
+ ListIterator it2=parents.listIterator(parents.size()-1);
+ Element ele=null;
+ while (it2.hasPrevious()) {
+ ele=(Element)it2.previous();
+ if (set.contains(ele)) {
+ return ele;
+ }
+ }
+ return null;
}
}
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/X509CertificateResolver.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/X509CertificateResolver.java
index 16264c99868..06a49c6708e 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/X509CertificateResolver.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/X509CertificateResolver.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -41,7 +40,7 @@ import org.w3c.dom.Element;
* Resolves Certificates which are directly contained inside a
* ds:X509Certificate
Element.
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class X509CertificateResolver extends KeyResolverSpi {
@@ -49,47 +48,7 @@ public class X509CertificateResolver extends KeyResolverSpi {
static java.util.logging.Logger log =
java.util.logging.Logger.getLogger(X509CertificateResolver.class.getName());
- /** Field _dsaKeyElement */
- Element[] _x509CertKeyElements = null;
- /**
- * Method engineCanResolve
- * @inheritDoc
- * @param element
- * @param BaseURI
- * @param storage
- *
- */
- public boolean engineCanResolve(Element element, String BaseURI,
- StorageResolver storage) {
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Can I resolve " + element.getTagName() + "?");
-
- if (!XMLUtils.elementIsInSignatureSpace(element,
- Constants._TAG_X509DATA)) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "I can't");
-
- return false;
- }
-
-
- this._x509CertKeyElements = XMLUtils.selectDsNodes(element.getFirstChild(),
- Constants._TAG_X509CERTIFICATE);
-
- if ((this._x509CertKeyElements != null)
- && (this._x509CertKeyElements.length > 0)) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Yes Sir, I can");
-
- return true;
- }
-
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "I can't");
-
- return false;
- }
-
- /** Field _x509certObject[] */
- XMLX509Certificate _x509certObject[] = null;
/**
* Method engineResolvePublicKey
@@ -100,11 +59,11 @@ public class X509CertificateResolver extends KeyResolverSpi {
*
* @throws KeyResolverException
*/
- public PublicKey engineResolvePublicKey(
+ public PublicKey engineLookupAndResolvePublicKey(
Element element, String BaseURI, StorageResolver storage)
throws KeyResolverException {
- X509Certificate cert = this.engineResolveX509Certificate(element,
+ X509Certificate cert = this.engineLookupResolveX509Certificate(element,
BaseURI, storage);
if (cert != null) {
@@ -123,43 +82,33 @@ public class X509CertificateResolver extends KeyResolverSpi {
*
* @throws KeyResolverException
*/
- public X509Certificate engineResolveX509Certificate(
+ public X509Certificate engineLookupResolveX509Certificate(
Element element, String BaseURI, StorageResolver storage)
throws KeyResolverException {
try {
- if ((this._x509CertKeyElements == null)
- || (this._x509CertKeyElements.length == 0)) {
- boolean weCanResolve = this.engineCanResolve(element, BaseURI,
- storage);
-
- if (!weCanResolve || (this._x509CertKeyElements == null)
- || (this._x509CertKeyElements.length == 0)) {
- return null;
- }
+ Element[] els=XMLUtils.selectDsNodes(element.getFirstChild(),
+ Constants._TAG_X509CERTIFICATE);
+ if ((els == null) || (els.length == 0)) {
+ Element el=XMLUtils.selectDsNode(element.getFirstChild(),
+ Constants._TAG_X509DATA,0);
+ if (el!=null) {
+ return engineLookupResolveX509Certificate(el, BaseURI, storage);
+ }
+ return null;
}
- this._x509certObject =
- new XMLX509Certificate[this._x509CertKeyElements.length];
-
// populate Object array
- for (int i = 0; i < this._x509CertKeyElements.length; i++) {
- this._x509certObject[i] =
- new XMLX509Certificate(this._x509CertKeyElements[i]
- , BaseURI);
- }
-
- for (int i = 0; i < this._x509certObject.length; i++) {
- X509Certificate cert = this._x509certObject[i].getX509Certificate();
-
- if (cert != null) {
- return cert;
+ for (int i = 0; i < els.length; i++) {
+ XMLX509Certificate xmlCert=new XMLX509Certificate(els[i], BaseURI);
+ X509Certificate cert = xmlCert.getX509Certificate();
+ if (cert!=null) {
+ return cert;
}
}
-
return null;
} catch (XMLSecurityException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "XMLSecurityException", ex);
+ log.log(java.util.logging.Level.FINE, "XMLSecurityException", ex);
throw new KeyResolverException("generic.EmptyMessage", ex);
}
@@ -173,7 +122,7 @@ public class X509CertificateResolver extends KeyResolverSpi {
* @param storage
*
*/
- public javax.crypto.SecretKey engineResolveSecretKey(
+ public javax.crypto.SecretKey engineLookupAndResolveSecretKey(
Element element, String BaseURI, StorageResolver storage)
{
return null;
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/X509IssuerSerialResolver.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/X509IssuerSerialResolver.java
index c4e824747ba..8f717e71689 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/X509IssuerSerialResolver.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/X509IssuerSerialResolver.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -39,7 +38,7 @@ import org.w3c.dom.Element;
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class X509IssuerSerialResolver extends KeyResolverSpi {
@@ -48,44 +47,13 @@ public class X509IssuerSerialResolver extends KeyResolverSpi {
java.util.logging.Logger.getLogger(
X509IssuerSerialResolver.class.getName());
- /** @inheritDoc */
- public boolean engineCanResolve(Element element, String BaseURI,
- StorageResolver storage) {
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Can I resolve " + element.getTagName() + "?");
-
- X509Data x509data = null;
- try {
- x509data = new X509Data(element, BaseURI);
- } catch (XMLSignatureException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "I can't");
-
- return false;
- } catch (XMLSecurityException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "I can't");
-
- return false;
- }
-
- if (x509data == null) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "I can't");
- return false;
- }
-
- if (x509data.containsIssuerSerial()) {
- return true;
- }
-
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "I can't");
- return false;
- }
/** @inheritDoc */
- public PublicKey engineResolvePublicKey(
+ public PublicKey engineLookupAndResolvePublicKey(
Element element, String BaseURI, StorageResolver storage)
throws KeyResolverException {
- X509Certificate cert = this.engineResolveX509Certificate(element,
+ X509Certificate cert = this.engineLookupResolveX509Certificate(element,
BaseURI, storage);
if (cert != null) {
@@ -96,10 +64,31 @@ public class X509IssuerSerialResolver extends KeyResolverSpi {
}
/** @inheritDoc */
- public X509Certificate engineResolveX509Certificate(
+ public X509Certificate engineLookupResolveX509Certificate(
Element element, String BaseURI, StorageResolver storage)
throws KeyResolverException {
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Can I resolve " + element.getTagName() + "?");
+ X509Data x509data = null;
+ try {
+ x509data = new X509Data(element, BaseURI);
+ } catch (XMLSignatureException ex) {
+ log.log(java.util.logging.Level.FINE, "I can't");
+ return null;
+ } catch (XMLSecurityException ex) {
+ log.log(java.util.logging.Level.FINE, "I can't");
+ return null;
+ }
+
+ if (x509data == null) {
+ log.log(java.util.logging.Level.FINE, "I can't");
+ return null;
+ }
+
+ if (!x509data.containsIssuerSerial()) {
+ return null;
+ }
try {
if (storage == null) {
Object exArgs[] = { Constants._TAG_X509ISSUERSERIAL };
@@ -107,53 +96,52 @@ public class X509IssuerSerialResolver extends KeyResolverSpi {
new KeyResolverException("KeyResolver.needStorageResolver",
exArgs);
- if (log.isLoggable(java.util.logging.Level.INFO)) log.log(java.util.logging.Level.INFO, "", ex);
+ log.log(java.util.logging.Level.INFO, "", ex);
throw ex;
}
- X509Data x509data = new X509Data(element, BaseURI);
int noOfISS = x509data.lengthIssuerSerial();
while (storage.hasNext()) {
X509Certificate cert = storage.next();
XMLX509IssuerSerial certSerial = new XMLX509IssuerSerial(element.getOwnerDocument(), cert);
- if (true) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Found Certificate Issuer: "
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "Found Certificate Issuer: "
+ certSerial.getIssuerName());
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Found Certificate Serial: "
+ log.log(java.util.logging.Level.FINE, "Found Certificate Serial: "
+ certSerial.getSerialNumber().toString());
}
for (int i=0; i 0)) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Yes Sir, I can");
-
- return true;
- }
-
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "I can't");
-
- return false;
- }
/**
* Method engineResolvePublicKey
@@ -102,11 +57,11 @@ public class X509SKIResolver extends KeyResolverSpi {
* @return null if no {@link PublicKey} could be obtained
* @throws KeyResolverException
*/
- public PublicKey engineResolvePublicKey(
+ public PublicKey engineLookupAndResolvePublicKey(
Element element, String BaseURI, StorageResolver storage)
throws KeyResolverException {
- X509Certificate cert = this.engineResolveX509Certificate(element,
+ X509Certificate cert = this.engineLookupResolveX509Certificate(element,
BaseURI, storage);
if (cert != null) {
@@ -125,46 +80,55 @@ public class X509SKIResolver extends KeyResolverSpi {
*
* @throws KeyResolverException
*/
- public X509Certificate engineResolveX509Certificate(
+ public X509Certificate engineLookupResolveX509Certificate(
Element element, String BaseURI, StorageResolver storage)
throws KeyResolverException {
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "Can I resolve " + element.getTagName() + "?");
+ }
+ if (!XMLUtils.elementIsInSignatureSpace(element,
+ Constants._TAG_X509DATA)) {
+ log.log(java.util.logging.Level.FINE, "I can't");
+ return null;
+ }
+ /** Field _x509childObject[] */
+ XMLX509SKI x509childObject[] = null;
- try {
- if (this._x509childNodes == null) {
- boolean weCanResolve = this.engineCanResolve(element, BaseURI,
- storage);
-
- if (!weCanResolve || (this._x509childNodes == null)) {
- return null;
- }
- }
+ Element x509childNodes[] = null;
+ x509childNodes = XMLUtils.selectDsNodes(element.getFirstChild(),
+ Constants._TAG_X509SKI);
+ if (!((x509childNodes != null)
+ && (x509childNodes.length > 0))) {
+ log.log(java.util.logging.Level.FINE, "I can't");
+ return null;
+ }
+ try {
if (storage == null) {
Object exArgs[] = { Constants._TAG_X509SKI };
KeyResolverException ex =
new KeyResolverException("KeyResolver.needStorageResolver",
exArgs);
- if (log.isLoggable(java.util.logging.Level.INFO)) log.log(java.util.logging.Level.INFO, "", ex);
+ log.log(java.util.logging.Level.INFO, "", ex);
throw ex;
}
- this._x509childObject =
- new XMLX509SKI[this._x509childNodes.length];
+ x509childObject = new XMLX509SKI[x509childNodes.length];
- for (int i = 0; i < this._x509childNodes.length; i++) {
- this._x509childObject[i] =
- new XMLX509SKI(this._x509childNodes[i], BaseURI);
+ for (int i = 0; i < x509childNodes.length; i++) {
+ x509childObject[i] =
+ new XMLX509SKI(x509childNodes[i], BaseURI);
}
while (storage.hasNext()) {
X509Certificate cert = storage.next();
XMLX509SKI certSKI = new XMLX509SKI(element.getOwnerDocument(), cert);
- for (int i = 0; i < this._x509childObject.length; i++) {
- if (certSKI.equals(this._x509childObject[i])) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Return PublicKey from "
+ for (int i = 0; i < x509childObject.length; i++) {
+ if (certSKI.equals(x509childObject[i])) {
+ log.log(java.util.logging.Level.FINE, "Return PublicKey from "
+ cert.getSubjectDN().getName());
return cert;
@@ -186,7 +150,7 @@ public class X509SKIResolver extends KeyResolverSpi {
* @param storage
*
*/
- public javax.crypto.SecretKey engineResolveSecretKey(
+ public javax.crypto.SecretKey engineLookupAndResolveSecretKey(
Element element, String BaseURI, StorageResolver storage)
{
return null;
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/X509SubjectNameResolver.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/X509SubjectNameResolver.java
index 5da6a7d8fd7..05e82226c4c 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/X509SubjectNameResolver.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/implementations/X509SubjectNameResolver.java
@@ -38,7 +38,7 @@ import org.w3c.dom.Element;
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class X509SubjectNameResolver extends KeyResolverSpi {
@@ -47,50 +47,6 @@ public class X509SubjectNameResolver extends KeyResolverSpi {
java.util.logging.Logger.getLogger(
X509SubjectNameResolver.class.getName());
- /** Field _x509childNodes */
- private Element[] _x509childNodes = null;
-
- /** Field _x509childObject[] */
- private XMLX509SubjectName _x509childObject[] = null;
-
- /**
- * Method engineCanResolve
- * @inheritDoc
- * @param element
- * @param BaseURI
- * @param storage
- *
- */
- public boolean engineCanResolve(Element element, String BaseURI,
- StorageResolver storage) {
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Can I resolve " + element.getTagName() + "?");
-
-
- if (!XMLUtils.elementIsInSignatureSpace(element,
- Constants._TAG_X509DATA) ) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "I can't");
-
- return false;
- }
-
-
-
- this._x509childNodes = XMLUtils.selectDsNodes(element,
- Constants._TAG_X509SUBJECTNAME);
-
- if ((this._x509childNodes != null)
- && (this._x509childNodes.length > 0)) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Yes Sir, I can");
-
- return true;
- }
-
-
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "I can't");
-
- return false;
- }
/**
* Method engineResolvePublicKey
@@ -101,11 +57,11 @@ public class X509SubjectNameResolver extends KeyResolverSpi {
* @return null if no {@link PublicKey} could be obtained
* @throws KeyResolverException
*/
- public PublicKey engineResolvePublicKey(
+ public PublicKey engineLookupAndResolvePublicKey(
Element element, String BaseURI, StorageResolver storage)
throws KeyResolverException {
- X509Certificate cert = this.engineResolveX509Certificate(element,
+ X509Certificate cert = this.engineLookupResolveX509Certificate(element,
BaseURI, storage);
if (cert != null) {
@@ -124,37 +80,46 @@ public class X509SubjectNameResolver extends KeyResolverSpi {
*
* @throws KeyResolverException
*/
- public X509Certificate engineResolveX509Certificate(
+ public X509Certificate engineLookupResolveX509Certificate(
Element element, String BaseURI, StorageResolver storage)
throws KeyResolverException {
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Can I resolve " + element.getTagName() + "?");
+ Element[] x509childNodes = null;
+ XMLX509SubjectName x509childObject[] = null;
+
+ if (!XMLUtils.elementIsInSignatureSpace(element,
+ Constants._TAG_X509DATA) ) {
+ log.log(java.util.logging.Level.FINE, "I can't");
+ return null;
+ }
+ x509childNodes = XMLUtils.selectDsNodes(element.getFirstChild(),
+ Constants._TAG_X509SUBJECTNAME);
+
+ if (!((x509childNodes != null)
+ && (x509childNodes.length > 0))) {
+ log.log(java.util.logging.Level.FINE, "I can't");
+ return null;
+ }
try {
- if (this._x509childNodes == null) {
- boolean weCanResolve = this.engineCanResolve(element, BaseURI,
- storage);
-
- if (!weCanResolve || (this._x509childNodes == null)) {
- return null;
- }
- }
-
if (storage == null) {
Object exArgs[] = { Constants._TAG_X509SUBJECTNAME };
KeyResolverException ex =
new KeyResolverException("KeyResolver.needStorageResolver",
exArgs);
- if (log.isLoggable(java.util.logging.Level.INFO)) log.log(java.util.logging.Level.INFO, "", ex);
+ log.log(java.util.logging.Level.INFO, "", ex);
throw ex;
}
- this._x509childObject =
- new XMLX509SubjectName[this._x509childNodes.length];
+ x509childObject =
+ new XMLX509SubjectName[x509childNodes.length];
- for (int i = 0; i < this._x509childNodes.length; i++) {
- this._x509childObject[i] =
- new XMLX509SubjectName(this._x509childNodes[i],
+ for (int i = 0; i < x509childNodes.length; i++) {
+ x509childObject[i] =
+ new XMLX509SubjectName(x509childNodes[i],
BaseURI);
}
@@ -163,24 +128,24 @@ public class X509SubjectNameResolver extends KeyResolverSpi {
XMLX509SubjectName certSN =
new XMLX509SubjectName(element.getOwnerDocument(), cert);
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Found Certificate SN: " + certSN.getSubjectName());
+ log.log(java.util.logging.Level.FINE, "Found Certificate SN: " + certSN.getSubjectName());
- for (int i = 0; i < this._x509childObject.length; i++) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Found Element SN: "
- + this._x509childObject[i].getSubjectName());
+ for (int i = 0; i < x509childObject.length; i++) {
+ log.log(java.util.logging.Level.FINE, "Found Element SN: "
+ + x509childObject[i].getSubjectName());
- if (certSN.equals(this._x509childObject[i])) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "match !!! ");
+ if (certSN.equals(x509childObject[i])) {
+ log.log(java.util.logging.Level.FINE, "match !!! ");
return cert;
}
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "no match...");
+ log.log(java.util.logging.Level.FINE, "no match...");
}
}
return null;
} catch (XMLSecurityException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "XMLSecurityException", ex);
+ log.log(java.util.logging.Level.FINE, "XMLSecurityException", ex);
throw new KeyResolverException("generic.EmptyMessage", ex);
}
@@ -194,7 +159,7 @@ public class X509SubjectNameResolver extends KeyResolverSpi {
* @param storage
*
*/
- public javax.crypto.SecretKey engineResolveSecretKey(
+ public javax.crypto.SecretKey engineLookupAndResolveSecretKey(
Element element, String BaseURI, StorageResolver storage)
{
return null;
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/StorageResolver.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/StorageResolver.java
index 46fee3d4240..f1a8dd3400d 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/StorageResolver.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/StorageResolver.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -21,8 +20,6 @@
*/
package com.sun.org.apache.xml.internal.security.keys.storage;
-
-
import java.security.KeyStore;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
@@ -36,7 +33,7 @@ import com.sun.org.apache.xml.internal.security.keys.storage.implementations.Sin
/**
* This class collects customized resolvers for Certificates.
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class StorageResolver {
@@ -45,7 +42,7 @@ public class StorageResolver {
java.util.logging.Logger.getLogger(StorageResolver.class.getName());
/** Field _storageResolvers */
- List _storageResolvers = new ArrayList();
+ List _storageResolvers = null;
/** Field _iterator */
Iterator _iterator = null;
@@ -71,7 +68,8 @@ public class StorageResolver {
* @param resolver
*/
public void add(StorageResolverSpi resolver) {
-
+ if (_storageResolvers==null)
+ _storageResolvers=new ArrayList();
this._storageResolvers.add(resolver);
this._iterator = null;
@@ -126,6 +124,8 @@ public class StorageResolver {
public Iterator getIterator() {
if (this._iterator == null) {
+ if (_storageResolvers==null)
+ _storageResolvers=new ArrayList();
this._iterator = new StorageResolverIterator(this._storageResolvers.iterator());
}
@@ -140,6 +140,8 @@ public class StorageResolver {
public boolean hasNext() {
if (this._iterator == null) {
+ if (_storageResolvers==null)
+ _storageResolvers=new ArrayList();
this._iterator = new StorageResolverIterator(this._storageResolvers.iterator());
}
@@ -158,15 +160,13 @@ public class StorageResolver {
/**
* Class StorageResolverIterator
*
- * @author $Author: raul $
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
*/
- class StorageResolverIterator implements Iterator {
+ static class StorageResolverIterator implements Iterator {
/** Field _resolvers */
- Iterator _resolvers = null;
-
- /** Field _currentResolver */
- int _currentResolver = 0;
+ Iterator _resolvers = null;
/**
* Constructor FilesystemIterator
@@ -179,17 +179,16 @@ public class StorageResolver {
/** @inheritDoc */
public boolean hasNext() {
- return _resolvers.hasNext();
+ return _resolvers.hasNext();
}
/** @inheritDoc */
public Object next() {
- return _resolvers.next();
+ return _resolvers.next();
}
/**
* Method remove
- *
*/
public void remove() {
throw new UnsupportedOperationException(
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/StorageResolverException.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/StorageResolverException.java
index 2388ef19bc8..29dff030f78 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/StorageResolverException.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/StorageResolverException.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -28,7 +27,7 @@ import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class StorageResolverException extends XMLSecurityException {
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/StorageResolverSpi.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/StorageResolverSpi.java
index dc95e60407f..25f3e2828d2 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/StorageResolverSpi.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/StorageResolverSpi.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -28,7 +27,7 @@ import java.util.Iterator;
/**
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public abstract class StorageResolverSpi {
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/implementations/CertsInFilesystemDirectoryResolver.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/implementations/CertsInFilesystemDirectoryResolver.java
index 6c6909665c3..06fb5694bef 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/implementations/CertsInFilesystemDirectoryResolver.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/implementations/CertsInFilesystemDirectoryResolver.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -21,8 +20,6 @@
*/
package com.sun.org.apache.xml.internal.security.keys.storage.implementations;
-
-
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@@ -40,12 +37,11 @@ import com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverExce
import com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi;
import com.sun.org.apache.xml.internal.security.utils.Base64;
-
/**
* This {@link StorageResolverSpi} makes all raw (binary) {@link X509Certificate}s
* which reside as files in a single directory available to the {@link com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver}.
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class CertsInFilesystemDirectoryResolver extends StorageResolverSpi {
@@ -131,20 +127,20 @@ public class CertsInFilesystemDirectoryResolver extends StorageResolverSpi {
dn = cert.getSubjectDN().getName();
added = true;
} catch (FileNotFoundException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Could not add certificate from file " + filename, ex);
+ log.log(java.util.logging.Level.FINE, "Could not add certificate from file " + filename, ex);
} catch (IOException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Could not add certificate from file " + filename, ex);
+ log.log(java.util.logging.Level.FINE, "Could not add certificate from file " + filename, ex);
} catch (CertificateNotYetValidException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Could not add certificate from file " + filename, ex);
+ log.log(java.util.logging.Level.FINE, "Could not add certificate from file " + filename, ex);
} catch (CertificateExpiredException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Could not add certificate from file " + filename, ex);
+ log.log(java.util.logging.Level.FINE, "Could not add certificate from file " + filename, ex);
} catch (CertificateException ex) {
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Could not add certificate from file " + filename, ex);
+ log.log(java.util.logging.Level.FINE, "Could not add certificate from file " + filename, ex);
}
if (added) {
- if (true)
- if (log.isLoggable(java.util.logging.Level.FINE)) log.log(java.util.logging.Level.FINE, "Added certificate: " + dn);
+ if (log.isLoggable(java.util.logging.Level.FINE))
+ log.log(java.util.logging.Level.FINE, "Added certificate: " + dn);
}
}
}
@@ -157,9 +153,10 @@ public class CertsInFilesystemDirectoryResolver extends StorageResolverSpi {
/**
* Class FilesystemIterator
*
- * @author $Author: raul $
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
*/
- class FilesystemIterator implements Iterator {
+ private static class FilesystemIterator implements Iterator {
/** Field _certs */
List _certs = null;
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/implementations/KeyStoreResolver.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/implementations/KeyStoreResolver.java
index ad1eb6b1494..18632433ca5 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/implementations/KeyStoreResolver.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/implementations/KeyStoreResolver.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -21,8 +20,6 @@
*/
package com.sun.org.apache.xml.internal.security.keys.storage.implementations;
-
-
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.cert.X509Certificate;
@@ -37,7 +34,7 @@ import com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi;
* Makes the Certificates from a JAVA {@link KeyStore} object available to the
* {@link com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver}.
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class KeyStoreResolver extends StorageResolverSpi {
@@ -66,9 +63,10 @@ public class KeyStoreResolver extends StorageResolverSpi {
/**
* Class KeyStoreIterator
*
- * @author $Author: raul $
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
*/
- class KeyStoreIterator implements Iterator {
+ static class KeyStoreIterator implements Iterator {
/** Field _keyStore */
KeyStore _keyStore = null;
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/implementations/SingleCertificateResolver.java b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/implementations/SingleCertificateResolver.java
index 6c4f260b9d1..7e61b2a244d 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/implementations/SingleCertificateResolver.java
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/storage/implementations/SingleCertificateResolver.java
@@ -2,7 +2,6 @@
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
-
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
@@ -21,8 +20,6 @@
*/
package com.sun.org.apache.xml.internal.security.keys.storage.implementations;
-
-
import java.security.cert.X509Certificate;
import java.util.Iterator;
@@ -33,7 +30,7 @@ import com.sun.org.apache.xml.internal.security.keys.storage.StorageResolverSpi;
* This {@link StorageResolverSpi} makes a single {@link X509Certificate}
* available to the {@link com.sun.org.apache.xml.internal.security.keys.storage.StorageResolver}.
*
- * @author $Author: raul $
+ * @author $Author: mullan $
*/
public class SingleCertificateResolver extends StorageResolverSpi {
@@ -61,9 +58,10 @@ public class SingleCertificateResolver extends StorageResolverSpi {
/**
* Class InternalIterator
*
- * @author $Author: raul $
+ * @author $Author: mullan $
+ * @version $Revision: 1.5 $
*/
- class InternalIterator implements Iterator {
+ static class InternalIterator implements Iterator {
/** Field _alreadyReturned */
boolean _alreadyReturned = false;
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/config.dtd b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/config.dtd
index 1e886bf1776..f57b9fabe4d 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/config.dtd
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/config.dtd
@@ -1,73 +1,73 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/config.xml b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/config.xml
index d0d6edcee69..aea1595741b 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/config.xml
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/config.xml
@@ -1,380 +1,399 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/schema/etsi.xsd b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/schema/etsi.xsd
index 3a08c64f4b6..d69852ff842 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/schema/etsi.xsd
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/schema/etsi.xsd
@@ -1,347 +1,347 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/schema/xmldsig-core-schema.dtd b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/schema/xmldsig-core-schema.dtd
index 969dbb18c21..b2cc19f63a1 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/schema/xmldsig-core-schema.dtd
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/schema/xmldsig-core-schema.dtd
@@ -3,7 +3,7 @@
Joseph Reagle $last changed 20001215$
http://www.w3.org/2000/09/xmldsig#
- $Revision: 1.1 $ on $Date: 2002/02/08 20:32:26 $ by $Author: reagle $
+ $Revision: 1.6 $ on $Date: 2008/07/24 16:15:03 $ by $Author: mullan $
Copyright 2001 The Internet Society and W3C (Massachusetts Institute
of Technology, Institut National de Recherche en Informatique et en
diff --git a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/schema/xmldsig-core-schema.xsd b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/schema/xmldsig-core-schema.xsd
index df126b30e68..e8288a526c3 100644
--- a/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/schema/xmldsig-core-schema.xsd
+++ b/jdk/src/share/classes/com/sun/org/apache/xml/internal/security/resource/schema/xmldsig-core-schema.xsd
@@ -11,7 +11,7 @@
+
+
+
+
+This package contains classes that allow the creation
+and manipulation of service tags.
+This com.sun.servicetag package is intended for
+Sun internal use only.
+
+
+Service Tag
+A service tag is an XML-based data structure that contains identifying
+information about an instance of a product or component on a system.
+
+
+
+Service Tag Registry
+A service tag registry is a XML-based registry that contains
+the service tags of all the tagged components on a system. The
+service tag registry is present on systems that have the
+Service Tags software installed.
+
+
+
+Registration Data
+A registration data is a container of one or more
+service tags that identify the
+components for product registration and will be used to interface
+with the Sun Connection registration services.
+
+
+
+This package contains the methods to create service tags, set up the
+registration data for product registration, add service tags to and
+remove them from the system service tag registry.
+
+All methods defined in this package will throw {@code NullPointerException}
+if {@code null} is passed in any input parameter unless it is stated otherwise.
+In addition, they are multi-thread safe.
+
+