diff options
author | Bertrand Jacquin <beber@meleeweb.net> | 2006-03-13 16:29:58 +0100 |
---|---|---|
committer | Bertrand Jacquin <beber@meleeweb.net> | 2006-03-13 16:29:58 +0100 |
commit | e45f9238e149b87ef189438d5942529418677299 (patch) | |
tree | b13ab036d56d8b16af1b260c4e68d7efbf99b3d0 /dev-java/gcj | |
parent | add lyx 1.4.0 (diff) | |
download | portage-e45f9238e149b87ef189438d5942529418677299.tar.xz |
add new java things
Diffstat (limited to 'dev-java/gcj')
22 files changed, 7141 insertions, 0 deletions
diff --git a/dev-java/gcj/Manifest b/dev-java/gcj/Manifest new file mode 100644 index 00000000..53034b47 --- /dev/null +++ b/dev-java/gcj/Manifest @@ -0,0 +1,60 @@ +MD5 fed3620378df7a876d6709ddf3f7bbec files/awk/fixlafiles.awk 7865 +RMD160 6283a91bfa309a91f46cbff3c1c4f0d848312ba4 files/awk/fixlafiles.awk 7865 +SHA256 9fccd7f4ee7170a8f05d21777974efc3f23072f501cb7d2a8e9eeea15e541249 files/awk/fixlafiles.awk 7865 +MD5 c672adb59a1f452475ab0a864b9d1bd1 files/awk/scanforssp.awk 5830 +RMD160 43a8c09e4e16d9a78ab4d6263e74a1850f12eb9b files/awk/scanforssp.awk 5830 +SHA256 236a2a7eea1ba540ca3be82b0fe2cdefd9ac76b061440918ffe52664edbbb98a files/awk/scanforssp.awk 5830 +MD5 55c3a3afed4433050c7accc86972bd7c files/classpath/gnu.xml.dom.DocumentBuilderFactory.patch 5564 +RMD160 08c5e1e59a7429eecee345284de6140914677259 files/classpath/gnu.xml.dom.DocumentBuilderFactory.patch 5564 +SHA256 6ce6c570855fd7c72593f163b0bab9a68fab881037f5fb4f5ef098316ef9c844 files/classpath/gnu.xml.dom.DocumentBuilderFactory.patch 5564 +MD5 15699cf22bff4e74c4de5434ec57b662 files/classpath/java.beans.XMLEncoder.patch 195926 +RMD160 e6c24d4d081df17cd799ab94158c340f1964e70a files/classpath/java.beans.XMLEncoder.patch 195926 +SHA256 328e8f747c3aaa7fee41b3971c9f3904d61290239f727b1da8d2f7a5ebcb7f2f files/classpath/java.beans.XMLEncoder.patch 195926 +MD5 e308757d0567adea4a227e7694b183ec files/digest-gcj-4.1.0 238 +RMD160 bb4ab9b5f248ed2ba61203df1505271f65c5b0aa files/digest-gcj-4.1.0 238 +SHA256 7d932988900632eaf60750a93f7ab9d5316d2ccd0e5e7f9e99c68a4e57f11e47 files/digest-gcj-4.1.0 238 +MD5 fd0da2a963987afd9885bba89b3b365b files/digest-gcj-4.1.0_pre20060219 265 +RMD160 47222d74a97f2f01fa08ed453ae66075ca5f180b files/digest-gcj-4.1.0_pre20060219 265 +SHA256 56343963da7c523ee35887c6c4e8888188f639fad75f80bb2cbffc5ec365e7de files/digest-gcj-4.1.0_pre20060219 265 +MD5 3cbbf9a8d98d286197d0aa90ac2bb007 files/fix-java.beans.Encoder.patch 1020 +RMD160 0a6be084905398261fc76120378a37a69ae646c9 files/fix-java.beans.Encoder.patch 1020 +SHA256 6cb2b58ee57d74b9e23f00443cb52bfc9db91a902b2e1b5fb1acacf9e9b0721b files/fix-java.beans.Encoder.patch 1020 +MD5 1acd56209164ab837c5f91723434464e files/fix_libtool_files.sh 1712 +RMD160 01788fd6927a9f7bba4a01ec133d6f3494644fe9 files/fix_libtool_files.sh 1712 +SHA256 6b47fb8fa34920ca9ccb449396b25205ad8fe307c869a50e5c4442971e8d4d15 files/fix_libtool_files.sh 1712 +MD5 e0ebf10eb8bf4542ae57ba591daa68a4 files/gcc-configure-LANG.patch 1686 +RMD160 4ff8355af81705058fd411910dfae94887bcd884 files/gcc-configure-LANG.patch 1686 +SHA256 dc9386b88eac48c282d63d0be7e7be81d4a0a08035a8b97138a61133e057bcea files/gcc-configure-LANG.patch 1686 +MD5 f6eef7e81b209ca3c63c39e319b4a7a5 files/gcc-spec-env.patch 1389 +RMD160 55e3920f2db033629d2846e8a8aef69ef98d4508 files/gcc-spec-env.patch 1389 +SHA256 9d157b7dabd7e0921b1a72d551281a7500351748329c6bd442005d61a470a70d files/gcc-spec-env.patch 1389 +MD5 22f4d6b70fb8c496b688c86e6c05ed7a files/gcj-4.1 517 +RMD160 4f89dc072d62eee571e26ba84d7eda46141d3b49 files/gcj-4.1 517 +SHA256 ec2451c2830416b44eb6ee13189d7c7f8a61551e7c517670e0dddfc979433435 files/gcj-4.1 517 +MD5 1c85e59a7ba430c18b99871a60e0d243 files/java.in 199 +RMD160 e0e911b00c0222ae0ebb0d06800e96deff280c3f files/java.in 199 +SHA256 1c4581c39cf6b6ecb71b3d3d4e5f4707c8fc1d32a9ece8709fda85d11fb9cbf4 files/java.in 199 +MD5 39610569dcf02345fe9b1a81d0b9118c files/javac.in 209 +RMD160 8ff3e1651f5d6e067b6e23a771350c9e1c47bf40 files/javac.in 209 +SHA256 40e6875ad498918e71a2aee6ceca8ec3e9238c93db1b700a8f161eb6e92ad4be files/javac.in 209 +MD5 603d151a8c532ab877ecfe7c6de5e501 files/javadoc 38 +RMD160 0b0bcb2213048e45f4f7d33946d7e0e79d9c4a22 files/javadoc 38 +SHA256 75865f8a71143b9b45e90954f7c19bd0272113b2d500b1f534cae82d8b0a66cd files/javadoc 38 +MD5 0841f6a005cedd36231b74a9f44301d6 files/libjava-include.XMLEncoder.patch 2955 +RMD160 a2ecfe61653a601e81e784e7b80528a3f15109fb files/libjava-include.XMLEncoder.patch 2955 +SHA256 067ee6da1fef8401646c9a526992efd49befb1b2773c50d0103fd5f84088cf12 files/libjava-include.XMLEncoder.patch 2955 +MD5 e3193bdffb435b77a21bfb504ff6f591 files/mkinfodir 7324 +RMD160 96bbe8860ae8c0a50db42fea01cc1c2216bd36c8 files/mkinfodir 7324 +SHA256 0565353e767e253207adb8b5c9be9ba215a628447e075a4dc7bb3183ed099d2a files/mkinfodir 7324 +MD5 ea2cf3df0d89a26d5fdc1a531176e395 files/pro-police-docs.patch 3287 +RMD160 eef412d92bed145db05bffa3a3e54e2ba74ee50d files/pro-police-docs.patch 3287 +SHA256 ec012aed77285545b9d993cba1bc5fdb402c8dc9a17040f48b8b354746ede627 files/pro-police-docs.patch 3287 +MD5 b4f7369619c3f69a6ad86e128c305078 files/rebuild-classmap-db 2234 +RMD160 c74bfa19d2bc735e35288fa0de87e279ab1a9504 files/rebuild-classmap-db 2234 +SHA256 1d35bd7d90522234be92b5c1ac9b35b4e768c5e06d54acef74c0f6c11eaead93 files/rebuild-classmap-db 2234 +MD5 07b57d62aa1a8cd4d1cd37984ebe2053 files/scan_libgcc_linked_ssp.sh 861 +RMD160 c89d7e1f9aa7cea0d39281932dacfc1aec7bab74 files/scan_libgcc_linked_ssp.sh 861 +SHA256 9fe574de3978aad4d62cd10b47879384a4f03a7fb1f17e283daf74aad0e45f3b files/scan_libgcc_linked_ssp.sh 861 +MD5 51dca1dd4a20fe337144db3ef0f2e41d gcj-4.1.0.ebuild 1184 +RMD160 02b601b3cc79b7c772c06453a2843de8107ed28c gcj-4.1.0.ebuild 1184 +SHA256 f290a681fd0bfe2b70a3ff118c4489b6ca3603a8cbaad572e1f84d091dae2163 gcj-4.1.0.ebuild 1184 diff --git a/dev-java/gcj/files/awk/fixlafiles.awk b/dev-java/gcj/files/awk/fixlafiles.awk new file mode 100644 index 00000000..c4798f25 --- /dev/null +++ b/dev-java/gcj/files/awk/fixlafiles.awk @@ -0,0 +1,314 @@ +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/sys-devel/gcc/files/awk/fixlafiles.awk,v 1.14 2005/09/24 07:31:28 vapier Exp $ + +# +# Helper functions +# +function printn(string) { + system("echo -n \"" string "\"") +} +function einfo(string) { + system("echo -e \" \\e[32;01m*\\e[0m " string "\"") +} +function einfon(string) { + system("echo -ne \" \\e[32;01m*\\e[0m " string "\"") +} +function ewarn(string) { + system("echo -e \" \\e[33;01m*\\e[0m " string "\"") +} +function ewarnn(string) { + system("echo -ne \" \\e[33;01m*\\e[0m " string "\"") +} +function eerror(string) { + system("echo -e \" \\e[31;01m*\\e[0m " string "\"") +} + +# +# assert(condition, errmsg) +# assert that a condition is true. Otherwise exit. +# +function assert(condition, string) { + if (! condition) { + printf("%s:%d: assertion failed: %s\n", + FILENAME, FNR, string) > "/dev/stderr" + _assert_exit = 1 + exit 1 + } +} + +# +# system(command, return) +# wrapper that normalizes return codes ... +# +function dosystem(command, ret) { + ret = 0 + ret = system(command) + if (ret == 0) + return 1 + else + return 0 +} + +BEGIN { + # + # Get our variables from environment + # + OLDVER = ENVIRON["OLDVER"] + OLDCHOST = ENVIRON["OLDCHOST"] + + if (OLDVER == "") { + eerror("Could not get OLDVER!"); + exit 1 + } + + # Setup some sane defaults + LIBCOUNT = 2 + HAVE_GCC34 = 0 + DIRLIST[1] = "/lib" + DIRLIST[2] = "/usr/lib" + + # + # Walk /etc/ld.so.conf to discover all our library paths + # + pipe = "cat /etc/ld.so.conf | sort 2>/dev/null" + while(((pipe) | getline ldsoconf_data) > 0) { + if (ldsoconf_data !~ /^[[:space:]]*#/) { + if (ldsoconf_data == "") continue + + # Remove any trailing comments + sub(/#.*$/, "", ldsoconf_data) + # Remove any trailing spaces + sub(/[[:space:]]+$/, "", ldsoconf_data) + + # If there's more than one path per line, split + # it up as if they were sep lines + split(ldsoconf_data, nodes, /[:,[:space:]]/) + + # Now add the rest from ld.so.conf + for (x in nodes) { + # wtf does this line do ? + sub(/=.*/, "", nodes[x]) + # Prune trailing / + sub(/\/$/, "", nodes[x]) + + if (nodes[x] == "") continue + + # + # Drop the directory if its a child directory of + # one that was already added ... + # For example, if we have: + # /usr/lib /usr/libexec /usr/lib/mozilla /usr/lib/nss + # We really just want to save /usr/lib /usr/libexec + # + CHILD = 0 + for (y in DIRLIST) { + if (nodes[x] ~ "^" DIRLIST[y] "(/|$)") { + CHILD = 1 + break + } + } + if (CHILD) continue + + DIRLIST[++LIBCOUNT] = nodes[x] + } + } + } + close(pipe) + + # + # Get line from gcc's output containing CHOST + # + pipe = "gcc -print-file-name=libgcc.a 2>/dev/null" + if ((!((pipe) | getline TMP_CHOST)) || (TMP_CHOST == "")) { + close(pipe) + + # If we fail to get the CHOST, see if we can get the CHOST + # portage thinks we are using ... + pipe = "/usr/bin/portageq envvar 'CHOST'" + assert(((pipe) | getline CHOST), "(" pipe ") | getline CHOST") + } else { + # Check pre gcc-3.4.x versions + CHOST = gensub("^.+lib/gcc-lib/([^/]+)/[0-9]+.+$", "\\1", 1, TMP_CHOST) + + if (CHOST == TMP_CHOST || CHOST == "") { + # Check gcc-3.4.x or later + CHOST = gensub("^.+lib/gcc/([^/]+)/[0-9]+.+$", "\\1", 1, TMP_CHOST); + + if (CHOST == TMP_CHOST || CHOST == "") + CHOST = "" + else + HAVE_GCC34 = 1 + } + } + close(pipe) + + if (CHOST == "") { + eerror("Could not get gcc's CHOST!") + exit 1 + } + + if (OLDCHOST != "") + if (OLDCHOST == CHOST) + OLDCHOST = "" + + GCCLIBPREFIX_OLD = "/usr/lib/gcc-lib/" + GCCLIBPREFIX_NEW = "/usr/lib/gcc/" + + if (HAVE_GCC34) + GCCLIBPREFIX = GCCLIBPREFIX_NEW + else + GCCLIBPREFIX = GCCLIBPREFIX_OLD + + GCCLIB = GCCLIBPREFIX CHOST + + if (OLDCHOST != "") { + OLDGCCLIB1 = GCCLIBPREFIX_OLD OLDCHOST + OLDGCCLIB2 = GCCLIBPREFIX_NEW OLDCHOST + } + + # Get current gcc's version + pipe = "gcc -dumpversion" + assert(((pipe) | getline NEWVER), "(" pipe ") | getline NEWVER)") + close(pipe) + + if (NEWVER == "") { + eerror("Could not get gcc's version!") + exit 1 + } + + # Nothing to do ? + if ((OLDVER == NEWVER) && (OLDCHOST == "")) + exit 0 + + # + # Ok, now let's scan for the .la files and actually fix them up + # + for (x = 1; x <= LIBCOUNT; x++) { + # Do nothing if the target dir is gcc's internal library path + if (DIRLIST[x] ~ GCCLIBPREFIX_OLD || + DIRLIST[x] ~ GCCLIBPREFIX_NEW) + continue + + einfo(" [" x "/" LIBCOUNT "] Scanning " DIRLIST[x] " ...") + + pipe = "find " DIRLIST[x] "/ -name '*.la' 2>/dev/null" + while (((pipe) | getline la_files) > 0) { + + # Do nothing if the .la file is located in gcc's internal lib path + if (la_files ~ GCCLIBPREFIX_OLD || + la_files ~ GCCLIBPREFIX_NEW) + continue + + CHANGED = 0 + CHOST_CHANGED = 0 + + # See if we need to fix the .la file + while ((getline la_data < (la_files)) > 0) { + if (OLDCHOST != "") { + if ((gsub(OLDGCCLIB1 "[/[:space:]]+", + GCCLIB, la_data) > 0) || + (gsub(OLDGCCLIB2 "[/[:space:]]+", + GCCLIB, la_data) > 0)) { + CHANGED = 1 + CHOST_CHANGED = 1 + } + } + if (OLDVER != NEWVER) { + if ((gsub(GCCLIBPREFIX_OLD CHOST "/" OLDVER "[/[:space:]]*", + GCCLIB "/" NEWVER, la_data) > 0) || + (gsub(GCCLIBPREFIX_NEW CHOST "/" OLDVER "[/[:space:]]*", + GCCLIB "/" NEWVER, la_data) > 0)) + CHANGED = 1 + } + } + close(la_files) + + # Do the actual changes in a second loop, as we can then + # verify that CHOST_CHANGED among things is correct ... + if (CHANGED) { + ewarnn(" FIXING: " la_files " ...") + + if (CHANGED) + printn("[") + + # Clear the temp file (removing rather than '>foo' is better + # out of a security point of view?) + dosystem("rm -f " la_files ".new") + + while ((getline la_data < (la_files)) > 0) { + if (OLDCHOST != "") { + tmpstr = gensub(OLDGCCLIB1 "([/[:space:]]+)", + GCCLIB "\\1", "g", la_data) + tmpstr = gensub(OLDGCCLIB2 "([/[:space:]]+)", + GCCLIB "\\1", "g", tmpstr) + + if (la_data != tmpstr) { + printn("c") + la_data = tmpstr + } + + if (CHOST_CHANGED > 0) { + # We try to be careful about CHOST changes outside + # the gcc library path (meaning we cannot match it + # via /GCCLIBPREFIX CHOST/) ... + + # Catch: + # + # dependency_libs=' -L/usr/CHOST/{bin,lib}' + # + gsub("-L/usr/" OLDCHOST "/", + "-L/usr/" CHOST "/", la_data) + # Catch: + # + # dependency_libs=' -L/usr/lib/gcc-lib/CHOST/VER/../../../../CHOST/lib' + # + la_data = gensub("(" GCCLIB "/[^[:space:]]+)/" OLDCHOST "/", + "\\1/" CHOST "/", "g", la_data) + } + } + + if (OLDVER != NEWVER) { + # Catch: + # + # dependency_libs=' -L/usr/lib/gcc/CHOST/VER' + # + tmpstr = gensub(GCCLIBPREFIX_OLD CHOST "/" OLDVER "([/[:space:]]+)", + GCCLIB "/" NEWVER "\\1", "g", la_data) + tmpstr = gensub(GCCLIBPREFIX_NEW CHOST "/" OLDVER "([/[:space:]]+)", + GCCLIB "/" NEWVER "\\1", "g", tmpstr) + + if (la_data != tmpstr) { + # Catch: + # + # dependency_libs=' -L/usr/lib/gcc-lib/../../CHOST/lib' + # + # in cases where we have gcc34 + tmpstr = gensub(GCCLIBPREFIX_OLD "(../../" CHOST "/lib)", + GCCLIBPREFIX "\\1", "g", tmpstr) + tmpstr = gensub(GCCLIBPREFIX_NEW "(../../" CHOST "/lib)", + GCCLIBPREFIX "\\1", "g", tmpstr) + printn("v") + la_data = tmpstr + } + } + + print la_data >> (la_files ".new") + } + + if (CHANGED) + print "]" + + close(la_files) + close(la_files ".new") + + assert(dosystem("mv -f " la_files ".new " la_files), + "dosystem(\"mv -f " la_files ".new " la_files "\")") + } + } + + close(pipe) + } +} + +# vim:ts=4 diff --git a/dev-java/gcj/files/awk/scanforssp.awk b/dev-java/gcj/files/awk/scanforssp.awk new file mode 100644 index 00000000..e8a1fe8f --- /dev/null +++ b/dev-java/gcj/files/awk/scanforssp.awk @@ -0,0 +1,225 @@ +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# Author: Martin Schlemmer <azarah@gentoo.org> +# Contributor: Ned Ludd <solar@gentoo.org> +# Contributor: Natanael Copa <nat@c2i.net> +# Contributor: Carter Smithhart <derheld42@derheld.net> +# $Header: /var/cvsroot/gentoo-x86/sys-devel/gcc/files/awk/scanforssp.awk,v 1.7 2004/07/15 00:59:02 agriffis Exp $ + + +# Does not seem to be used in this script. +function printn(string) +{ + printf("%s", string) +} + +function einfo(string) +{ + printf(" %s %s%s", "\033[32;01m*\033[0m", string, "\n") +} + +# Does not seem to be used in this script. +function einfon(string) +{ + printf(" %s %s" , "\033[32;01m*\033[0m", string) +} + +function ewarn(string) +{ + printf(" %s %s%s" , "\033[33;01m*\033[0m", string, "\n") +} + +# Does not seem to be used in this script. +function ewarnn(string) +{ + printf("%s %s" , "\032[33;01m*\033[0m", string) +} + +function eerror(string) +{ + printf(" %s %s%s" , "\033[31;01m*\033[0m", string, "\n") +} + + # These are private, else wierd things + # might happen ... +function iself(scan_files, scan_file_pipe, scan_data) { + # Can we open() a file and read() 4 bytes? + scan_file_pipe = ("head -c 4 " scan_files " 2>/dev/null | tail -c 3") + scan_file_pipe | getline scan_data + close(scan_file_pipe) + return ((scan_data == "ELF") ? 0 : 1) +} + +BEGIN { + # Do we have etcat ? + pipe = ("which etcat 2>/dev/null") + if ((((pipe) | getline etcat_data) > 0) && (etcat_data != "")) + auto_etcat = 1 + else + auto_etcat = 0 + + # Fix bug that causes script to fail when pipe is not closed. Closes bug #36792 + close(pipe) + + DIRCOUNT = 0 + # Add the two default library paths + DIRLIST[1] = "/lib" + DIRLIST[2] = "/usr/lib" + + # Walk /etc/ld.so.conf line for line and get any library paths + pipe = ("cat /etc/ld.so.conf 2>/dev/null | sort") + while(((pipe) | getline ldsoconf_data) > 0) { + + if (ldsoconf_data !~ /^[[:space:]]*#/) { + + if (ldsoconf_data == "") continue + + # Remove any trailing comments + sub(/#.*$/, "", ldsoconf_data) + # Remove any trailing spaces + sub(/[[:space:]]+$/, "", ldsoconf_data) + + split(ldsoconf_data, nodes, /[:,[:space:]]/) + + # Now add the rest from ld.so.conf + for (x in nodes) { + + sub(/=.*/, "", nodes[x]) + sub(/\/$/, "", nodes[x]) + + if (nodes[x] == "") continue + + CHILD = 0 + + # Drop the directory if its a child directory of + # one that was already added ... + for (y in DIRLIST) { + + if (nodes[x] ~ "^" DIRLIST[y]) { + + CHILD = 1 + break + } + } + + if (CHILD) continue + + DIRLIST[++DIRCOUNT + 2] = nodes[x] + } + } + } + +# We have no guarantee that ld.so.conf have more library paths than +# the default, and its better scan files only in /lib and /usr/lib +# than nothing at all ... +# +# exit_val = close(pipe) +# if (exit_val != 0) +# print(exit_val " - " ERRNO) +# +# if (DIRCOUNT == 0) { +# eerror("Could not read from /etc/ld.so.conf!") +# exit 1 +# } + + # Correct DIRCOUNT, as we already added /lib and /usr/lib + DIRCOUNT += 2 + + # Add all the dirs in $PATH + split(ENVIRON["PATH"], TMPPATHLIST, ":") + count = asort(TMPPATHLIST, PATHLIST) + for (x = 1;x <= count;x++) { + + ADDED = 0 + + # Already added? + for (dnode in DIRLIST) + if (PATHLIST[x] == DIRLIST[dnode]) + ADDED = 1 + + if (ADDED) + continue + + # Valid? If so, add it ... + if (((PATHLIST[x] != "") && (PATHLIST[x] != "/") && (PATHLIST[x] != "."))) + DIRLIST[++DIRCOUNT] = PATHLIST[x] + + } + + GCCLIBPREFIX = "/usr/lib/gcc-lib/" + + for (x = 1;x <= DIRCOUNT;x++) { + + # Do nothing if the target dir is gcc's internal library path + if (DIRLIST[x] ~ GCCLIBPREFIX) continue + + einfo(" Scanning " ((x <= 9) ? "0"x : x)" of " DIRCOUNT " " DIRLIST[x] "...") + + pipe = ("find " DIRLIST[x] "/ -type f -perm -1 2>/dev/null") + while ( (pipe | getline scan_files) > 0) { + + #print scan_files + # Do nothing if the file is located in gcc's internal lib path ... + if (scan_files ~ GCCLIBPREFIX) continue + # Or if its hardend files ... + if (scan_files ~ "/lib/libgcc-3" ) continue + # Or not a elf image ... + if (iself(scan_files)) continue + + scan_file_pipe = ("readelf -s " scan_files " 2>&1") + while (((scan_file_pipe) | getline scan_data) > 0) { + bad = 0; + if (scan_data ~ /__guard@GCC/ || scan_data ~ /__guard@@GCC/) { + bad = 1; + print + + # 194: 00000000 32 OBJECT GLOBAL DEFAULT UND __guard@GCC_3.0 (3) + # 59: 00008ee0 32 OBJECT GLOBAL DEFAULT 22 __guard@@GCC_3.0 + split(scan_data, scan_data_nodes) + ewarn("Found " scan_data_nodes[8] " in " scan_files "!") + print + } + if (scan_data ~ /readelf: Error: Unable to seek/) { + bad = 1; + print + ewarn("Error executing readelf. Bad block? Filesystem error? in " scan_files) + print + } + + if (bad) { + + if (auto_etcat) { + + # Use etcat that comes with gentoolkit if auto_etcat is true. + etcat_pipe = ("etcat belongs " scan_files) + (etcat_pipe) | getline etcat_belongs + + while(((etcat_pipe) | getline etcat_belongs) > 0) + eerror(etcat_belongs != "" ? "Please emerge '>=" etcat_belongs "'": "") + close(etcat_pipe) + } else { + + eerror("You need to remerge package that above file belongs to!") + eerror("To find out what package it is, please emerge gentoolkit,") + eerror("and then run:") + print + print " # etcat belongs " scan_files + } + + print + + close(scan_file_pipe) + close(pipe) + exit(1) + } + } + close(scan_file_pipe) + } + close(pipe) + } + + exit(0) +} + + +# vim:ts=4 diff --git a/dev-java/gcj/files/classpath/gnu.xml.dom.DocumentBuilderFactory.patch b/dev-java/gcj/files/classpath/gnu.xml.dom.DocumentBuilderFactory.patch new file mode 100644 index 00000000..668aa40f --- /dev/null +++ b/dev-java/gcj/files/classpath/gnu.xml.dom.DocumentBuilderFactory.patch @@ -0,0 +1,201 @@ +--- classpath/classpath/gnu/xml/dom/DomDocumentBuilderFactory.java 2005/07/02 20:32:15 1.2 ++++ classpath/classpath/gnu/xml/dom/DomDocumentBuilderFactory.java 2006/02/23 20:09:13 1.3 +@@ -37,6 +37,7 @@ + + package gnu.xml.dom; + ++import javax.xml.XMLConstants; + import javax.xml.parsers.DocumentBuilder; + import javax.xml.parsers.DocumentBuilderFactory; + import javax.xml.parsers.FactoryConfigurationError; +@@ -59,6 +60,7 @@ + + final DOMImplementation impl; + final DOMImplementationLS ls; ++ private boolean secureProcessing; + + public DomDocumentBuilderFactory() + { +@@ -124,5 +126,26 @@ + // TODO + } + ++ public void setFeature(String name, boolean value) ++ throws ParserConfigurationException ++ { ++ if (name == null) ++ throw new NullPointerException(); ++ if (XMLConstants.FEATURE_SECURE_PROCESSING.equals(name)) ++ { ++ secureProcessing = true; ++ return; ++ } ++ throw new ParserConfigurationException(name); ++ } ++ ++ public boolean getFeature(String name) ++ throws ParserConfigurationException ++ { ++ if (XMLConstants.FEATURE_SECURE_PROCESSING.equals(name)) ++ return secureProcessing; ++ throw new ParserConfigurationException(name); ++ } ++ + } + +--- classpath/classpath/javax/xml/parsers/DocumentBuilderFactory.java 2005/07/02 20:32:52 1.4 ++++ classpath/classpath/javax/xml/parsers/DocumentBuilderFactory.java 2006/02/23 20:09:13 1.5 +@@ -309,6 +309,7 @@ + /** + * Returns the schema. + * @see #setSchema ++ * @since 1.5 + */ + public Schema getSchema() + { +@@ -318,6 +319,7 @@ + /** + * Sets the schema. + * @see #getSchema ++ * @since 1.5 + */ + public void setSchema(Schema schema) + { +@@ -327,7 +329,7 @@ + /** + * Indicates whether parsers obtained from this factory will be XInclude + * aware. +- * @since 1.3 ++ * @since 1.5 + */ + public boolean isXIncludeAware() + { +@@ -336,11 +338,32 @@ + + /** + * Sets whether parsers obtained from this factory will be XInclude aware. +- * @since 1.3 ++ * @since 1.5 + */ + public void setXIncludeAware(boolean state) + { + xIncludeAware = state; + } ++ ++ /** ++ * Sets the value of the specified feature. ++ * @param name the feature name (URI) ++ * @param value whether to enable the feature or not ++ * @exception ParserConfigurationException if the feature is not ++ * supported. ++ * @since 1.5 ++ */ ++ public abstract void setFeature(String name, boolean value) ++ throws ParserConfigurationException; ++ ++ /** ++ * Returns the value of the specified feature. ++ * @param name the feature name (URI) ++ * @exception ParserConfigurationException if the feature is not ++ * supported. ++ * @since 1.5 ++ */ ++ public abstract boolean getFeature(String name) ++ throws ParserConfigurationException; + + } +--- classpath/classpath/gnu/xml/libxmlj/dom/GnomeDocumentBuilderFactory.java 2005/07/02 20:32:16 1.2 ++++ classpath/classpath/gnu/xml/libxmlj/dom/GnomeDocumentBuilderFactory.java 2006/02/23 20:09:13 1.3 +@@ -37,6 +37,7 @@ + + package gnu.xml.libxmlj.dom; + ++import javax.xml.XMLConstants; + import javax.xml.parsers.DocumentBuilder; + import javax.xml.parsers.DocumentBuilderFactory; + import javax.xml.parsers.ParserConfigurationException; +@@ -47,9 +48,11 @@ + * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> + */ + public class GnomeDocumentBuilderFactory +-extends DocumentBuilderFactory ++ extends DocumentBuilderFactory + { + ++ private boolean secureProcessing; ++ + public GnomeDocumentBuilderFactory () + { + setNamespaceAware (true); +@@ -91,4 +94,25 @@ + // TODO + } + ++ public void setFeature(String name, boolean value) ++ throws ParserConfigurationException ++ { ++ if (name == null) ++ throw new NullPointerException(); ++ if (XMLConstants.FEATURE_SECURE_PROCESSING.equals(name)) ++ { ++ secureProcessing = true; ++ return; ++ } ++ throw new ParserConfigurationException(name); ++ } ++ ++ public boolean getFeature(String name) ++ throws ParserConfigurationException ++ { ++ if (XMLConstants.FEATURE_SECURE_PROCESSING.equals(name)) ++ return secureProcessing; ++ throw new ParserConfigurationException(name); ++ } ++ + } +--- classpath/classpath/gnu/xml/dom/JAXPFactory.java 2005/07/02 20:32:15 1.3 ++++ classpath/classpath/gnu/xml/dom/JAXPFactory.java 2006/02/23 20:09:13 1.4 +@@ -49,6 +49,7 @@ + import org.xml.sax.SAXException; + import org.xml.sax.SAXParseException; + ++import javax.xml.XMLConstants; + import javax.xml.parsers.DocumentBuilder; + import javax.xml.parsers.DocumentBuilderFactory; + import javax.xml.parsers.ParserConfigurationException; +@@ -70,6 +71,7 @@ + private static final String FEATURE = "http://xml.org/sax/features/"; + + private SAXParserFactory pf; ++ private boolean secureProcessing; + + /** + * Default constructor. +@@ -138,6 +140,27 @@ + throw new IllegalArgumentException(name); + } + ++ public void setFeature(String name, boolean value) ++ throws ParserConfigurationException ++ { ++ if (name == null) ++ throw new NullPointerException(); ++ if (XMLConstants.FEATURE_SECURE_PROCESSING.equals(name)) ++ { ++ secureProcessing = true; ++ return; ++ } ++ throw new ParserConfigurationException(name); ++ } ++ ++ public boolean getFeature(String name) ++ throws ParserConfigurationException ++ { ++ if (XMLConstants.FEATURE_SECURE_PROCESSING.equals(name)) ++ return secureProcessing; ++ throw new ParserConfigurationException(name); ++ } ++ + static final class JAXPBuilder + extends DocumentBuilder + implements ErrorHandler diff --git a/dev-java/gcj/files/classpath/java.beans.XMLEncoder.patch b/dev-java/gcj/files/classpath/java.beans.XMLEncoder.patch new file mode 100644 index 00000000..0358d127 --- /dev/null +++ b/dev-java/gcj/files/classpath/java.beans.XMLEncoder.patch @@ -0,0 +1,5525 @@ +diff -Nur classpath.orig/gnu/java/beans/encoder/ArrayPersistenceDelegate.java classpath/gnu/java/beans/encoder/ArrayPersistenceDelegate.java +--- classpath.orig/gnu/java/beans/encoder/ArrayPersistenceDelegate.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/ArrayPersistenceDelegate.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,153 @@ ++/* ArrayPersistenceDelegate.java - A PersistenceDelegate that handles arrays. ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder; ++ ++import java.beans.Encoder; ++import java.beans.Expression; ++import java.beans.PersistenceDelegate; ++import java.beans.Statement; ++ ++import java.lang.reflect.Array; ++import java.util.HashMap; ++ ++public class ArrayPersistenceDelegate extends PersistenceDelegate ++{ ++ private static final HashMap NULL_VALUES = new HashMap(); ++ ++ static ++ { ++ NULL_VALUES.put(Boolean.TYPE, Boolean.FALSE); ++ NULL_VALUES.put(Byte.TYPE, Byte.valueOf((byte) 0)); ++ NULL_VALUES.put(Short.TYPE, Short.valueOf((short) 0)); ++ NULL_VALUES.put(Integer.TYPE, Integer.valueOf(0)); ++ NULL_VALUES.put(Long.TYPE, Long.valueOf(0)); ++ NULL_VALUES.put(Float.TYPE, Float.valueOf(0.0f)); ++ NULL_VALUES.put(Double.TYPE, Double.valueOf(0.0)); ++ } ++ ++ protected Expression instantiate(Object oldInstance, Encoder out) ++ { ++ Class type = oldInstance.getClass().getComponentType(); ++ ++ // oldInstance is expected to be an array, then ++ // getClass().getComponentType() should lead ++ // to its component type. ++ assert (type != null); ++ ++ // Not handling primitive types in a special way here ++ // causes that Class.forName("int") is built as an Expression ++ // later which would cause an exception if executed. A special ++ // handling to avoid the execution for primitive types can be ++ // java.beans.Encoder.writeExpression() . ++ return new Expression( ++ oldInstance, ++ Array.class, ++ "newInstance", ++ new Object[] { ++ type, ++ new Integer(Array.getLength(oldInstance)) }); ++ } ++ ++ protected void initialize(Class type, Object oldInstance, Object newInstance, ++ Encoder out) ++ { ++ int length = Array.getLength(oldInstance); ++ ++ // Compares the array value against a prototypical ++ // null value of the array's component type in order to skip ++ // writing the default values of an array. ++ ++ // Note: I have no idea why the persistence delegate for arrays writes ++ // an Expression that reads the value and then writes a Statement that sets ++ // the value. However it turned out that object arrays work better with the ++ // get-Expression and primitive array work fine with the set-Statement. ++ ++ type = type.getComponentType(); ++ if (type.isPrimitive()) ++ { ++ Object nullValue = NULL_VALUES.get(type); ++ ++ for (int i = 0; i < length; i++) ++ { ++ Object oldValue = Array.get(oldInstance, i); ++ ++ if (!oldValue.equals(nullValue)) ++ { ++ out.writeExpression(new Expression(Array.class, "get", ++ new Object[] { oldInstance, ++ Integer.valueOf(i), ++ })); ++ ++ out.writeStatement(new Statement(Array.class, "set", ++ new Object[] { ++ oldInstance, ++ Integer.valueOf(i), ++ oldValue ++ })); ++ } ++ } ++ ++ } ++ else ++ { ++ ++ for (int i = 0; i < length; i++) ++ { ++ Object oldValue = Array.get(oldInstance, i); ++ ++ if (oldValue != null) ++ { ++ out.writeExpression(new Expression(Array.class, "get", ++ new Object[] { oldInstance, ++ Integer.valueOf(i), ++ })); ++ ++ out.writeStatement(new Statement(Array.class, "set", ++ new Object[] { ++ oldInstance, ++ Integer.valueOf(i), ++ oldValue ++ })); ++ } ++ } ++ } ++ ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/ClassPersistenceDelegate.java classpath/gnu/java/beans/encoder/ClassPersistenceDelegate.java +--- classpath.orig/gnu/java/beans/encoder/ClassPersistenceDelegate.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/ClassPersistenceDelegate.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,80 @@ ++/* ClassPersistenceDelegate.java - A PersistenceDelegate for the Class type. ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath 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 for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++02110-1301 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package gnu.java.beans.encoder; ++ ++import java.beans.Encoder; ++import java.beans.Expression; ++import java.beans.PersistenceDelegate; ++ ++/** <p>The <code>ClassPersistenceDelegate</code> creates ++ * <code>Expression</code> instances which denote class resolutions.</p> ++ * ++ * <p>The class resolution is always the last step when serializing a tree ++ * of objects. Due to the recursive nature of the algorithm we need a way ++ * to end the recursion. This is achieved by the implementation of this ++ * {@link instantiate} method. Arbitrary classes are described with a call ++ * to <code>Class.forName</code>. However for the <code>Class</code> class ++ * we call <code>getClass()</code> on a <code>String.class</code> instance. ++ * This in turn lead to the resolution of the String class which is always ++ * encoded as <code>"".getClass()</code>. Finally the <code>Encoder</code> ++ * treats strings in a special way so that the recursion ends here. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ */ ++public class ClassPersistenceDelegate extends PersistenceDelegate ++{ ++ ++ protected Expression instantiate(Object oldInstance, Encoder out) ++ { ++ Class oldClass = (Class) oldInstance; ++ ++ // Due to the special handling of String instances in the Encoder ++ // this Expression does not lead to further class resolutions. ++ if (oldClass == String.class) ++ return new Expression(oldClass, "", "getClass", null); ++ ++ // This Expression will lead to the class resolution of String.class. ++ if (oldClass == Class.class) ++ return new Expression(oldClass, String.class, "getClass", null); ++ ++ // This Expression will lead to the class resolution of Class.class. ++ return new Expression(oldClass, Class.class, "forName", ++ new Object[] { oldClass.getName() }); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/CollectionPersistenceDelegate.java classpath/gnu/java/beans/encoder/CollectionPersistenceDelegate.java +--- classpath.orig/gnu/java/beans/encoder/CollectionPersistenceDelegate.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/CollectionPersistenceDelegate.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,84 @@ ++/* CollectionPersistenceDelegate.java - A PersistenceDelegate for Collection subclasses. ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder; ++ ++import java.util.Collection; ++import java.beans.Encoder; ++import java.beans.Expression; ++import java.beans.PersistenceDelegate; ++import java.beans.Statement; ++ ++import java.util.Iterator; ++ ++/** <p>A <code>PersistenceDelegate</code> implementation that calls ++ * the no-argument constructor to create the Collection instance and ++ * uses an iterator to add all the objects it reaches through it.</p> ++ * ++ * <p>It is used for <code>Set</code> and <code>List</code> ++ * implementations.</p> ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ */ ++public class CollectionPersistenceDelegate extends PersistenceDelegate ++{ ++ ++ protected Expression instantiate(Object oldInstance, Encoder out) ++ { ++ return new Expression( ++ oldInstance, ++ oldInstance.getClass(), ++ "new", ++ null); ++ } ++ ++ protected void initialize(Class type, Object oldInstance, Object newInstance, ++ Encoder out) ++ { ++ Iterator ite = ((Collection) oldInstance).iterator(); ++ ++ while (ite.hasNext()) ++ { ++ out.writeStatement(new Statement(oldInstance, "add", ++ new Object[] { ite.next() })); ++ ++ } ++ ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/Context.java classpath/gnu/java/beans/encoder/Context.java +--- classpath.orig/gnu/java/beans/encoder/Context.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/Context.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,88 @@ ++/* Context.java -- Provides calling context information to ScannerStates. ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath 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 for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++02110-1301 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder; ++ ++/** A <code>Contect</code> object describes the current state ++ * and the call number while processing the original object ++ * tree in the {@link ScanEngine}. ++ * ++ * <p>The class allows to distinguish the different calling states ++ * and is neccessary for the child element skipping feature of ++ * the {@link GenericScannerState}.</p> ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public class Context ++{ ++ private String state; ++ ++ private int call; ++ ++ Context(String newState, int newCall) ++ { ++ state = newState; ++ call = newCall; ++ } ++ ++ public int hashCode() ++ { ++ int hc = 7; ++ hc = 31 * hc + state.hashCode(); ++ hc = 31 * hc + call; ++ ++ return hc; ++ } ++ ++ public boolean equals(Object o) ++ { ++ if (!(o instanceof Context)) ++ return false; ++ ++ Context that = (Context) o; ++ ++ return state.equals(that.state) ++ && call == that.call; ++ } ++ ++ public String toString() ++ { ++ return "Context [state=" + state + ", call=" + call + "]"; ++ } ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/Array_Get.java classpath/gnu/java/beans/encoder/elements/Array_Get.java +--- classpath.orig/gnu/java/beans/encoder/elements/Array_Get.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/Array_Get.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,62 @@ ++/* Array_Get.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import gnu.java.beans.encoder.Writer; ++ ++/** ++ * Generates an XML element denoting the retrieval of an array value. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ */ ++public class Array_Get extends Element ++{ ++ final String indexAsString; ++ ++ public Array_Get(String newIndexAsString) ++ { ++ indexAsString = newIndexAsString; ++ } ++ ++ public void writeStart(Writer writer) ++ { ++ writer.write("void", "index", indexAsString, isEmpty()); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/ArrayInstantiation.java classpath/gnu/java/beans/encoder/elements/ArrayInstantiation.java +--- classpath.orig/gnu/java/beans/encoder/elements/ArrayInstantiation.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/ArrayInstantiation.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,74 @@ ++/* ArrayInstantiation.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import gnu.java.beans.encoder.ObjectId; ++import gnu.java.beans.encoder.Writer; ++ ++/** Generates an XML element denoting the instantiation of an array. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public class ArrayInstantiation extends Element ++{ ++ final String className; ++ ++ final String lengthAsString; ++ ++ public ArrayInstantiation(String newClassName, String newLengthAsString) ++ { ++ className = newClassName; ++ lengthAsString = newLengthAsString; ++ } ++ ++ public void writeStart(Writer writer) ++ { ++ ObjectId objectId = getId(); ++ if (objectId.isUnused()) ++ writer.write("array", new String[] { "class", "length" }, ++ new String[] { className, lengthAsString }, isEmpty()); ++ else ++ writer.write("array", new String[] { "id", "class", "length" }, ++ new String[] { objectId.toString(), className, ++ lengthAsString }, isEmpty()); ++ ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/Array_Set.java classpath/gnu/java/beans/encoder/elements/Array_Set.java +--- classpath.orig/gnu/java/beans/encoder/elements/Array_Set.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/Array_Set.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,57 @@ ++/* Array_Set.java -- FIXME: briefly describe file purpose ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath 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 for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++02110-1301 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import gnu.java.beans.encoder.Writer; ++ ++public class Array_Set extends Element ++{ ++ final String indexAsString; ++ ++ public Array_Set(String newIndexAsString) ++ { ++ indexAsString = newIndexAsString; ++ } ++ ++ public void writeStart(Writer writer) ++ { ++ writer.write("void", "index", indexAsString, isEmpty()); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/ClassResolution.java classpath/gnu/java/beans/encoder/elements/ClassResolution.java +--- classpath.orig/gnu/java/beans/encoder/elements/ClassResolution.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/ClassResolution.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,67 @@ ++/* ClassResolution.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import gnu.java.beans.encoder.Writer; ++ ++/** Generates an XML element denoting the resolution of a class. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public class ClassResolution extends Element ++{ ++ final String className; ++ ++ public ClassResolution(String newClassName) ++ { ++ className = newClassName; ++ } ++ ++ public void writeStart(Writer writer) ++ { ++ writer.writeNoChildren("class", className); ++ } ++ ++ public void writeEnd(Writer writer) ++ { ++ writer.writeEndNoChildren(); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/Element.java classpath/gnu/java/beans/encoder/elements/Element.java +--- classpath.orig/gnu/java/beans/encoder/elements/Element.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/Element.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,157 @@ ++/* Element.java -- Base class for object tree elements. ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath 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 for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++02110-1301 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import java.util.Iterator; ++import java.util.LinkedList; ++ ++import gnu.java.beans.encoder.ObjectId; ++import gnu.java.beans.encoder.Writer; ++ ++/** <code>Element</code> is the base class for the object tree elements. ++ * ++ * <p>It provides the neccessary infrastructure every element subclass ++ * needs in order to interact with the {@link gnu.java.beans.encoder.Root} ++ * class.</p> ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ */ ++public abstract class Element ++{ ++ /** ++ * Stores the child elements. ++ */ ++ private LinkedList children = new LinkedList(); ++ ++ /** ++ * An optional ObjectId instance which is needed for certain subclasses ++ * only. ++ */ ++ private ObjectId objectId; ++ ++ /** Sets an {@link gnu.java.beans.encoder.ObjectId} instance in this ++ * <code>Element</code>. ++ * ++ * <p>This can only be done once.</p> ++ * ++ * @param objectId An ObjectId instance. ++ */ ++ public final void initId(ObjectId objectId) ++ { ++ assert (this.objectId == null); ++ assert (objectId != null); ++ ++ this.objectId = objectId; ++ } ++ ++ /** Adds a child element to this <code>Element</code>. ++ * ++ * @param elem The new child. ++ */ ++ public final void addChild(Element elem) ++ { ++ children.add(elem); ++ } ++ ++ /** Removes the child element added last. ++ */ ++ public final void removeLast() ++ { ++ children.removeLast(); ++ } ++ ++ /** Provides access to the child elements via an iterator. ++ * ++ * @return An iterator for the child elements. ++ */ ++ public final Iterator iterator(){ ++ return children.iterator(); ++ } ++ ++ /** Clears all the stored child elements. ++ * ++ */ ++ public final void clear() ++ { ++ children.clear(); ++ } ++ ++ /** Returns whether this element contains child elements. ++ * ++ * <p>This method is useful to decide which formatting variant ++ * for the XML element can be chosen.</p> ++ * ++ * @return Whether the element has child elements. ++ */ ++ public final boolean isEmpty() ++ { ++ return children.isEmpty(); ++ } ++ ++ /** Retrieves the element's {@link gnu.java.beans.encoder.ObjectId} instance ++ * if it has one. ++ * ++ * @return The ObjectId instance or <code>null</code>. ++ */ ++ public final ObjectId getId() ++ { ++ return objectId; ++ } ++ ++ /** Writes the opening XML tag. ++ * ++ * @param writer The writer to be used for XML writing. ++ */ ++ public abstract void writeStart(Writer writer); ++ ++ /** Writes the closing XML tag. ++ * ++ * <p>By default this does <code>writer.writeEnd(children.isEmpty())</code>. ++ * Override if neccessary, for example when using the ++ * {@link gnu.java.beans.encoder.Writer#writeNoChildren}</code> method ++ * variants. ++ * ++ * @param writer The writer to be used for XML writing. ++ */ ++ public void writeEnd(Writer writer) ++ { ++ writer.writeEnd(children.isEmpty()); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/List_Get.java classpath/gnu/java/beans/encoder/elements/List_Get.java +--- classpath.orig/gnu/java/beans/encoder/elements/List_Get.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/List_Get.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,56 @@ ++/* List_Get.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath 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 for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++02110-1301 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import gnu.java.beans.encoder.Writer; ++ ++/** Generates an XML element denoting the retrieval of a list's element. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public class List_Get extends Element ++{ ++ ++ public void writeStart(Writer writer) ++ { ++ writer.write("object", "get"); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/List_Set.java classpath/gnu/java/beans/encoder/elements/List_Set.java +--- classpath.orig/gnu/java/beans/encoder/elements/List_Set.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/List_Set.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,56 @@ ++/* List_Set.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath 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 for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++02110-1301 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import gnu.java.beans.encoder.Writer; ++ ++/** Generates an XML element denoting the setting of a list's element. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public class List_Set extends Element ++{ ++ ++ public void writeStart(Writer writer) ++ { ++ writer.write("object", "set"); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/MethodInvocation.java classpath/gnu/java/beans/encoder/elements/MethodInvocation.java +--- classpath.orig/gnu/java/beans/encoder/elements/MethodInvocation.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/MethodInvocation.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,62 @@ ++/* MethodCall.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath 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 for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++02110-1301 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import gnu.java.beans.encoder.Writer; ++ ++/** Generates an XML element denoting a non-static method call. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public class MethodInvocation extends Element ++{ ++ final String methodName; ++ ++ public MethodInvocation(String newMethodName) ++ { ++ methodName = newMethodName; ++ } ++ ++ public void writeStart(Writer writer) ++ { ++ writer.write("void", "method", methodName, isEmpty()); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/NullObject.java classpath/gnu/java/beans/encoder/elements/NullObject.java +--- classpath.orig/gnu/java/beans/encoder/elements/NullObject.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/NullObject.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,61 @@ ++/* NullObject.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import gnu.java.beans.encoder.Writer; ++ ++/** Generates an XML element denoting the <code>null</code> value. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public class NullObject extends Element ++{ ++ ++ public void writeStart(Writer writer) ++ { ++ writer.write("null", true); ++ } ++ ++ public void writeEnd(Writer writer) ++ { ++ writer.writeEnd(true); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/ObjectInstantiation.java classpath/gnu/java/beans/encoder/elements/ObjectInstantiation.java +--- classpath.orig/gnu/java/beans/encoder/elements/ObjectInstantiation.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/ObjectInstantiation.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,68 @@ ++/* ObjectInstantiation.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import gnu.java.beans.encoder.ObjectId; ++import gnu.java.beans.encoder.Writer; ++ ++/** Generates an XML element denoting the instantiation of an object. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public class ObjectInstantiation extends Element ++{ ++ final String className; ++ ++ public ObjectInstantiation(String newClassName) ++ { ++ className = newClassName; ++ } ++ ++ public void writeStart(Writer writer) ++ { ++ ObjectId objectId = getId(); ++ if (objectId.isUnused()) ++ writer.write("object", "class", className, isEmpty()); ++ else ++ writer.write("object", new String[] { "id", "class" }, ++ new String[] { objectId.toString(), className }, isEmpty()); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/ObjectReference.java classpath/gnu/java/beans/encoder/elements/ObjectReference.java +--- classpath.orig/gnu/java/beans/encoder/elements/ObjectReference.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/ObjectReference.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,68 @@ ++/* StringInstantiation.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import gnu.java.beans.encoder.ObjectId; ++import gnu.java.beans.encoder.Writer; ++ ++/** Generates an XML element denoting referencing an existing object. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public class ObjectReference extends Element ++{ ++ final ObjectId id; ++ ++ public ObjectReference(ObjectId newId) ++ { ++ id = newId; ++ ++ // Initializing the Id here is making sure it gets ++ // actually used. This step modifies the Id instance ++ // in other elements. ++ id.init(); ++ } ++ ++ public void writeStart(Writer writer) ++ { ++ writer.write("object", "idref", id.toString(), isEmpty()); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/PrimitiveInstantiation.java classpath/gnu/java/beans/encoder/elements/PrimitiveInstantiation.java +--- classpath.orig/gnu/java/beans/encoder/elements/PrimitiveInstantiation.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/PrimitiveInstantiation.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,69 @@ ++/* PrimitiveInstantiation.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import gnu.java.beans.encoder.Writer; ++ ++/** Generates an XML element denoting a primitive data value. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public class PrimitiveInstantiation extends Element ++{ ++ final String primitiveName; ++ ++ final String valueAsString; ++ ++ public PrimitiveInstantiation(String newPrimitiveName, String newValueAsString) ++ { ++ primitiveName = newPrimitiveName; ++ valueAsString = newValueAsString; ++ } ++ ++ public void writeStart(Writer writer) ++ { ++ writer.writeNoChildren(primitiveName, valueAsString); ++ } ++ ++ public void writeEnd(Writer writer) ++ { ++ writer.writeEndNoChildren(); ++ } ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/StaticFieldAccess.java classpath/gnu/java/beans/encoder/elements/StaticFieldAccess.java +--- classpath.orig/gnu/java/beans/encoder/elements/StaticFieldAccess.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/StaticFieldAccess.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,66 @@ ++/* StaticFieldAccess.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import gnu.java.beans.encoder.Writer; ++ ++/** Generates an XML element denoting a static method call. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public class StaticFieldAccess extends Element ++{ ++ final String className; ++ ++ final String fieldName; ++ ++ public StaticFieldAccess(String newClassName, String newFieldName) ++ { ++ className = newClassName; ++ fieldName = newFieldName; ++ } ++ ++ public void writeStart(Writer writer) ++ { ++ writer.write("object", new String[] { "class", "field" }, ++ new String[] { className, fieldName }, isEmpty()); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/StaticMethodInvocation.java classpath/gnu/java/beans/encoder/elements/StaticMethodInvocation.java +--- classpath.orig/gnu/java/beans/encoder/elements/StaticMethodInvocation.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/StaticMethodInvocation.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,67 @@ ++/* StaticMethodCall.java ++ -- A class denoting an XML element which makes up a static method call. ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath 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 for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++02110-1301 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import gnu.java.beans.encoder.Writer; ++ ++/** ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public class StaticMethodInvocation extends Element ++{ ++ final String className; ++ ++ final String methodName; ++ ++ public StaticMethodInvocation(String newClassName, String newMethodName) ++ { ++ className = newClassName; ++ methodName = newMethodName; ++ } ++ ++ public void writeStart(Writer writer) ++ { ++ writer.write("void", new String[] { "class", "method" }, ++ new String[] { className, methodName }, isEmpty()); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/elements/StringReference.java classpath/gnu/java/beans/encoder/elements/StringReference.java +--- classpath.orig/gnu/java/beans/encoder/elements/StringReference.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/elements/StringReference.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,63 @@ ++/* StringInstantiation.java ++ -- A class denoting an XML element which retrieves an array element. ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder.elements; ++ ++import gnu.java.beans.encoder.Writer; ++ ++public class StringReference extends Element ++{ ++ final String string; ++ ++ public StringReference(String newString) ++ { ++ string = newString; ++ } ++ ++ public void writeStart(Writer writer) ++ { ++ writer.writeNoChildren("string", string); ++ } ++ ++ public void writeEnd(Writer writer) ++ { ++ writer.writeEndNoChildren(); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/GenericScannerState.java classpath/gnu/java/beans/encoder/GenericScannerState.java +--- classpath.orig/gnu/java/beans/encoder/GenericScannerState.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/GenericScannerState.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,257 @@ ++/* GenericScannerState.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder; ++ ++import java.util.HashMap; ++ ++import gnu.java.beans.encoder.elements.ArrayInstantiation; ++import gnu.java.beans.encoder.elements.Array_Get; ++import gnu.java.beans.encoder.elements.Array_Set; ++import gnu.java.beans.encoder.elements.ClassResolution; ++import gnu.java.beans.encoder.elements.Element; ++import gnu.java.beans.encoder.elements.List_Get; ++import gnu.java.beans.encoder.elements.List_Set; ++import gnu.java.beans.encoder.elements.MethodInvocation; ++import gnu.java.beans.encoder.elements.NullObject; ++import gnu.java.beans.encoder.elements.ObjectInstantiation; ++import gnu.java.beans.encoder.elements.ObjectReference; ++import gnu.java.beans.encoder.elements.PrimitiveInstantiation; ++import gnu.java.beans.encoder.elements.StaticFieldAccess; ++import gnu.java.beans.encoder.elements.StaticMethodInvocation; ++import gnu.java.beans.encoder.elements.StringReference; ++ ++/** ++ * This class is a {@link ScannerState} implementation that creates ++ * suitable {@link gnu.java.beans.encoder.elements.Element} instances ++ * for each transition variant. ++ * ++ * <p>Furthermore it can optionally skip a certain number of child ++ * elements. The algorithm can cope with the fact that one ++ * <code>GenericScannerState</code> instance may be called at ++ * different levels of recursions.</p> ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ */ ++class GenericScannerState extends ScannerState ++{ ++ private int skipElements, initialSkipElements; ++ ++ final Root root; ++ ++ HashMap skipValues; ++ ++ GenericScannerState(Root newRoot) ++ { ++ root = newRoot; ++ } ++ ++ GenericScannerState(Root root, int skipElements) ++ { ++ this(root); ++ this.skipElements = initialSkipElements = skipElements; ++ ++ if (skipElements > 0) ++ skipValues = new HashMap(); ++ } ++ ++ protected void enterImpl(Context ctx) ++ { ++ if (skipValues != null) ++ { ++ Integer skip = (Integer) skipValues.get(ctx); ++ ++ if (skip == null) ++ { ++ skip = Integer.valueOf(initialSkipElements); ++ skipValues.put(ctx, skip); ++ } ++ ++ skipElements = skip.intValue(); ++ } ++ } ++ ++ void methodInvocation(String methodName) ++ { ++ if (skipValues != null && skipElements > 0) ++ return; ++ ++ root.addChild(new MethodInvocation(methodName)); ++ } ++ ++ void staticMethodInvocation(String className, String methodName) ++ { ++ if (skipValues != null && skipElements > 0) ++ return; ++ ++ root.addChild(new StaticMethodInvocation(className, methodName)); ++ } ++ ++ void staticFieldAccess(String className, String fieldName) ++ { ++ if (skipValues != null && skipElements > 0) ++ return; ++ ++ root.addChild(new StaticFieldAccess(className, fieldName)); ++ } ++ ++ void classResolution(String className) ++ { ++ if (skipValues != null && skipElements > 0) ++ return; ++ ++ root.addChild(new ClassResolution(className)); ++ } ++ ++ void objectInstantiation(String className, ObjectId objectId) ++ { ++ if (skipValues != null && skipElements > 0) ++ return; ++ ++ Element elem = new ObjectInstantiation(className); ++ elem.initId(objectId); ++ ++ root.addChild(elem); ++ } ++ ++ void primitiveInstantiation(String primitiveName, String valueAsString) ++ { ++ if (skipValues != null && skipElements > 0) ++ return; ++ ++ root.addChild(new PrimitiveInstantiation(primitiveName, valueAsString)); ++ } ++ ++ void objectArrayInstantiation(String arrayClassName, String lengthAsString, ++ ObjectId objectId) ++ { ++ if (skipValues != null && skipElements > 0) ++ return; ++ ++ Element elem = new ArrayInstantiation(arrayClassName, lengthAsString); ++ elem.initId(objectId); ++ ++ root.addChild(elem); ++ } ++ ++ void primitiveArrayInstantiation(String arrayClassName, String lengthAsString, ++ ObjectId objectId) ++ { ++ objectArrayInstantiation(arrayClassName, lengthAsString, objectId); ++ } ++ ++ void arraySet(String indexAsString) ++ { ++ if (skipValues != null && skipElements > 0) ++ return; ++ ++ root.addChild(new Array_Set(indexAsString)); ++ } ++ ++ void arrayGet(String indexAsString) ++ { ++ if (skipValues != null && skipElements > 0) ++ return; ++ ++ root.addChild(new Array_Get(indexAsString)); ++ } ++ ++ void listGet() ++ { ++ if (skipValues != null && skipElements > 0) ++ return; ++ ++ root.addChild(new List_Get()); ++ } ++ ++ void listSet() ++ { ++ if (skipValues != null && skipElements > 0) ++ return; ++ ++ root.addChild(new List_Set()); ++ } ++ ++ void nullObject() ++ { ++ if (skipValues != null && skipElements > 0) ++ return; ++ ++ root.addChild(new NullObject()); ++ } ++ ++ void stringReference(String string) ++ { ++ if (skipValues != null && skipElements > 0) ++ return; ++ ++ root.addChild(new StringReference(string)); ++ } ++ ++ void objectReference(ObjectId id) ++ { ++ if (skipValues != null && skipElements > 0) ++ return; ++ ++ root.addChild(new ObjectReference(id)); ++ } ++ ++ void end() ++ { ++ if (skipValues != null) ++ { ++ if (skipElements > 0) ++ skipElements--; ++ else ++ { ++ // Finishes the Element we are constructing. ++ root.end(); ++ } ++ skipValues.put(context(), Integer.valueOf(skipElements)); ++ } ++ else ++ root.end(); ++ ++ } ++ ++ void enter() ++ { ++ ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/IgnoringScannerState.java classpath/gnu/java/beans/encoder/IgnoringScannerState.java +--- classpath.orig/gnu/java/beans/encoder/IgnoringScannerState.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/IgnoringScannerState.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,133 @@ ++/* IgnoringScannerState.java -- A ScannerState that does nothing. ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder; ++ ++/** A special {@link ScannerState} implementation that ignores all child ++ * elements. ++ * ++ * <p>Consider the call hierarchy: ++ * <code> ++ * methodInvocation ++ * objectInstantiation ++ * classResolution* ++ * objectInstantiation ++ * classResolution ++ * </code> ++ * </p> ++ * ++ * <p>When the ignoring state is active one can filter the elements of ++ * one level. One has to set up the state machine that a transition ++ * via "class resolution" from a state that was reached via "object ++ * instantation" reaches an <code>IgnoringScannerState</code>.</p> ++ * ++ * <p>Setting the default successor of a <code>IgnoringScannerState</code> ++ * to itself causes all elements of the call hierarchy to be skipped ++ * until another state is reached by going back.</p> ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++class IgnoringScannerState extends ScannerState ++{ ++ ++ void methodInvocation(String methodName) ++ { ++ } ++ ++ void staticMethodInvocation(String className, String methodName) ++ { ++ } ++ ++ void staticFieldAccess(String className, String fieldName) ++ { ++ } ++ ++ void classResolution(String className) ++ { ++ } ++ ++ void objectInstantiation(String className, ObjectId objectId) ++ { ++ } ++ ++ void primitiveInstantiation(String primitiveName, String valueAsString) ++ { ++ } ++ ++ void objectArrayInstantiation(String arrayClassName, String lengthAsString, ObjectId objectId) ++ { ++ } ++ ++ void primitiveArrayInstantiation(String arrayClassName, String lengthAsString, ObjectId objectId) ++ { ++ } ++ ++ void arraySet(String indexAsString) ++ { ++ } ++ ++ void arrayGet(String indexAsString) ++ { ++ } ++ ++ void listGet() ++ { ++ } ++ ++ void listSet() ++ { ++ } ++ ++ void nullObject() ++ { ++ } ++ ++ void stringReference(String string) ++ { ++ } ++ ++ void objectReference(ObjectId id) ++ { ++ } ++ ++ void end() ++ { ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/MapPersistenceDelegate.java classpath/gnu/java/beans/encoder/MapPersistenceDelegate.java +--- classpath.orig/gnu/java/beans/encoder/MapPersistenceDelegate.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/MapPersistenceDelegate.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,81 @@ ++/* MapPersistenceDelegate.java -- A PersistenceDelegate for Map subclasses. ++ ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder; ++ ++import java.util.Map; ++import java.beans.Encoder; ++import java.beans.Expression; ++import java.beans.PersistenceDelegate; ++import java.beans.Statement; ++ ++import java.util.Iterator; ++ ++/** ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ */ ++public class MapPersistenceDelegate extends PersistenceDelegate ++{ ++ ++ protected Expression instantiate(Object oldInstance, Encoder out) ++ { ++ return new Expression( ++ oldInstance, ++ oldInstance.getClass(), ++ "new", ++ null); ++ } ++ ++ protected void initialize(Class type, Object oldInstance, Object newInstance, ++ Encoder out) ++ { ++ Map map = (Map) oldInstance; ++ Iterator ite = map.keySet().iterator(); ++ ++ while (ite.hasNext()) ++ { ++ Object key = ite.next(); ++ out.writeStatement(new Statement(oldInstance, "put", ++ new Object[] { key, map.get(key) })); ++ ++ } ++ ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/ObjectId.java classpath/gnu/java/beans/encoder/ObjectId.java +--- classpath.orig/gnu/java/beans/encoder/ObjectId.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/ObjectId.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,132 @@ ++/* ObjectId.java -- Simple object identification mechanism for XML encoding. ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder; ++ ++import java.util.HashMap; ++ ++/** ++ * <p> ++ * ObjectId provides an object identification mechanism which gives each object ++ * a name in the form <code><class><Nameindex></code>. ++ * </p> ++ * ++ * <p> ++ * Each id can be in an unused state which means that only one instance of the ++ * object is in use and a special id is not needed. Certain {@link ++ * gnu.java.beans.encoder.elements.Element} subclasses use this feature to find ++ * out whether they write the "id" attribute or not. ++ * </p> ++ * <p> ++ * An <code>ObjectId</code> instance is typically given to multiple objects. ++ * The second user should then invoke the {@link #init} method to generate the ++ * identification string and bring the id in the 'used' state. ++ * </p> ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ */ ++public class ObjectId ++{ ++ /** ++ * Stores the index an object of a specific type should be given. ++ */ ++ private static HashMap nameIndices = new HashMap(); ++ ++ private String id; ++ ++ private Class klass; ++ ++ ObjectId(Class klass) ++ { ++ this.klass = klass; ++ } ++ ++ public boolean isUnused() ++ { ++ return id == null; ++ } ++ ++ public String toString() ++ { ++ return (id != null) ? id : "<unused id>"; ++ } ++ ++ /** ++ * <p> ++ * Generates a simple Id by concatenating a class name with a self-increasing ++ * number. ++ * </p> ++ */ ++ public void init() ++ { ++ assert (klass != null); ++ ++ if (id != null) ++ return; ++ ++ Integer count = (Integer) nameIndices.get(klass); ++ if (count == null) ++ { ++ count = Integer.valueOf(0); ++ } ++ ++ if (klass.isArray()) ++ { ++ Class ct = klass.getComponentType(); ++ if (ct == Boolean.TYPE) ++ id = "booleanArray" + count.intValue(); ++ else if (ct == Byte.TYPE) ++ id = "byteArray" + count.intValue(); ++ else if (ct == Short.TYPE) ++ id = "shortArray" + count.intValue(); ++ else if (ct == Integer.TYPE) ++ id = "intArray" + count.intValue(); ++ else if (ct == Long.TYPE) ++ id = "longArray" + count.intValue(); ++ else if (ct == Float.TYPE) ++ id = "floatArray" + count.intValue(); ++ else if (ct == Double.TYPE) ++ id = "doubleArray" + count.intValue(); ++ } ++ else ++ id = klass.getName() + count.intValue(); ++ ++ nameIndices.put(klass, Integer.valueOf(count.intValue() + 1)); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/PrimitivePersistenceDelegate.java classpath/gnu/java/beans/encoder/PrimitivePersistenceDelegate.java +--- classpath.orig/gnu/java/beans/encoder/PrimitivePersistenceDelegate.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/PrimitivePersistenceDelegate.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,74 @@ ++/* PrimitivePersistenceDelegate.java ++ -- A PersistenceDelegate for primitive data types. ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath 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 for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++02110-1301 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package gnu.java.beans.encoder; ++ ++import java.beans.Encoder; ++import java.beans.Expression; ++import java.beans.PersistenceDelegate; ++ ++/** ++ * A shared PersistenceDelegate implementation for all primitive types. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ */ ++public class PrimitivePersistenceDelegate extends PersistenceDelegate ++{ ++ ++ protected Expression instantiate(Object oldInstance, Encoder out) ++ { ++ // The implementation relies on the fact that every primitive ++ // wrapper class has a constructor accepting a String argument. ++ // By using these constructors creating a primitive instance ++ // depends on the String class only. ++ return new Expression(oldInstance, oldInstance.getClass(), "new", ++ new Object[] { oldInstance.toString() }); ++ } ++ ++ protected void initialize(Class type, Object oldInstance, Object newInstance, Encoder out) ++ { ++ // This is a hack to make serializing primitive arrays work correctly. ++ // Instead of modifying an existing primitive instance to make it equal ++ // with another instance (which is not possible because primitives are ++ // immutable) we create a new instance. This is against the specification ++ // of the initialize method but make things work fine. ++ out.writeExpression(new Expression(oldInstance, oldInstance.getClass(), "new", ++ new Object[] { oldInstance.toString() })); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/ReportingScannerState.java classpath/gnu/java/beans/encoder/ReportingScannerState.java +--- classpath.orig/gnu/java/beans/encoder/ReportingScannerState.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/ReportingScannerState.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,131 @@ ++/* ReportingScannerState.java -- A state for debugging purposes. ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder; ++ ++/** ++ * A <code>ScannerState</code> implementation that prints useful details ++ * about its arguments. Use it when the XML encoding does not work correctly ++ * and you want to find out how things relate to each other. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ */ ++class ReportingScannerState extends ScannerState ++{ ++ ++ void methodInvocation(String methodName) ++ { ++ System.out.println("methodInvocation: " + methodName + "()"); ++ } ++ ++ void staticMethodInvocation(String className, String methodName) ++ { ++ System.out.println("staticMethodInvocation: " + className + "." + methodName + "()"); ++ } ++ ++ void staticFieldAccess(String className, String fieldName) ++ { ++ System.out.println("staticFieldAccess: " + className + "." + fieldName); ++ } ++ ++ void classResolution(String className) ++ { ++ System.out.println("classResolution: " + className); ++ } ++ ++ void objectInstantiation(String className, ObjectId objectId) ++ { ++ System.out.println("objectInstantiation: " + className); ++ } ++ ++ void primitiveInstantiation(String primitiveName, String valueAsString) ++ { ++ System.out.println("primitiveInstantiation: (" + primitiveName + ") " + valueAsString); ++ } ++ ++ void objectArrayInstantiation(String arrayClassName, String lengthAsString, ObjectId objectId) ++ { ++ System.out.println("objectArrayInstantiation: new " + arrayClassName + "[" + lengthAsString + "]"); ++ } ++ ++ void primitiveArrayInstantiation(String arrayClassName, String lengthAsString, ObjectId objectId) ++ { ++ System.out.println("primitiveArrayInstantiation: new " + arrayClassName + "[" + lengthAsString + "]"); ++ } ++ ++ void arraySet(String indexAsString) ++ { ++ System.out.println("arraySet: " + indexAsString); ++ } ++ ++ void arrayGet(String indexAsString) ++ { ++ System.out.println("arrayGet: " + indexAsString); ++ } ++ ++ void listGet() ++ { ++ System.out.println("listGet"); ++ } ++ ++ void listSet() ++ { ++ System.out.println("listSet"); ++ } ++ ++ void nullObject() ++ { ++ System.out.println("nullObject"); ++ } ++ ++ void stringReference(String string) ++ { ++ System.out.println("stringReference: " + string); ++ } ++ ++ void objectReference(ObjectId id) ++ { ++ System.out.println("objectReference: " + id); ++ } ++ ++ void end() ++ { ++ System.out.println("-close"); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/Root.java classpath/gnu/java/beans/encoder/Root.java +--- classpath.orig/gnu/java/beans/encoder/Root.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/Root.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,198 @@ ++/* Root.java -- The root of an object tree. ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder; ++ ++import java.beans.XMLEncoder; ++import java.util.Iterator; ++import java.util.Stack; ++ ++import gnu.java.beans.encoder.elements.Element; ++ ++/** <p><code>Root</code> provides a simple interface to a tree of ++ * objects.</p> ++ * ++ * <p>Using an instance of this class a logical representation of ++ * the real object tree that is serialized can be built. When the ++ * actual data should be written as XML <code>Root</code> and ++ * {@link gnu.java.beans.encoder.elements.Element} class can provide ++ * context information which is used to write the best fitting ++ * XML representation.</p> ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ */ ++public class Root ++{ ++ private Stack parents = new Stack(); ++ ++ private Element rootElement, current; ++ ++ private boolean started; ++ ++ public Root() ++ { ++ rootElement = current = new RootElement(); ++ } ++ ++ /** <p>Adds another child element to the tree.</p> ++ * ++ * <p>The new element automatically becomes the current ++ * element.</p> ++ * ++ * @param elem The new child element. ++ */ ++ public void addChild(Element elem) ++ { ++ current.addChild(elem); ++ ++ parents.push(current); ++ current = elem; ++ } ++ ++ /** ++ * <p>Marks that the end of the current element ++ * is reached and that no more childs are added to ++ * it.</p> ++ * ++ * <p>The behavior is to return to the nearest parent ++ * element.</p> ++ */ ++ public void end() ++ { ++ current = (Element) parents.pop(); ++ } ++ ++ /** ++ * <p>Goes back to the nearest parent element but ++ * deletes the just created child.</p> ++ * ++ * <p>This is used if something went wrong while ++ * processing the child element's {@link java.beans.Expression} ++ * or {@link java.beans.Statement}.</p> ++ * ++ */ ++ public void deleteLast() ++ { ++ current = (Element) parents.pop(); ++ ++ current.removeLast(); ++ } ++ ++ /** ++ * <p>Traverses the elements in the object tree ++ * and creates their XML representation in the output ++ * stream of the given {@link Writer}.</p> ++ * ++ * <p>Finally the <code>Writer</code> is flushed.</p> ++ * ++ * @param writer The Writer instance that generates the XML representation. ++ */ ++ public void traverse(Writer writer) ++ { ++ if (!started) ++ { ++ writer.writePreamble(); ++ rootElement.writeStart(writer); ++ } ++ started = true; ++ ++ traverse(writer, rootElement.iterator()); ++ ++ rootElement.clear(); ++ ++ writer.flush(); ++ } ++ ++ /** Writes the closing element and closes the {@link Writer} ++ * ++ * @param writer The Writer instance that generates the XML representation. ++ */ ++ public void close(Writer writer) ++ { ++ rootElement.writeEnd(writer); ++ writer.close(); ++ } ++ ++ /** Recursively traverses the object tree. ++ * ++ * @param writer The Writer instance that generates the XML representation. ++ * @param ite An Iterator returning Element instances. ++ */ ++ private void traverse(Writer writer, Iterator ite) ++ { ++ while (ite.hasNext()) ++ { ++ Element e = (Element) ite.next(); ++ e.writeStart(writer); ++ ++ traverse(writer, e.iterator()); ++ ++ e.writeEnd(writer); ++ ++ e.clear(); ++ } ++ } ++ ++ /** <p>A special Element implementation that represents the ++ * encoder's context.</p> ++ * ++ * <p>This element is written only once per Writer.</p> ++ * ++ * <p>It is assumed that this element is never empty to simplify ++ * the implementation.</p> ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org); ++ * ++ */ ++ static class RootElement extends Element ++ { ++ public void writeStart(Writer writer) ++ { ++ writer.write("java", new String[] { "version", "class" }, ++ new String[] { System.getProperty("java.version"), ++ XMLEncoder.class.getName() }, false); ++ } ++ ++ public void writeEnd(Writer writer) ++ { ++ writer.writeEnd(false); ++ } ++ ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/ScanEngine.java classpath/gnu/java/beans/encoder/ScanEngine.java +--- classpath.orig/gnu/java/beans/encoder/ScanEngine.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/ScanEngine.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,860 @@ ++/* ScanEngine.java ++ -- Scans the input and generates an object tree that can be written as XML. ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder; ++ ++import java.beans.Expression; ++import java.beans.Statement; ++import java.io.OutputStream; ++import java.lang.reflect.Array; ++import java.util.HashMap; ++import java.util.IdentityHashMap; ++import java.util.List; ++import java.util.Stack; ++ ++/** <p>The <code>ScanEngine</code> is the main class of the backend of the ++ * XML persistence algorithm. It scans {@link java.beans.Expression} and ++ * {@link java.beans.Statement} instances and some raw objects via the ++ * {@link #writeObject} method and feeds it to a state machine. The ++ * state machine then constructs and object tree which is finally ++ * written as XML by a {@link Writer} implementation.</p> ++ * ++ * <p>How does it work?</p> ++ * <p>The <code>ScanEngine</code> sits below the {@link java.beans.XMLEncoder} ++ * class and is called by it exclusively. The <code>XMLEncoder</code> sends ++ * interpretive data by invoking {@link #writeExpression}, {@link #writeStatement} ++ * and {@link #writeObject}. The invocations of <code>writeExpression</code> and ++ * <code>writeStatement</code> are usually nested into each other and provide ++ * more information then necessary to generate the XML representation. ++ * Furthermore the meaning of certain <code>Expressions</code> differs ++ * depending on the enclosing elements or the inner elements have to be ++ * simply discarded.</p> ++ * ++ * <p>To cope with this state dependant nature the <code>ScanEngine</code> ++ * contains a state machine which is programmed statically (no adjustments are ++ * needed, all <code>ScanEngine</code> engines use the same setup). The ++ * <code>ScanEngine</code>'s job is to decode the <code>Expression</code>s, ++ * <code>Statement</code>s and certain objects (namely <code>String</code>, ++ * <code>null</code> objects and instances which are repeatedly provided to ++ * the encoder) into 13 low-level (event) methods, which denote the meaning of the ++ * argument. For example an <code>Expression</code> can be an array ++ * instantiation which provokes a call to {@link arrayInstantiation} or ++ * it can be a class resolution leading to a call to {@link #classResolution}. ++ * For the state machione the 13 methods are the distinct way to transit ++ * from one state to another. Whenever the <code>ScanEngine</code> calls ++ * one of the event methods the current's state successor for that event ++ * is fetched from the state machine configuration, the successpr becomes ++ * the current state and then the event method is called in the new current ++ * state. The last step allows the state instance to do something meaningful ++ * to the object tree.</p> ++ * ++ * <p>The state machine knows the concept of returning to the previous ++ * state. This is done using a stack of states which is popped every ++ * time a call to <code>writeStatement</code>, <code>writeExpression</code> ++ * in the <code>XMLEncoder</code> ends by calling the {@link #end} method. ++ * Note that due to the inheritance relationship of <code>Encoder</code> ++ * and <code>XMLEncoder</code> it is impossible for the ++ * <code>ScanEngine</code> itself to decide when an expression or statement ++ * ended. This can only be done in case of {@link #writeObject} calls because ++ * they are not nested.</p> ++ * ++ * <p>When the XML persistence mechanism reaches an object twice (and more) ++ * it should generate an XML element using the "idref" attribute and add ++ * an "id" attribute to its first instantiation. This complicates things a bit ++ * because the first instantiation will always be part of the object tree ++ * as some {@link gnu.java.beans.encoder.elements.Element} subclass instance when the ++ * second and further objects accesses are written. Therefore the {@link ObjectId} ++ * class was introduced which is shared between all the object tree elements ++ * and has the notion of an "unused" state meaning that no identification ++ * is needed. The relationship between an object and its <code>ObjectId</code> ++ * instance is stored in the <code>ScanEngine</code> and gets cleared whenever ++ * the {@link #flush} method is called. This method also writes the currently ++ * built object tree and generates the XML representation.</p> ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ */ ++public class ScanEngine ++{ ++ ++ /** Change this to true to let the ScanEngine print state transition ++ * information. ++ */ ++ boolean DEBUG = false; ++ ++ /** ++ * Stores the scanner engine states as values and their names as keys. ++ */ ++ HashMap states = new HashMap(); ++ ++ /** ++ * Stores former scanner state and makes it possible to come back to them. ++ */ ++ Stack parents = new Stack(); ++ ++ /** ++ * The currently active scanner state. ++ */ ++ ScannerState current; ++ ++ /** ++ * The root of an object tree that is later written to XML. ++ */ ++ Root root; ++ ++ /** ++ * The Writer used to generate the XML output. ++ */ ++ Writer writer; ++ ++ /** Stores the relationship between objects and their {@link ObjectId} instance. ++ */ ++ IdentityHashMap objects = new IdentityHashMap(); ++ ++ public ScanEngine(OutputStream os) ++ { ++ // TODO: Provide another Writer implementation (e.g. one that does not use ++ // the XML APIs at all). ++ writer = new StAXWriter(os); ++ root = new Root(); ++ ++ final ScannerState start = current = new GenericScannerState(root);; ++ ScannerState conf; ++ ++ // Use the ReportingScannerState to debug serialization issues. ++ register(ScannerState.DEFAULT_STATE_NAME, new IgnoringScannerState()); ++ ++ register("start", start); ++ ++ // Special dead-end state where all transitions are ignored. ++ register("ignoreAll", new IgnoringScannerState()) ++ .setDefaultSuccessor("ignoreAll"); ++ ++ // Object reference, string reference, null object ++ start.putSuccessor(ScannerState.TRANSITION_OBJECT_REFERENCE, "simple"); ++ start.putSuccessor(ScannerState.TRANSITION_STRING_REFERENCE, "simple"); ++ start.putSuccessor(ScannerState.TRANSITION_NULL_OBJECT, "simple"); ++ register("simple", new GenericScannerState(root)) ++ .setDefaultSuccessor("ignoreAll"); ++ ++ // Class resolution. ++ start.putSuccessor(ScannerState.TRANSITION_CLASS_RESOLUTION, "classRes0"); ++ register("classRes0", ++ new GenericScannerState(root)).setDefaultSuccessor("ignoreAll"); ++ ++ // Object instantiation. ++ start.putSuccessor(ScannerState.TRANSITION_OBJECT_INSTANTIATION, ++ "newObj0"); ++ conf = register("newObj0", new GenericScannerState(root)); ++ conf.setDefaultSuccessor("ignoreAll"); ++ ++ // Simply use the start state to encode method invocations inside of ++ // objects. ++ conf.putSuccessor(ScannerState.TRANSITION_METHOD_INVOCATION, "start"); ++ ++ // Primitive instantiations. ++ start.putSuccessor(ScannerState.TRANSITION_PRIMITIVE_INSTANTIATION, ++ "newPrimitive0"); ++ register("newPrimitive0", ++ new GenericScannerState(root)).setDefaultSuccessor("ignoreAll"); ++ ++ // Object arrays use the ARRAY_GET transition to create setting the ++ // array values. ++ start.putSuccessor(ScannerState.TRANSITION_OBJECT_ARRAY_INSTANTIATION, ++ "newObjectArray"); ++ conf = register("newObjectArray", new GenericScannerState(root)); ++ conf.putSuccessor(ScannerState.TRANSITION_ARRAY_GET, "newOArrayGet"); ++ conf.putSuccessor(ScannerState.TRANSITION_ARRAY_SET, "ignoreAll"); ++ conf.putSuccessor(ScannerState.TRANSITION_CLASS_RESOLUTION, "ignoreAll"); ++ conf.putSuccessor(ScannerState.TRANSITION_PRIMITIVE_INSTANTIATION, ++ "ignoreAll"); ++ ++ // Get here when a value is set in the array. ++ register("newOArrayGet", ++ conf = new GenericScannerState(root)); ++ ++ conf.putSuccessor(ScannerState.TRANSITION_PRIMITIVE_INSTANTIATION, ++ "newOArrayGet_ignoreFirstInteger"); ++ ++ // "newArrayGet_ignoreFirstInteger" is set up mostly identical like the "start" ++ // state. Otherwise things would not behave the same when done inside ++ // arrays. ++ conf.putSuccessor(ScannerState.TRANSITION_OBJECT_REFERENCE, "simple"); ++ conf.putSuccessor(ScannerState.TRANSITION_STRING_REFERENCE, "simple"); ++ conf.putSuccessor(ScannerState.TRANSITION_NULL_OBJECT, "simple"); ++ conf.putSuccessor(ScannerState.TRANSITION_CLASS_RESOLUTION, "classRes0"); ++ conf.putSuccessor(ScannerState.TRANSITION_OBJECT_INSTANTIATION, "newObj0"); ++ conf.putSuccessor(ScannerState.TRANSITION_PRIMITIVE_ARRAY_INSTANTIATION, ++ "newPrimitiveArray"); ++ conf.putSuccessor(ScannerState.TRANSITION_OBJECT_ARRAY_INSTANTIATION, ++ "newObjectArray"); ++ ++ conf = register("newOArrayGet_ignoreFirstInteger", ++ new GenericScannerState(root, 1)); ++ ++ // In non-int primitive arrays class resolutions can happen ++ // but they should be ignored. ++ conf.putSuccessor(ScannerState.TRANSITION_CLASS_RESOLUTION, "ignoreAll"); ++ ++ // Spurious object and string references occur when setting array ++ // elements. This suppresses them. ++ conf.putSuccessor(ScannerState.TRANSITION_PRIMITIVE_INSTANTIATION, ++ "ignoreAll"); ++ conf.putSuccessor(ScannerState.TRANSITION_OBJECT_REFERENCE, "ignoreAll"); ++ conf.putSuccessor(ScannerState.TRANSITION_STRING_REFERENCE, "ignoreAll"); ++ ++ conf.setDefaultSuccessor("start"); ++ ++ // Primitive arrays use the ARRAY_SET transition to create setting the ++ // array values. This turned out to be the only working solution. ++ // When primitive arrays were handled by ARRAY_GET the values in boolean ++ // arrays were always skipped. ++ start.putSuccessor(ScannerState.TRANSITION_PRIMITIVE_ARRAY_INSTANTIATION, ++ "newPrimitiveArray"); ++ conf = register("newPrimitiveArray", new GenericScannerState(root)); ++ conf.putSuccessor(ScannerState.TRANSITION_ARRAY_GET, "ignoreAll"); ++ conf.putSuccessor(ScannerState.TRANSITION_ARRAY_SET, "newPArraySet"); ++ conf.putSuccessor(ScannerState.TRANSITION_CLASS_RESOLUTION, "ignoreAll"); ++ conf.putSuccessor(ScannerState.TRANSITION_PRIMITIVE_INSTANTIATION, ++ "ignoreAll"); ++ ++ conf = register("newPArraySet", new GenericScannerState(root)); ++ conf.putSuccessor(ScannerState.TRANSITION_PRIMITIVE_INSTANTIATION, ++ "newPArraySet_ignoreFirstInteger"); ++ ++ // Primitive arrays ignore all kinds of non-primitive object information. ++ conf.putSuccessor(ScannerState.TRANSITION_OBJECT_REFERENCE, ++ "ignoreAll"); ++ conf.putSuccessor(ScannerState.TRANSITION_STRING_REFERENCE, "ignoreAll"); ++ conf.putSuccessor(ScannerState.TRANSITION_NULL_OBJECT, "ignoreAll"); ++ conf.putSuccessor(ScannerState.TRANSITION_CLASS_RESOLUTION, "ingoreAll"); ++ conf.putSuccessor(ScannerState.TRANSITION_OBJECT_INSTANTIATION, "ignoreAll"); ++ conf.putSuccessor(ScannerState.TRANSITION_PRIMITIVE_ARRAY_INSTANTIATION, ++ "ignoreAll"); ++ conf.putSuccessor(ScannerState.TRANSITION_OBJECT_ARRAY_INSTANTIATION, ++ "ignoreAll"); ++ ++ conf = register("newPArraySet_ignoreFirstInteger", ++ new GenericScannerState(root, 1)); ++ ++ // In non-int primitive arrays class resolutions can happen ++ // but they should be ignored. ++ conf.putSuccessor(ScannerState.TRANSITION_CLASS_RESOLUTION, "ignoreAll"); ++ ++ // Spurious object and string references occur when setting array ++ // elements. This suppresses them. ++ conf.putSuccessor(ScannerState.TRANSITION_PRIMITIVE_INSTANTIATION, ++ "ignoreAll"); ++ conf.putSuccessor(ScannerState.TRANSITION_OBJECT_REFERENCE, "ignoreAll"); ++ conf.putSuccessor(ScannerState.TRANSITION_STRING_REFERENCE, "ignoreAll"); ++ conf.setDefaultSuccessor("start"); ++ ++ } ++ ++ /** Registers a <code>ScannerState</code> under a certain name. ++ * ++ * @param name Name of the state ++ * @param state The <code>ScannerState</code> instance. ++ * @return The second argument. ++ */ ++ private ScannerState register(String name, ScannerState state) ++ { ++ state.init(name); ++ ++ states.put(name, state); ++ ++ return state; ++ } ++ ++ /** Generates or returns an id for the given object which can be activated ++ * later if the object is suitable. ++ * ++ * <p>Objects are unsuitable if they are an instance of a primitive wrapper ++ * or String.</p> ++ * ++ * @param value The object to retrieve an id for. ++ * @return The id for the object or <code>null</code>. ++ */ ++ private ObjectId retrieveId(Object value) ++ { ++ Class valueClass = value.getClass(); ++ ObjectId id = null; ++ ++ // Although multiple accesses to Class objects are not handled ++ // through ids we generate one for them, too. This allows us to detect ++ // second time references to such objects in the writeObject method ++ // and handle them in a special way. ++ if (valueClass != String.class ++ && valueClass.getSuperclass() != Number.class ++ && valueClass != Boolean.class) ++ { ++ if ((id = (ObjectId) objects.get(value)) == null) ++ { ++ id = new ObjectId(valueClass); ++ objects.put(value, id); ++ } ++ } ++ ++ return id; ++ } ++ ++ /** Scans the argument and calls one of event methods. See ++ * the introduction of this class for details. ++ * ++ * @param expr The expression to serialize. ++ */ ++ public void writeExpression(Expression expr) ++ { ++ String methodName = expr.getMethodName(); ++ Object[] args = expr.getArguments(); ++ Object target = expr.getTarget(); ++ Object value = null; ++ ++ try ++ { ++ value = expr.getValue(); ++ } ++ catch (Exception e) ++ { ++ throw (InternalError) ++ new InternalError( ++ "The Expression's value should be available at this point.") ++ .initCause(e); ++ } ++ ++ // TODO: What if the value is null? ++ ObjectId id; ++ Class valueClass = value.getClass(); ++ ++ if (target == Array.class) ++ { ++ if (methodName.equals("newInstance")) ++ { ++ id = retrieveId(value); ++ ++ Class ct = (Class) args[0]; ++ ++ if (ct.isPrimitive() || ct == Boolean.class || ct == Byte.class ++ || ct == Short.class || ct == Integer.class || ct == Long.class ++ || ct == Float.class || ct == Double.class) ++ primitiveArrayInstantiation(ct.getName(), ++ args[1].toString(), ++ id); ++ else ++ objectArrayInstantiation(ct.getName(), ++ args[1].toString(), ++ id); ++ ++ return; ++ } ++ else if (methodName.equals("get")) ++ { ++ arrayGet(args[1].toString()); ++ ++ // The encoder does not call the ScanEngine ++ // when an object is serialized that we already know. ++ // We test for this situation and insert the object reference ++ // manually. ++ // Since there is already a workaround for the Class class ++ // in writeObject we have to except it from this behavior. ++ id = (ObjectId) objects.get(value); ++ if (id != null && valueClass != Class.class) ++ { ++ objectReference(id); ++ end(); ++ } ++ ++ return; ++ } ++ else if (methodName.equals("set")) ++ { ++ arraySet(args[1].toString()); ++ return; ++ } ++ } ++ ++ id = retrieveId(value); ++ ++ if (target instanceof Class) ++ { ++ if (methodName.equals("new")) ++ { ++ Class targetClass = (Class) target; ++ ++ // All primitive types have short-hand forms for their ++ // constructors. ++ if (valueClass == Boolean.class) ++ primitiveInstantiation("boolean", args[0].toString()); ++ else if (valueClass == Byte.class) ++ primitiveInstantiation("byte", args[0].toString()); ++ else if (valueClass == Short.class) ++ primitiveInstantiation("short", args[0].toString()); ++ else if (valueClass == Integer.class) ++ primitiveInstantiation("int", args[0].toString()); ++ else if (valueClass == Long.class) ++ primitiveInstantiation("long", args[0].toString()); ++ else if (valueClass == Float.class) ++ primitiveInstantiation("float", args[0].toString()); ++ else if (valueClass == Double.class) ++ primitiveInstantiation("double", args[0].toString()); ++ else ++ objectInstantiation(targetClass.getName(), id); ++ ++ return; ++ } ++ else if (value instanceof Class) ++ { ++ String className = ((Class) value).getName(); ++ ++ // At this point we know that some *static* method will be called. ++ ++ if (methodName.equals("forName")) ++ { ++ // However "Class.forName" represents class resolution and has a ++ // special syntax. ++ classResolution(className); ++ return; ++ } ++ else if (methodName.equals("getField")) ++ { ++ // The same goes for "Class.getField". ++ // Note: The name of the wanted field is given in ++ // the argument array. ++ staticFieldAccess(className, args[0].toString()); ++ return; ++ } ++ else ++ { ++ // If nothing fits it is just a static method ++ // invocation which we decode as such. ++ staticMethodInvocation(className, methodName); ++ return; ++ } ++ } ++ } ++ else if (target instanceof List) ++ { ++ // Special behavior for indexed get and set method for list-style ++ // classes. ++ // The arguments are in the args array but we need them as subelements. ++ if (methodName.equals("get")) ++ { ++ listGet(); ++ return; ++ } ++ else if (methodName.equals("set")) ++ { ++ listSet(); ++ return; ++ } ++ } ++ ++ // If nothing else could be used then this is a normal ++ // method invocation. ++ methodInvocation(methodName); ++ } ++ ++ /** ++ * Ends the current state and returns to the last one. ++ */ ++ public void end() ++ { ++ current.end(); ++ ++ if (DEBUG) System.err.print("back from " + current.getName()); ++ ++ ScannerState oldCurrent = current; ++ current = (ScannerState) parents.pop(); ++ ++ if (DEBUG) System.err.println(" to " + current.getName()); ++ } ++ ++ /** ++ * Returns to the last state and deletes the last element in the object tree. ++ */ ++ public void revoke() ++ { ++ ScannerState oldCurrent = current; ++ current = (ScannerState) parents.pop(); ++ ++ root.deleteLast(); ++ } ++ ++ /** Scans the argument and calls one of event methods. See ++ * the introduction of this class for details. ++ * ++ * @param stmt The statement to serialize. ++ */ ++ public void writeStatement(Statement stmt) ++ { ++ // This is a simplified version of writeExpression. Everything ++ // that would not create something that is embedded in a <void> tag ++ // is left out (instantiation, getters, ...). ++ // TODO: Is this the right thing to do? ++ ++ String methodName = stmt.getMethodName(); ++ Object target = stmt.getTarget(); ++ Object[] args = stmt.getArguments(); ++ ++ if (target == Array.class && methodName.equals("set")) ++ { ++ arraySet(args[1].toString()); ++ return; ++ } ++ ++ if (target instanceof List) ++ { ++ if (methodName.equals("set")) ++ { ++ listSet(); ++ return; ++ } ++ } ++ ++ // If nothing else could be used then this is a normal ++ // method invocation. ++ methodInvocation(methodName); ++ } ++ ++ /** Scans the argument and calls one of event methods. See ++ * the introduction of this class for details. ++ * ++ * @param o The object to serialize. ++ */ ++ public boolean writeObject(Object o) ++ { ++ ObjectId id = null; ++ ++ if (o == null) ++ { ++ // Handle null objects which have a special syntax. ++ nullObject(); ++ end(); ++ } ++ else if (o.getClass() == String.class) ++ { ++ // Handle strings which are treated extremely special ++ // in the encoder (they are never converted into a ++ // Expression). ++ stringReference((String) o); ++ end(); ++ } ++ else if ((id = (ObjectId) objects.get(o)) != null) ++ { ++ // Multiple references to a Class object do not generate ++ // an object reference but we use the id to detect that ++ // situation. ++ if (o.getClass() == Class.class) ++ { ++ classResolution(((Class) o).getName()); ++ end(); ++ return false; ++ } ++ ++ // If our object has a corresponding ObjectId instance ++ // then generate an objectReference. This will ++ // initialize the id (= brings it in the "used" state) ++ // when this is the first referal. ++ objectReference(id); ++ end(); ++ return false; ++ } ++ ++ return true; ++ } ++ ++ /** ++ * Writes the currently constructed object tree out as ++ * XML and clears the object to {@link ObjectId} relations. ++ */ ++ public void flush() ++ { ++ // Make all references unreachable. That means we have to generate ++ // new object ids. ++ objects.clear(); ++ ++ root.traverse(writer); ++ } ++ ++ /** Writes the final bits if the object tree and closes the stream ++ * afterwards. ++ */ ++ public void close() ++ { ++ flush(); ++ root.close(writer); ++ } ++ ++ /** ++ * Does a transition from one state to another using the given event. ++ * ++ * <p>This involves saving the current state, retrieving it's ++ * successor and setting it as the current state.</p> ++ * ++ * @param transition One of {@link ScannerStates]'s transition constants. ++ */ ++ private void transition(int transition) ++ { ++ parents.push(current); ++ ++ String stateName = current.getSuccessor(transition); ++ ++ if (DEBUG) ++ { ++ System.err.println("from state: " + current.getName() + "\n\troute: " ++ + ScannerState.transitionNames[transition] ++ + "\n\t\tto state: " ++ + stateName); ++ } ++ ++ ScannerState newState = (ScannerState) states.get(stateName); ++ ++ newState.enter(new Context(current.getName(), current.getCalls())); ++ ++ assert (newState != null) : "State '" + stateName + "' was not defined."; ++ ++ current = newState; ++ } ++ ++ /** Event method that denotes a (non-static) method invocation. ++ * ++ * <p>More details about this method can be found in this ++ * class' introduction.</p> ++ * ++ * @param methodName The name of the method which is called. ++ */ ++ void methodInvocation(String methodName) ++ { ++ transition(ScannerState.TRANSITION_METHOD_INVOCATION); ++ ++ current.methodInvocation(methodName); ++ } ++ ++ /** Event method that denotes a static method invocation. ++ * ++ * <p>More details about this method can be found in this ++ * class' introduction.</p> ++ * ++ * @param methodName The name of the method which is called. ++ * @param className The name of the class in which the method is called. ++ */ ++ void staticMethodInvocation(String className, String methodName) ++ { ++ transition(ScannerState.TRANSITION_STATIC_METHOD_INVOCATION); ++ ++ current.staticMethodInvocation(className, methodName); ++ } ++ ++ /** Event method that denotes the retrieval of a static field's value. ++ * ++ * <p>More details about this method can be found in this ++ * class' introduction.</p> ++ * ++ * @param fieldName The name of the field whose value is retrieved. ++ * @param className The name of the class in which the method is called. ++ */ ++ void staticFieldAccess(String className, String fieldName) ++ { ++ transition(ScannerState.TRANSITION_STATIC_FIELD_ACCESS); ++ ++ current.staticFieldAccess(className, fieldName); ++ } ++ ++ /** Event method that denotes the resolution of a class. ++ * ++ * <p>More details about this method can be found in this ++ * class' introduction.</p> ++ * ++ * @param className The name of the class in which the method is called. ++ */ ++ void classResolution(String className) ++ { ++ transition(ScannerState.TRANSITION_CLASS_RESOLUTION); ++ ++ current.classResolution(className); ++ } ++ ++ /** Event method that denotes the instantiation of an object. ++ * ++ * <p>More details about this method can be found in this ++ * class' introduction.</p> ++ * ++ * @param className The name of the class in which the method is called. ++ * @param objectId An ObjectId instance which can be activated later. ++ */ ++ void objectInstantiation(String className, ObjectId objectId) ++ { ++ transition(ScannerState.TRANSITION_OBJECT_INSTANTIATION); ++ ++ current.objectInstantiation(className, objectId); ++ } ++ ++ /** Event method that denotes the instantiation of a primitive. ++ * ++ * <p>More details about this method can be found in this ++ * class' introduction.</p> ++ * ++ * @param primitiveName One of "boolean, "byte", "short", "int", "long" ++ * , "float" or "double" ++ * @param valueAsString The value of the primitive as a String. ++ */ ++ void primitiveInstantiation(String primitiveName, String valueAsString) ++ { ++ transition(ScannerState.TRANSITION_PRIMITIVE_INSTANTIATION); ++ ++ current.primitiveInstantiation(primitiveName, valueAsString); ++ } ++ ++ /** Event method that denotes the instantiation of an object array. ++ * ++ * <p>More details about this method can be found in this ++ * class' introduction.</p> ++ * ++ * @param arrayClassName The array's class name. ++ * @param objectId An ObjectId instance which can be activated later. ++ * @param lengthAsString The array's length as String. ++ */ ++ void objectArrayInstantiation(String arrayClassName, String lengthAsString, ++ ObjectId objectId) ++ { ++ transition(ScannerState.TRANSITION_OBJECT_ARRAY_INSTANTIATION); ++ ++ current.objectArrayInstantiation(arrayClassName, lengthAsString, objectId); ++ } ++ ++ /** Event method that denotes the instantiation of a primitive array. ++ * ++ * <p>More details about this method can be found in this ++ * class' introduction.</p> ++ * ++ * @param arrayClassName The array's class name. ++ * @param objectId An ObjectId instance which can be activated later. ++ * @param lengthAsString The array's length as String. ++ */ ++ void primitiveArrayInstantiation(String arrayClassName, String lengthAsString, ++ ObjectId objectId) ++ { ++ transition(ScannerState.TRANSITION_PRIMITIVE_ARRAY_INSTANTIATION); ++ ++ current.objectArrayInstantiation(arrayClassName, lengthAsString, objectId); ++ } ++ ++ /** Event method that denotes the setting of a value in an array. ++ * ++ * <p>More details about this method can be found in this ++ * class' introduction.</p> ++ * ++ * @param indexAsString The index to as a String. ++ */ ++ void arraySet(String indexAsString) ++ { ++ transition(ScannerState.TRANSITION_ARRAY_SET); ++ ++ current.arraySet(indexAsString); ++ } ++ ++ /** Event method that denotes the retrieval of a value in an array. ++ * ++ * <p>More details about this method can be found in this ++ * class' introduction.</p> ++ * ++ * @param indexAsString The index to as a String. ++ */ ++ void arrayGet(String indexAsString) ++ { ++ transition(ScannerState.TRANSITION_ARRAY_GET); ++ ++ current.arrayGet(indexAsString); ++ } ++ ++ /** Event method that denotes the setting of a value in a list. ++ * ++ * <p>More details about this method can be found in this ++ * class' introduction.</p> ++ */ ++ void listSet() ++ { ++ transition(ScannerState.TRANSITION_LIST_SET); ++ ++ current.listSet(); ++ } ++ ++ /** Event method that denotes the retrieval of a value in a list. ++ * ++ * <p>More details about this method can be found in this ++ * class' introduction.</p> ++ */ ++ void listGet() ++ { ++ transition(ScannerState.TRANSITION_LIST_GET); ++ ++ current.listGet(); ++ } ++ ++ /** Event method that denotes the null value. ++ */ ++ void nullObject() ++ { ++ transition(ScannerState.TRANSITION_NULL_OBJECT); ++ ++ current.nullObject(); ++ } ++ ++ /** Event method that denotes a string. ++ * ++ * @param string The string that should be written. ++ */ ++ void stringReference(String string) ++ { ++ transition(ScannerState.TRANSITION_STRING_REFERENCE); ++ ++ current.stringReference(string); ++ } ++ ++ /** Event method that denotes a reference to an existing object. ++ * ++ * @param id The ObjectId to be used. ++ */ ++ void objectReference(ObjectId id) ++ { ++ transition(ScannerState.TRANSITION_OBJECT_REFERENCE); ++ ++ current.objectReference(id); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/ScannerState.java classpath/gnu/java/beans/encoder/ScannerState.java +--- classpath.orig/gnu/java/beans/encoder/ScannerState.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/ScannerState.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,236 @@ ++/* ScannerState.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder; ++ ++import java.util.HashMap; ++ ++/** <p>Provides the infrastructure for the state machine and the transition ++ * mechanism.</p> ++ * ++ * <p>Each states knows a set of successor. There can be one successor for ++ * every transition variant. Furthermore a state knows about a default ++ * successor which is taken when there is no special setup for a ++ * transition.</p> ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public abstract class ScannerState ++{ ++ ++ static final int TRANSITION_METHOD_INVOCATION = 0; ++ ++ static final int TRANSITION_STATIC_METHOD_INVOCATION = 1; ++ ++ static final int TRANSITION_STATIC_FIELD_ACCESS = 2; ++ ++ static final int TRANSITION_CLASS_RESOLUTION = 3; ++ ++ static final int TRANSITION_OBJECT_INSTANTIATION = 4; ++ ++ static final int TRANSITION_PRIMITIVE_INSTANTIATION = 5; ++ ++ static final int TRANSITION_OBJECT_ARRAY_INSTANTIATION = 6; ++ ++ static final int TRANSITION_PRIMITIVE_ARRAY_INSTANTIATION = 7; ++ ++ static final int TRANSITION_ARRAY_SET = 8; ++ ++ static final int TRANSITION_ARRAY_GET = 9; ++ ++ static final int TRANSITION_LIST_SET = 10; ++ ++ static final int TRANSITION_LIST_GET = 11; ++ ++ static final int TRANSITION_NULL_OBJECT = 12; ++ ++ static final int TRANSITION_STRING_REFERENCE = 13; ++ ++ static final int TRANSITION_OBJECT_REFERENCE = 14; ++ ++ static final int TRANSITION_FIRST = 0; ++ ++ static final int TRANSITION_LAST = 14; ++ ++ static final String DEFAULT_STATE_NAME = "default"; ++ ++ String defaultSuccessor = DEFAULT_STATE_NAME; ++ ++ static String[] transitionNames = { "METHOD_INVOCATION", "STATIC_METHOD_INVOCATION", ++ "STATIC_FIELD_ACCESS", "CLASS_RESOLUTION", ++ "OBJECT_INSTANTIATION", ++ "PRIMITIVE_INSTANTIATION", "OBJECT_ARRAY_INSTANTIATION", ++ "PRIMITIVE_ARRAY_INSTANTIATION", ++ "ARRAY_SET", "ARRAY_GET", "LIST_SET", "LIST_GET", ++ "NULL_OBJECT", "STRING_REFERENCE", "OBJECT_REFERENCE" }; ++ ++ /** ++ * Stores the transition setup as the relation ++ * transition->successor's state name. ++ */ ++ HashMap transitions = new HashMap(); ++ ++ int calls; ++ ++ Context context; ++ ++ String name; ++ ++ final void init(String newName) ++ { ++ assert (name == null); ++ ++ name = newName; ++ } ++ ++ final String getName() ++ { ++ return name; ++ } ++ ++ final void enter(Context ctx) ++ { ++ calls++; ++ context = ctx; ++ ++ enterImpl(ctx); ++ } ++ ++ protected void enterImpl(Context ctx) ++ { ++ } ++ ++ final Context context() ++ { ++ return context; ++ } ++ ++ final int getCalls() ++ { ++ return calls; ++ } ++ ++ /** ++ * <p>Stores a successor's state name for a certain transition.</p> ++ * ++ * <p>This method is only used at the configuration time of the state ++ * machine.</p> ++ * ++ * @param transition One of the transition constants. ++ * @param stateName The state name of the successor. ++ */ ++ final void putSuccessor(int transition, String stateName) ++ { ++ assert (transition >= TRANSITION_FIRST && transition <= TRANSITION_LAST) : ++ "Transition identifier '" + transition + "' is unknown."; ++ ++ transitions.put(new Integer(transition), stateName); ++ } ++ ++ /** <p>Retrieves a the state name of a successor for the given transition ++ * constant.</p> ++ * ++ * <p>Returns the default successor's state name if no special setup was ++ * prepared.</p> ++ * ++ * @param transition One of the transition constants. ++ * @return The state name of the successor. ++ */ ++ final String getSuccessor(int transition) ++ { ++ String state = (String) transitions.get(new Integer(transition)); ++ ++ return (state == null) ? defaultSuccessor : state; ++ } ++ ++ /** ++ * Sets the name for the default successor state. ++ * ++ * @param newDefaultSuccessor The default successor's state name. ++ */ ++ final void setDefaultSuccessor(String newDefaultSuccessor) ++ { ++ defaultSuccessor = newDefaultSuccessor; ++ } ++ ++ abstract void methodInvocation(String methodName); ++ ++ abstract void staticMethodInvocation(String className, String methodName); ++ ++ abstract void staticFieldAccess(String className, String fieldName); ++ ++ abstract void classResolution(String className); ++ ++ abstract void objectInstantiation(String className, ObjectId objectId); ++ ++ abstract void primitiveInstantiation(String primitiveName, ++ String valueAsString); ++ ++ abstract void objectArrayInstantiation(String arrayClassName, String lengthAsString, ObjectId objectId); ++ ++ abstract void primitiveArrayInstantiation(String arrayClassName, String lengthAsString, ObjectId objectId); ++ ++ abstract void arraySet(String indexAsString); ++ ++ abstract void arrayGet(String indexAsString); ++ ++ abstract void listGet(); ++ ++ abstract void listSet(); ++ ++ abstract void nullObject(); ++ ++ abstract void stringReference(String string); ++ ++ abstract void objectReference(ObjectId id); ++ ++ /** ++ * <p>A special event that does not provoke a direct transition.</p> ++ * ++ * <p>Instead the transition is done by the <code>ScanEngine</code>: It goes ++ * back to the previous state and just uses this method to inform the state ++ * about this happening.</p> ++ */ ++ abstract void end(); ++ ++ void enter() ++ { ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/StAXWriter.java classpath/gnu/java/beans/encoder/StAXWriter.java +--- classpath.orig/gnu/java/beans/encoder/StAXWriter.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/StAXWriter.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,233 @@ ++/* StAXWriter.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder; ++ ++import java.io.OutputStream; ++ ++import javax.xml.stream.XMLOutputFactory; ++import javax.xml.stream.XMLStreamException; ++import javax.xml.stream.XMLStreamWriter; ++ ++/** A {@link Writer} implementation based on the StAX API. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public class StAXWriter implements Writer ++{ ++ XMLStreamWriter writer; ++ ++ int indent = 0; ++ ++ public StAXWriter(OutputStream os) ++ { ++ try ++ { ++ XMLOutputFactory factory = XMLOutputFactory.newInstance(); ++ writer = factory.createXMLStreamWriter(os); ++ } ++ catch (XMLStreamException se) ++ { ++ throw (InternalError) ++ new InternalError( ++ "Could not instantiate a streaming XML writer.") ++ .initCause(se); ++ } ++ ++ } ++ ++ public void flush() ++ { ++ if (writer != null) ++ { ++ try ++ { ++ writer.flush(); ++ } ++ catch (XMLStreamException xse) ++ { ++ // TODO: find out ++ } ++ } ++ ++ } ++ ++ public void close() ++ { ++ if (writer != null) ++ { ++ try ++ { ++ writer.close(); ++ } ++ catch (XMLStreamException xse) ++ { ++ // TODO: find out ++ } ++ writer = null; ++ } ++ ++ } ++ ++ public void writePreamble() ++ { ++ try ++ { ++ writer.writeStartDocument("UTF-8", "1.0"); ++ } ++ catch (XMLStreamException xmlse) ++ { ++ ++ } ++ } ++ ++ public void writeEnd(boolean wasEmpty) ++ { ++ try ++ { ++ indent -= 2; ++ ++ if (wasEmpty) ++ return; ++ ++ for (int i = 0; i < indent; i++) ++ writer.writeCharacters(" "); ++ ++ writer.writeEndElement(); ++ ++ writer.writeCharacters("\n"); ++ } ++ catch (XMLStreamException xmlse) ++ { ++ ++ } ++ } ++ ++ public void writeEndNoChildren() ++ { ++ try ++ { ++ writer.writeEndElement(); ++ writer.writeCharacters("\n"); ++ } ++ catch (XMLStreamException xmlse) ++ { ++ ++ } ++ } ++ ++ public void write(String tagName, boolean empty) ++ { ++ write(tagName, null, null, null, empty); ++ } ++ ++ public void write(String tagName, String value) ++ { ++ write(tagName, value, null, null, value == null); ++ } ++ ++ public void writeNoChildren(String tagName, String value) ++ { ++ try ++ { ++ for (int i = 0; i < indent; i++) ++ writer.writeCharacters(" "); ++ ++ writer.writeStartElement(tagName); ++ ++ writer.writeCharacters(value); ++ } ++ catch (XMLStreamException xmlse) ++ { ++ ++ } ++ } ++ ++ public void write(String tagName, String attributeName, ++ String attributeValue, boolean empty) ++ { ++ write(tagName, null, new String[] { attributeName }, ++ new String[] { attributeValue }, empty); ++ } ++ ++ public void write(String tagName, String value, String[] attributeNames, ++ String[] attributeValues, boolean empty) ++ { ++ try ++ { ++ for (int i = 0; i < indent; i++) ++ ++ writer.writeCharacters(" "); ++ ++ if (empty) ++ writer.writeEmptyElement(tagName); ++ else ++ writer.writeStartElement(tagName); ++ ++ if (attributeNames != null) ++ for (int i = 0; i < attributeNames.length; i++) ++ writer.writeAttribute(attributeNames[i], attributeValues[i]); ++ ++ writer.writeCharacters("\n"); ++ ++ indent += 2; ++ ++ if (value != null) ++ { ++ for (int i = 0; i < indent; i++) ++ writer.writeCharacters(" "); ++ ++ writer.writeCharacters(value); ++ ++ writer.writeCharacters("\n"); ++ } ++ } ++ catch (XMLStreamException xmlse) ++ { ++ ++ } ++ } ++ ++ public void write(String tagName, String[] attributeNames, ++ String[] attributeValues, boolean empty) ++ { ++ write(tagName, null, attributeNames, attributeValues, empty); ++ } ++ ++} +diff -Nur classpath.orig/gnu/java/beans/encoder/Writer.java classpath/gnu/java/beans/encoder/Writer.java +--- classpath.orig/gnu/java/beans/encoder/Writer.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/gnu/java/beans/encoder/Writer.java 2006-01-08 20:31:37.000000000 +0100 +@@ -0,0 +1,174 @@ ++/* Writer.java -- Writing interface for XML persistence. ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package gnu.java.beans.encoder; ++ ++/** A <code>Writer</code> represents a simplified interface to an XML ++ * writer that is used for the XML persistence mechanism. ++ * ++ * <p>Its sole purpose is to allow multiple backends which may remove ++ * the need to have certain APIs in the classpath. Eg. it is possible ++ * to write a stripped down XML Writer that does not rely on SAX, StAX ++ * or DOM APIs.</p> ++ * ++ * <p>The caller may assume that every action is done immediately. However ++ * it is possible that the underlying implementation uses buffering streams. ++ * To make sure the data is written call the {@link flush} method.</p> ++ * ++ * <p>The <code>Writer</code> implementation should care about the formatting ++ * of the XML stream making it possible to generate three types of formats using ++ * a special method invocation chain.</p> ++ * ++ * <p>Write ++ * <code> ++ * <element/> ++ * </code> ++ * by issuing <code>write("element", true)</code> (or any of the other ++ * write-variants that allows specifying the <code>isEmpty</code> argument) ++ * and <code>writeEnd(true)</code>.</p> ++ * ++ * <p>Write ++ * <code> ++ * <element>body</element> ++ * </code> ++ * by issuing <code>writeNoChildren("element", "body")</code> and <code>writeNoChildrenEnd()</code>.</p> ++ * ++ * <p> ++ * Write ++ * <code> ++ * <element> ++ * <child1/> ++ * <child2/> ++ * ... ++ * <element/> ++ * </code> ++ * by issuing <code>write("element", false)</code> (or any of the other ++ * write-variants that allows specifying the <code>isEmpty</code> argument) ++ * and <code>writeEnd(false)</code>.</p> ++ * ++ * <p>Note: It is important that the values of <code>isEmpty</code> and ++ * <code>wasEmpty</code> match. Otherwise strange things might happen to ++ * the layout.</p> ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * ++ */ ++public interface Writer ++{ ++ // TODO: This interface's design is not the best. Feel free to ++ // improve it as you like. ++ ++ /** Writes the XML preamble. */ ++ void writePreamble(); ++ ++ /** Writes the end of an XML tag. ++ * ++ * <p>If your tag has not generated any body text or child ++ * elements provide <code>true</code> as the argument to generate ++ * more space efficient variant of the tag.>/p> ++ * ++ * @param wasEmpty Whether the tag was empty or not. ++ */ ++ void writeEnd(boolean wasEmpty); ++ ++ /** Writes an XML tag without any attributes. ++ * ++ * @param tagName The name of the tag to write. ++ * @param empty Whether the element has child elements. ++ */ ++ void write(String tagName, boolean empty); ++ ++ /** Writes an XML tag with one attribute name and value. ++ * ++ * @param tagName The name of the tag to write. ++ * @param attributeName The name of attribute. ++ * @param attributeValue The attribute's value. ++ * @param empty Whether the element has child elements. ++ */ ++ void write(String tagName, String attributeName, String attributeValue, boolean empty); ++ ++ /** Writes an XML tag with multiple attributes and a body text. ++ * ++ * @param tagName The name of the tag to write. ++ * @param value The element's body content. ++ * @param attributeNames A set of attribute names. ++ * @param attributeValues A set of attribute values. ++ * @param empty Whether the element has child elements. ++ */ ++ void write(String tagName, String value, String[] attributeNames, ++ String[] attributeValues, boolean empty); ++ ++ /** Writes an XML tag with multiple attributes without a body text. ++ * ++ * @param tagName The name of the tag to write. ++ * @param attributeNames A set of attribute names. ++ * @param attributeValues A set of attribute values. ++ * @param empty Whether the element has child elements. ++ */ ++ void write(String tagName, String[] attributeNames, String[] attributeValues, boolean empty); ++ ++ /** Writes an XML tag with no attributes but with a body text ++ * that may have child elements. ++ * ++ * @param tagName The name of the tag to write. ++ * @param value The element's body content. ++ */ ++ void write(String tagName, String value); ++ ++ /** Writes an XML tag with no attributes but with a body text ++ * that does not have child elements. ++ * ++ * @param tagName The name of the tag to write. ++ * @param value The element's body content. ++ */ ++ void writeNoChildren(String tagName, String value); ++ ++ /** Writes the end of an XML tag that has no child elements. ++ * ++ * <p>Must be used in combination with {@link writeNoChildren} only.</p> ++ */ ++ void writeEndNoChildren(); ++ ++ /** Forces the implementation to write some data. ++ */ ++ void flush(); ++ ++ /** Closes the writer. ++ */ ++ void close(); ++} +diff -Nur classpath.orig/java/beans/DefaultPersistenceDelegate.java classpath/java/beans/DefaultPersistenceDelegate.java +--- classpath.orig/java/beans/DefaultPersistenceDelegate.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/java/beans/DefaultPersistenceDelegate.java 2006-01-24 17:57:57.000000000 +0100 +@@ -0,0 +1,211 @@ ++/* DefaultPersistenceDelegate.java ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package java.beans; ++ ++import java.lang.reflect.InvocationTargetException; ++import java.lang.reflect.Method; ++ ++/** <p><code>DefaultPersistenceDelegate</code> is a {@link PersistenceDelegate} ++ * implementation that can be used to serialize objects which adhere to the ++ * Java Beans naming convention.</p> ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * @since 1.4 ++ */ ++public class DefaultPersistenceDelegate extends PersistenceDelegate ++{ ++ ++ private String[] constructorPropertyNames; ++ ++ /** Using this constructor the object to be serialized will be instantiated ++ * with the default non-argument constructor. ++ */ ++ public DefaultPersistenceDelegate() ++ { ++ } ++ ++ /** This constructor allows to specify which Bean properties appear ++ * in the constructor. ++ * ++ * <p>The implementation reads the mentioned properties from the Bean ++ * instance and applies it in the given order to a corresponding ++ * constructor.</p> ++ * ++ * @param constructorPropertyNames The properties the Bean's constructor ++ * should be given to. ++ */ ++ public DefaultPersistenceDelegate(String[] constructorPropertyNames) ++ { ++ this.constructorPropertyNames = constructorPropertyNames; ++ } ++ ++ protected boolean mutatesTo(Object oldInstance, Object newInstance) ++ { ++ try ++ { ++ ++ return (constructorPropertyNames != null ++ && constructorPropertyNames.length > 0 ++ && oldInstance.getClass() ++ .getDeclaredMethod("equals", ++ new Class[] { Object.class }) != null) ++ ? oldInstance.equals(newInstance) ++ : super.mutatesTo(oldInstance, newInstance); ++ } ++ catch (NoSuchMethodException nsme) ++ { ++ return super.mutatesTo(oldInstance, newInstance); ++ } ++ } ++ ++ protected Expression instantiate(Object oldInstance, Encoder out) ++ { ++ Object[] args = null; ++ ++ try ++ { ++ // If there are property names in the array, then we create ++ // a corresponding argument array and store every ++ // argument in it. To retrieve an argument object we have ++ // dig up the right property in the bean class' BeanInfo ++ // object. ++ // This is so costly in terms of execution time I better ++ // not think twice about it ... ++ if (constructorPropertyNames != null) ++ { ++ args = new Object[constructorPropertyNames.length]; ++ ++ // Look up the properties of oldInstance's class to find matches for ++ // the ++ // names given in the constructor. ++ PropertyDescriptor[] propertyDescs = Introspector.getBeanInfo( ++ oldInstance.getClass()).getPropertyDescriptors(); ++ ++ for (int i = 0; i < constructorPropertyNames.length; i++) ++ { ++ // Scan the property descriptions for a matching name. ++ for (int j = 0; j < propertyDescs.length; j++) ++ { ++ if (propertyDescs[i].getName().equals( ++ constructorPropertyNames[i])) ++ { ++ Method readMethod = propertyDescs[i].getReadMethod(); ++ ++ args[i] = readMethod.invoke(oldInstance, null); ++ } ++ } ++ } ++ } ++ ++ } ++ catch (IllegalAccessException iae) ++ { ++ out.getExceptionListener().exceptionThrown(iae); ++ } ++ catch (IllegalArgumentException iarge) ++ { ++ out.getExceptionListener().exceptionThrown(iarge); ++ } ++ catch (InvocationTargetException ite) ++ { ++ out.getExceptionListener().exceptionThrown(ite); ++ } ++ catch (IntrospectionException ie) ++ { ++ out.getExceptionListener().exceptionThrown(ie); ++ } ++ ++ return new Expression(oldInstance, oldInstance.getClass(), "new", args); ++ } ++ ++ protected void initialize(Class type, Object oldInstance, Object newInstance, ++ Encoder out) ++ { ++ // Calling the supertype's implementation of initialize makes it ++ // possible that descendants of classes like AbstractHashMap ++ // or Hashtable are serialized correctly. This mechanism grounds on ++ // two other facts: ++ // * Each class which has not registered a special purpose ++ // PersistenceDelegate is handled by a DefaultPersistenceDelegate ++ // instance. ++ // * PersistenceDelegate.initialize() is implemented in a way that it ++ // calls the initialize method of the superclass' persistence delegate. ++ super.initialize(type, oldInstance, newInstance, out); ++ ++ // Suppresses the writing of property setting statements when this delegate ++ // is not used for the exact instance type. By doing so the following code ++ // is called only once per object. ++ if (type != oldInstance.getClass()) ++ return; ++ ++ try ++ { ++ PropertyDescriptor[] propertyDescs = Introspector.getBeanInfo( ++ oldInstance.getClass()).getPropertyDescriptors(); ++ ++ for (int i = 0; i < propertyDescs.length; i++) ++ { ++ Method readMethod = propertyDescs[i].getReadMethod(); ++ Method writeMethod = propertyDescs[i].getWriteMethod(); ++ ++ if (readMethod != null && writeMethod != null) ++ { ++ Object oldValue = readMethod.invoke(oldInstance, null); ++ ++ if (oldValue != null) ++ out.writeStatement(new Statement(oldInstance, ++ writeMethod.getName(), ++ new Object[] { oldValue })); ++ } ++ } ++ } ++ catch (IntrospectionException ie) ++ { ++ out.getExceptionListener().exceptionThrown(ie); ++ } ++ catch (IllegalAccessException iae) ++ { ++ out.getExceptionListener().exceptionThrown(iae); ++ } ++ catch (InvocationTargetException ite) ++ { ++ out.getExceptionListener().exceptionThrown(ite); ++ } ++ } ++} +diff -Nur classpath.orig/java/beans/Encoder.java classpath/java/beans/Encoder.java +--- classpath.orig/java/beans/Encoder.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/java/beans/Encoder.java 2006-01-29 20:11:29.000000000 +0100 +@@ -0,0 +1,432 @@ ++/* Encoder.java ++ Copyright (C) 2005, 2006 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package java.beans; ++ ++import gnu.java.beans.DefaultExceptionListener; ++import gnu.java.beans.encoder.ArrayPersistenceDelegate; ++import gnu.java.beans.encoder.ClassPersistenceDelegate; ++import gnu.java.beans.encoder.CollectionPersistenceDelegate; ++import gnu.java.beans.encoder.MapPersistenceDelegate; ++import gnu.java.beans.encoder.PrimitivePersistenceDelegate; ++ ++import java.util.AbstractCollection; ++import java.util.HashMap; ++import java.util.IdentityHashMap; ++ ++/** ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * @since 1.4 ++ */ ++public class Encoder ++{ ++ ++ /** ++ * An internal DefaultPersistenceDelegate instance that is used for every ++ * class that does not a have a special special PersistenceDelegate. ++ */ ++ private static PersistenceDelegate defaultPersistenceDelegate; ++ ++ private static PersistenceDelegate fakePersistenceDelegate; ++ ++ /** ++ * Stores the relation Class->PersistenceDelegate. ++ */ ++ private static HashMap delegates = new HashMap(); ++ ++ /** ++ * Stores the relation oldInstance->newInstance ++ */ ++ private IdentityHashMap candidates = new IdentityHashMap(); ++ ++ private ExceptionListener exceptionListener; ++ ++ /** ++ * A simple number that is used to restrict the access to writeExpression and ++ * writeStatement. The rule is that both methods should only be used when an ++ * object is written to the stream (= writeObject). Therefore accessCounter is ++ * incremented just before the call to writeObject and decremented afterwards. ++ * Then writeStatement and writeExpression allow execution only if ++ * accessCounter is bigger than zero. ++ */ ++ private int accessCounter = 0; ++ ++ public Encoder() ++ { ++ setupDefaultPersistenceDelegates(); ++ ++ setExceptionListener(null); ++ } ++ ++ /** ++ * Sets up a bunch of {@link PersistenceDelegate} instances which are needed ++ * for the basic working of a {@link Encoder}s. ++ */ ++ private static void setupDefaultPersistenceDelegates() ++ { ++ synchronized (delegates) ++ { ++ if (defaultPersistenceDelegate != null) ++ return; ++ ++ delegates.put(Class.class, new ClassPersistenceDelegate()); ++ ++ PersistenceDelegate pd = new PrimitivePersistenceDelegate(); ++ delegates.put(Boolean.class, pd); ++ delegates.put(Byte.class, pd); ++ delegates.put(Short.class, pd); ++ delegates.put(Integer.class, pd); ++ delegates.put(Long.class, pd); ++ delegates.put(Float.class, pd); ++ delegates.put(Double.class, pd); ++ ++ delegates.put(Object[].class, new ArrayPersistenceDelegate()); ++ ++ pd = new CollectionPersistenceDelegate(); ++ delegates.put(AbstractCollection.class, pd); ++ ++ pd = new MapPersistenceDelegate(); ++ delegates.put(java.util.AbstractMap.class, pd); ++ delegates.put(java.util.Hashtable.class, pd); ++ ++ defaultPersistenceDelegate = new DefaultPersistenceDelegate(); ++ delegates.put(Object.class, defaultPersistenceDelegate); ++ ++ // Creates a PersistenceDelegate implementation which is ++ // returned for 'null'. In practice this instance is ++ // not used in any way and is just here to be compatible ++ // with the reference implementation which returns a ++ // similar instance when calling getPersistenceDelegate(null) . ++ fakePersistenceDelegate = new PersistenceDelegate() ++ { ++ protected Expression instantiate(Object o, Encoder e) ++ { ++ return null; ++ } ++ }; ++ ++ } ++ } ++ ++ protected void writeObject(Object o) ++ { ++ // 'null' has no PersistenceDelegate and will not ++ // create an Expression which has to be cloned. ++ // However subclasses should be aware that writeObject ++ // may be called with a 'null' argument and should ++ // write the proper representation of it. ++ if (o == null) ++ return; ++ ++ PersistenceDelegate pd = getPersistenceDelegate(o.getClass()); ++ ++ accessCounter++; ++ pd.writeObject(o, this); ++ accessCounter--; ++ ++ } ++ ++ /** ++ * Sets the {@link ExceptionListener} instance to be used for reporting ++ * recorable exceptions in the instantiation and initialization sequence. If ++ * the argument is <code>null</code> a default instance will be used that ++ * prints the thrown exception to <code>System.err</code>. ++ */ ++ public void setExceptionListener(ExceptionListener listener) ++ { ++ exceptionListener = (listener != null) ++ ? listener : DefaultExceptionListener.INSTANCE; ++ } ++ ++ /** ++ * Returns the currently active {@link ExceptionListener} instance. ++ */ ++ public ExceptionListener getExceptionListener() ++ { ++ return exceptionListener; ++ } ++ ++ public PersistenceDelegate getPersistenceDelegate(Class type) ++ { ++ // This is not specified but the JDK behaves like this. ++ if (type == null) ++ return fakePersistenceDelegate; ++ ++ // Treats all array classes in the same way and assigns ++ // them a shared PersistenceDelegate implementation tailored ++ // for array instantation and initialization. ++ if (type.isArray()) ++ return (PersistenceDelegate) delegates.get(Object[].class); ++ ++ PersistenceDelegate pd = (PersistenceDelegate) delegates.get(type); ++ ++ return (pd != null) ? pd : (PersistenceDelegate) defaultPersistenceDelegate; ++ } ++ ++ /** ++ * Sets the {@link PersistenceDelegate} instance for the given class. ++ * <p> ++ * Note: Throws a <code>NullPointerException</code> if the argument is ++ * <code>null</code>. ++ * </p> ++ * <p> ++ * Note: Silently ignores PersistenceDelegates for Array types and primitive ++ * wrapper classes. ++ * </p> ++ * <p> ++ * Note: Although this method is not declared <code>static</code> changes to ++ * the {@link PersistenceDelegate}s affect <strong>all</strong> ++ * {@link Encoder} instances. <strong>In this implementation</strong> the ++ * access is thread safe. ++ * </p> ++ */ ++ public void setPersistenceDelegate(Class type, PersistenceDelegate delegate) ++ { ++ // If the argument is null this will cause a NullPointerException ++ // which is expected behavior. ++ ++ // This makes custom PDs for array, primitive types and their wrappers ++ // impossible but this is how the JDK behaves. ++ if (type.isArray() || type.isPrimitive() || type == Boolean.class ++ || type == Byte.class || type == Short.class || type == Integer.class ++ || type == Long.class || type == Float.class || type == Double.class) ++ return; ++ ++ synchronized (delegates) ++ { ++ delegates.put(type, delegate); ++ } ++ ++ } ++ ++ public Object remove(Object oldInstance) ++ { ++ return candidates.remove(oldInstance); ++ } ++ ++ /** ++ * Returns the replacement object which has been created by the encoder during ++ * the instantiation sequence or <code>null</code> if the object has not ++ * been processed yet. ++ * <p> ++ * Note: The <code>String</code> class acts as an endpoint for the ++ * inherently recursive algorithm of the {@link Encoder}. Therefore instances ++ * of <code>String</code> will always be returned by this method. In other ++ * words the assertion: <code> ++ * assert (anyEncoder.get(anyString) == anyString) ++ * </code< ++ * will always hold.</p> ++ * ++ * <p>Note: If <code>null</code> is requested, the result will ++ * always be <code>null</code>.</p> ++ */ ++ public Object get(Object oldInstance) ++ { ++ // String instances are handled in a special way. ++ // No one knows why this is not officially specified ++ // because this is a rather important design decision. ++ return (oldInstance == null) ? null : ++ (oldInstance.getClass() == String.class) ? ++ oldInstance : candidates.get(oldInstance); ++ } ++ ++ /** ++ * <p> ++ * Note: If you call this method not from within an object instantiation and ++ * initialization sequence it will be silently ignored. ++ * </p> ++ */ ++ public void writeStatement(Statement stmt) ++ { ++ // Silently ignore out of bounds calls. ++ if (accessCounter <= 0) ++ return; ++ ++ Object target = stmt.getTarget(); ++ ++ Object newTarget = get(target); ++ if (newTarget == null) ++ { ++ writeObject(target); ++ newTarget = get(target); ++ } ++ ++ Object[] args = stmt.getArguments(); ++ Object[] newArgs = new Object[args.length]; ++ ++ for (int i = 0; i < args.length; i++) ++ { ++ newArgs[i] = get(args[i]); ++ if (newArgs[i] == null || isImmutableType(args[i].getClass())) ++ { ++ writeObject(args[i]); ++ newArgs[i] = get(args[i]); ++ } ++ } ++ ++ Statement newStmt = new Statement(newTarget, stmt.getMethodName(), newArgs); ++ ++ try ++ { ++ newStmt.execute(); ++ } ++ catch (Exception e) ++ { ++ exceptionListener.exceptionThrown(e); ++ } ++ ++ } ++ ++ /** ++ * <p> ++ * Note: If you call this method not from within an object instantiation and ++ * initialization sequence it will be silently ignored. ++ * </p> ++ */ ++ public void writeExpression(Expression expr) ++ { ++ // Silently ignore out of bounds calls. ++ if (accessCounter <= 0) ++ return; ++ ++ Object target = expr.getTarget(); ++ Object value = null; ++ Object newValue = null; ++ ++ try ++ { ++ value = expr.getValue(); ++ } ++ catch (Exception e) ++ { ++ exceptionListener.exceptionThrown(e); ++ return; ++ } ++ ++ ++ newValue = get(value); ++ ++ if (newValue == null) ++ { ++ Object newTarget = get(target); ++ if (newTarget == null) ++ { ++ writeObject(target); ++ newTarget = get(target); ++ ++ // May happen if exception was thrown. ++ if (newTarget == null) ++ { ++ return; ++ } ++ } ++ ++ Object[] args = expr.getArguments(); ++ Object[] newArgs = new Object[args.length]; ++ ++ for (int i = 0; i < args.length; i++) ++ { ++ newArgs[i] = get(args[i]); ++ if (newArgs[i] == null || isImmutableType(args[i].getClass())) ++ { ++ writeObject(args[i]); ++ newArgs[i] = get(args[i]); ++ } ++ } ++ ++ Expression newExpr = new Expression(newTarget, expr.getMethodName(), ++ newArgs); ++ ++ // Fakes the result of Class.forName(<primitiveType>) to make it possible ++ // to hand such a type to the encoding process. ++ if (value instanceof Class && ((Class) value).isPrimitive()) ++ newExpr.setValue(value); ++ ++ // Instantiates the new object. ++ try ++ { ++ newValue = newExpr.getValue(); ++ ++ candidates.put(value, newValue); ++ } ++ catch (Exception e) ++ { ++ exceptionListener.exceptionThrown(e); ++ ++ return; ++ } ++ ++ writeObject(value); ++ ++ } ++ else if(value.getClass() == String.class || value.getClass() == Class.class) ++ { ++ writeObject(value); ++ } ++ ++ } ++ ++ /** Returns whether the given class is an immutable ++ * type which has to be handled differently when serializing it. ++ * ++ * <p>Immutable objects always have to be instantiated instead of ++ * modifying an existing instance.</p> ++ * ++ * @param type The class to test. ++ * @return Whether the first argument is an immutable type. ++ */ ++ boolean isImmutableType(Class type) ++ { ++ return type == String.class || type == Class.class ++ || type == Integer.class || type == Boolean.class ++ || type == Byte.class || type == Short.class ++ || type == Long.class || type == Float.class ++ || type == Double.class; ++ } ++ ++ /** Sets the stream candidate for a given object. ++ * ++ * @param oldObject The object given to the encoder. ++ * @param newObject The object the encoder generated. ++ */ ++ void putCandidate(Object oldObject, Object newObject) ++ { ++ candidates.put(oldObject, newObject); ++ } ++ ++} +diff -Nur classpath.orig/java/beans/Expression.java classpath/java/beans/Expression.java +--- classpath.orig/java/beans/Expression.java 2005-09-23 23:31:04.000000000 +0200 ++++ classpath/java/beans/Expression.java 2006-03-05 23:58:22.000000000 +0100 +@@ -35,16 +35,19 @@ + obligated to do so. If you do not wish to do so, delete this + exception statement from your version. */ + +- + package java.beans; + + /** +- * class Expression +- * +- * An Expression captures the execution of an object method that +- * returns a value. It stores an object, the method to call, and the +- * arguments to pass to the method. +- * ++ * <p>An Expression captures the execution of an object method ++ * that returns a value.</p> ++ * ++ * <p>It stores an object, the method to call, and the arguments to pass to ++ * the method.</p> ++ * ++ * <p>While this class can generally be used to describe method calls it is ++ * part of the XML serialization API.</p> ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) + * @since 1.4 + */ + public class Expression extends Statement +@@ -53,38 +56,40 @@ + // yet; + private static final Object UNSET = new Object(); + +- // The value to return. This is equal to unset until getValue is called. ++ // The value to return. This is equal to unset until getValue is called. + private Object value; +- + + /** +- * Constructor +- * +- * Constructs an Expression representing the invocation of +- * object.methodName(arg[0], arg[1], ...); However, it will never +- * be executed. Instead, value will always be returned. +- * +- * @param value The value to return. +- * @param target The object to invoke the method on. +- * @param methodName The object method to invoke. +- * @param arguments An array of arguments to pass to the method. ++ * Constructor Constructs an Expression representing the invocation of ++ * object.methodName(arg[0], arg[1], ...); However, it will never be executed. ++ * Instead, value will always be returned. ++ * ++ * @param value ++ * The value to return. ++ * @param target ++ * The object to invoke the method on. ++ * @param methodName ++ * The object method to invoke. ++ * @param arguments ++ * An array of arguments to pass to the method. + */ + public Expression(Object value, Object target, String methodName, +- Object[] arguments) ++ Object[] arguments) + { + super(target, methodName, arguments); + this.value = value; + } + + /** +- * Constructor +- * +- * Constructs an Expression representing the invocation of ++ * Constructor Constructs an Expression representing the invocation of + * object.methodName(arg[0], arg[1], ...); +- * +- * @param target The object to invoke the method on. +- * @param methodName The object method to invoke. +- * @param arguments An array of arguments to pass to the method. ++ * ++ * @param target ++ * The object to invoke the method on. ++ * @param methodName ++ * The object method to invoke. ++ * @param arguments ++ * An array of arguments to pass to the method. + */ + public Expression(Object target, String methodName, Object[] arguments) + { +@@ -93,15 +98,14 @@ + } + + /** +- * Return the result of executing the method. +- * +- * If the cached value has not yet been set, the method is +- * executed in the same way as Statement.execute(), except that +- * the value is cached, and then returned. If the value has been ++ * Return the result of executing the method. If the cached value has not yet ++ * been set, the method is executed in the same way as Statement.execute(), ++ * except that the value is cached, and then returned. If the value has been + * set, it is returned without executing the method again. +- * ++ * + * @return the result of executing the method. +- * @exception Exception if an error occurs ++ * @exception Exception ++ * if an error occurs + */ + public Object getValue() throws Exception + { +@@ -112,14 +116,15 @@ + + /** + * Set the cached value to be returned by getValue() +- * +- * @param value the value to cache and return. ++ * ++ * @param value ++ * the value to cache and return. + */ + public void setValue(Object value) + { + this.value = value; + } +- ++ + /** + * Return a string representation of this expression. + */ +@@ -127,7 +132,7 @@ + { + String result = super.toString(); + if (value != UNSET) +- return value.getClass().getName() + " " + result; ++ return value.getClass().getName() + "=" + result; + return result; + } + } +diff -Nur classpath.orig/java/beans/PersistenceDelegate.java classpath/java/beans/PersistenceDelegate.java +--- classpath.orig/java/beans/PersistenceDelegate.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/java/beans/PersistenceDelegate.java 2006-01-24 17:57:57.000000000 +0100 +@@ -0,0 +1,90 @@ ++/* java.beans.PersistenceDelegate ++ Copyright (C) 2005 Free Software Foundation, Inc. ++ ++This file is part of GNU Classpath. ++ ++GNU Classpath is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU Classpath 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 for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU Classpath; see the file COPYING. If not, write to the ++Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++02110-1301 USA. ++ ++Linking this library statically or dynamically with other modules is ++making a combined work based on this library. Thus, the terms and ++conditions of the GNU General Public License cover the whole ++combination. ++ ++As a special exception, the copyright holders of this library give you ++permission to link this library with independent modules to produce an ++executable, regardless of the license terms of these independent ++modules, and to copy and distribute the resulting executable under ++terms of your choice, provided that you also meet, for each linked ++independent module, the terms and conditions of the license of that ++module. An independent module is a module which is not derived from ++or based on this library. If you modify this library, you may extend ++this exception to your version of the library, but you are not ++obligated to do so. If you do not wish to do so, delete this ++exception statement from your version. */ ++ ++package java.beans; ++ ++/** <p>A <code>PersistenceDelegate</code> describes how a another object ++ * has to constructed and transformed in order to create a complete ++ * replicate.</p> ++ * ++ * <p>For custom classes you will need to implement ++ * <code>PersistenceDelegate</code> in a way that is suitable for them. ++ * To make use of the implementation you have to register it with an ++ * {@link Encoder} using the {Encoder#setPersistenceDelegate} method.</p> ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * @since 1.4 ++ */ ++public abstract class PersistenceDelegate ++{ ++ ++ protected void initialize(Class type, Object oldInstance, Object newInstance, ++ Encoder out) ++ { ++ if (type != Object.class) ++ { ++ type = type.getSuperclass(); ++ ++ PersistenceDelegate pd = out.getPersistenceDelegate(type); ++ ++ pd.initialize(type, oldInstance, newInstance, out); ++ } ++ } ++ ++ public void writeObject(Object oldInstance, Encoder out) ++ { ++ Object streamCandidate = out.get(oldInstance); ++ ++ if (mutatesTo(oldInstance, streamCandidate)) ++ { ++ initialize(oldInstance.getClass(), oldInstance, streamCandidate, out); ++ } ++ else ++ { ++ out.remove(oldInstance); ++ out.writeExpression(instantiate(oldInstance, out)); ++ } ++ } ++ ++ protected boolean mutatesTo(Object oldInstance, Object newInstance) ++ { ++ return (newInstance != null) ++ && oldInstance.getClass() == newInstance.getClass(); ++ } ++ ++ protected abstract Expression instantiate(Object oldInstance, Encoder out); ++} +diff -Nur classpath.orig/java/beans/Statement.java classpath/java/beans/Statement.java +--- classpath.orig/java/beans/Statement.java 2005-09-23 23:31:04.000000000 +0200 ++++ classpath/java/beans/Statement.java 2006-03-05 23:58:32.000000000 +0100 +@@ -1,4 +1,4 @@ +-/* java.beans.Statement ++/* Statement.java + Copyright (C) 2004, 2005 Free Software Foundation, Inc. + + This file is part of GNU Classpath. +@@ -42,32 +42,26 @@ + import java.lang.reflect.Constructor; + import java.lang.reflect.Method; + +-import java.util.HashMap; +-import java.util.WeakHashMap; +- + /** +- * class Statement +- * +- * A Statement captures the execution of an object method. It stores ++ * <p>A Statement captures the execution of an object method. It stores + * the object, the method to call, and the arguments to the method and + * provides the ability to execute the method on the object, using the +- * provided arguments. ++ * provided arguments.</p> + * ++ * @author Jerry Quinn (jlquinn@optonline.net) ++ * @author Robert Schuster (robertschuster@fsfe.org) + * @since 1.4 + */ + public class Statement + { +- /** Nested map for the relation between a class, its instances and their +- * names. +- */ +- private static HashMap classMaps = new HashMap(); +- + private Object target; + private String methodName; + private Object[] arguments; + +- // One or the other of these will get a value after execute is +- // called once, but not both. ++ /** ++ * One or the other of these will get a value after execute is ++ * called once, but not both. ++ */ + private transient Method method; + private transient Constructor ctor; + +@@ -87,76 +81,44 @@ + this.target = target; + this.methodName = methodName; + this.arguments = (arguments != null) ? arguments : new Object[0]; +- storeTargetName(target); +- } +- +- /** Creates a name for the target instance or does nothing if the object's +- * name is already known. This makes sure that there *is* a name for every +- * target instance. +- */ +- private static synchronized void storeTargetName(Object obj) +- { +- Class klass = obj.getClass(); +- WeakHashMap names = (WeakHashMap) classMaps.get(klass); +- +- if ( names == null ) +- { +- names = new WeakHashMap(); +- +- names.put(obj, +- ( klass == String.class ? ("\"" + obj + "\"") : +- (klass.getName() + names.size()) )); +- +- classMaps.put(klass, names); +- +- return; +- } +- +- String targetName = (String) names.get(obj); +- if ( targetName == null ) +- { +- names.put(obj, +- ( klass == String.class ? ("\"" + obj + "\"") : +- (klass.getName() + names.size()) )); +- } +- +- // Nothing to do. The given object was already stored. + } + + /** + * Execute the statement. + * +- * Finds the specified method in the target object and calls it with +- * the arguments given in the constructor. ++ * <p>Finds the specified method in the target object and calls it with ++ * the arguments given in the constructor.</p> + * +- * The most specific method according to the JLS(15.11) is used when +- * there are multiple methods with the same name. ++ * <p>The most specific method according to the JLS(15.11) is used when ++ * there are multiple methods with the same name.</p> + * +- * Execute performs some special handling for methods and ++ * <p>Execute performs some special handling for methods and + * parameters: ++ * <ul> ++ * <li>Static methods can be executed by providing the class as a ++ * target.</li> + * +- * Static methods can be executed by providing the class as a +- * target. +- * +- * The method name new is reserved to call the constructor ++ * <li>The method name new is reserved to call the constructor + * new() will construct an object and return it. Not useful unless +- * an expression :-) ++ * an expression :-)</li> + * +- * If the target is an array, get and set as defined in ++ * <li>If the target is an array, get and set as defined in + * java.util.List are recognized as valid methods and mapped to the +- * methods of the same name in java.lang.reflect.Array. ++ * methods of the same name in java.lang.reflect.Array.</li> + * +- * The native datatype wrappers Boolean, Byte, Character, Double, ++ * <li>The native datatype wrappers Boolean, Byte, Character, Double, + * Float, Integer, Long, and Short will map to methods that have + * native datatypes as parameters, in the same way as Method.invoke. + * However, these wrappers also select methods that actually take +- * the wrapper type as an argument. ++ * the wrapper type as an argument.</li> ++ * </ul> ++ * </p> + * +- * The Sun spec doesn't deal with overloading between int and ++ * <p>The Sun spec doesn't deal with overloading between int and + * Integer carefully. If there are two methods, one that takes an + * Integer and the other taking an int, the method chosen is not + * specified, and can depend on the order in which the methods are +- * declared in the source file. ++ * declared in the source file.</p> + * + * @throws Exception if an exception occurs while locating or + * invoking the method. +@@ -178,8 +140,10 @@ + Integer.TYPE, Long.TYPE, Short.TYPE + }; + +- // Given a wrapper class, return the native class for it. For +- // example, if c is Integer, Integer.TYPE is returned. ++ /** Given a wrapper class, return the native class for it. ++ * <p>For example, if <code>c</code> is <code>Integer</code>, ++ * <code>Integer.TYPE</code> is returned.</p> ++ */ + private Class unwrap(Class c) + { + for (int i = 0; i < wrappers.length; i++) +@@ -188,13 +152,22 @@ + return null; + } + +- // Return true if all args can be assigned to params, false +- // otherwise. Arrays are guaranteed to be the same length. ++ /** Returns <code>true</code> if all args can be assigned to ++ * <code>params</code>, <code>false</code> otherwise. ++ * ++ * <p>Arrays are guaranteed to be the same length.</p> ++ */ + private boolean compatible(Class[] params, Class[] args) + { + for (int i = 0; i < params.length; i++) + { +- // Treat Integer like int if appropriate ++ // Argument types are derived from argument values. If one of them was ++ // null then we cannot deduce its type. However null can be assigned to ++ // any type. ++ if (args[i] == null) ++ continue; ++ ++ // Treat Integer like int if appropriate + Class nativeType = unwrap(args[i]); + if (nativeType != null && params[i].isPrimitive() + && params[i].isAssignableFrom(nativeType)) +@@ -208,14 +181,15 @@ + } + + /** +- * Return true if the method arguments in first are more specific +- * than the method arguments in second, i.e. all args in first can +- * be assigned to those in second. ++ * Returns <code>true</code> if the method arguments in first are ++ * more specific than the method arguments in second, i.e. all ++ * arguments in <code>first</code> can be assigned to those in ++ * <code>second</code>. + * +- * A method is more specific if all parameters can also be fed to ++ * <p>A method is more specific if all parameters can also be fed to + * the less specific method, because, e.g. the less specific method + * accepts a base class of the equivalent argument for the more +- * specific one. ++ * specific one.</p> + * + * @param first a <code>Class[]</code> value + * @param second a <code>Class[]</code> value +@@ -238,8 +212,11 @@ + ? (Class) target : target.getClass(); + Object args[] = (arguments == null) ? new Object[0] : arguments; + Class argTypes[] = new Class[args.length]; ++ ++ // Retrieve type or use null if the argument is null. The null argument ++ // type is later used in compatible(). + for (int i = 0; i < args.length; i++) +- argTypes[i] = args[i].getClass(); ++ argTypes[i] = (args[i] != null) ? args[i].getClass() : null; + + if (target.getClass().isArray()) + { +@@ -333,7 +310,29 @@ + } + if (method == null) + throw new NoSuchMethodException("No matching method for statement " + toString()); ++ ++ // If we were calling Class.forName(String) we intercept and call the ++ // forName-variant that allows a ClassLoader argument. We take the ++ // system classloader (aka application classloader) here to make sure ++ // that application defined classes can be resolved. If we would not ++ // do that the Class.forName implementation would use the class loader ++ // of java.beans.Statement which is <null> and cannot resolve application ++ // defined classes. ++ if (method.equals( ++ Class.class.getMethod("forName", new Class[] { String.class }))) ++ return Class.forName( ++ (String) args[0], true, ClassLoader.getSystemClassLoader()); ++ ++ try { + return method.invoke(target, args); ++ } catch(IllegalArgumentException iae){ ++ System.err.println("method: " + method); ++ ++ for(int i=0;i<args.length;i++){ ++ System.err.println("args[" + i + "]: " + args[i]); ++ } ++ throw iae; ++ } + } + + +@@ -352,9 +351,13 @@ + { + StringBuffer result = new StringBuffer(); + +- Class klass = target.getClass(); ++ String targetName = target.getClass().getName(); ++ if ( targetName.startsWith("java")) ++ { ++ targetName = targetName.substring(targetName.lastIndexOf('.') + 1); ++ } + +- result.append( ((WeakHashMap) classMaps.get(klass)).get(target)); ++ result.append(targetName); + result.append("."); + result.append(methodName); + result.append("("); +@@ -363,11 +366,15 @@ + for (int i = 0; i < arguments.length; i++) + { + result.append(sep); +- result.append(arguments[i].getClass().getName()); ++ result.append( ++ ( arguments[i] == null ) ? "null" : ++ ( arguments[i] instanceof String ) ? "\"" + arguments[i] + "\"" : ++ arguments[i].getClass().getName()); + sep = ", "; + } + result.append(")"); + + return result.toString(); + } ++ + } +diff -Nur classpath.orig/java/beans/XMLEncoder.java classpath/java/beans/XMLEncoder.java +--- classpath.orig/java/beans/XMLEncoder.java 1970-01-01 01:00:00.000000000 +0100 ++++ classpath/java/beans/XMLEncoder.java 2006-01-24 17:57:57.000000000 +0100 +@@ -0,0 +1,267 @@ ++/* XMLEncoder.java ++ Copyright (C) 2004, 2005 Free Software Foundation, Inc. ++ ++ This file is part of GNU Classpath. ++ ++ GNU Classpath is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 2, or (at your option) ++ any later version. ++ ++ GNU Classpath 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 for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with GNU Classpath; see the file COPYING. If not, write to the ++ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ++ 02110-1301 USA. ++ ++ Linking this library statically or dynamically with other modules is ++ making a combined work based on this library. Thus, the terms and ++ conditions of the GNU General Public License cover the whole ++ combination. ++ ++ As a special exception, the copyright holders of this library give you ++ permission to link this library with independent modules to produce an ++ executable, regardless of the license terms of these independent ++ modules, and to copy and distribute the resulting executable under ++ terms of your choice, provided that you also meet, for each linked ++ independent module, the terms and conditions of the license of that ++ module. An independent module is a module which is not derived from ++ or based on this library. If you modify this library, you may extend ++ this exception to your version of the library, but you are not ++ obligated to do so. If you do not wish to do so, delete this ++ exception statement from your version. */ ++ ++ ++package java.beans; ++ ++import gnu.java.beans.encoder.ScanEngine; ++ ++import java.io.OutputStream; ++ ++/** ++ * This class uses the {@link PersistenceDelegate} and {@link Encoder} ++ * infrastructure to generate an XML representation of the objects it ++ * serializes. ++ * ++ * @author Robert Schuster (robertschuster@fsfe.org) ++ * @since 1.4 ++ */ ++public class XMLEncoder extends Encoder ++{ ++ Object owner; ++ ++ Exception exception; ++ ++ ScanEngine scanEngine; ++ ++ private int accessCounter = 0; ++ ++ public XMLEncoder(OutputStream os) ++ { ++ scanEngine = new ScanEngine(os); ++ } ++ ++ public void close() ++ { ++ if (scanEngine != null) ++ { ++ scanEngine.close(); ++ scanEngine = null; ++ } ++ } ++ ++ public void flush() ++ { ++ scanEngine.flush(); ++ } ++ ++ public void writeExpression(Expression expr) ++ { ++ // Implementation note: Why is this method overwritten and nearly exactly ++ // reimplemented as in Encoder? ++ // The Encoder class can (and should be) subclassed by users outside of the ++ // java.beans package. While I have doubts that this is possible from an ++ // API design point of view I tried to replicate the Encoder's behavior ++ // in the JDK as exactly as possible. This strictness however made it ++ // extremely complicated to implement the XMLEncoder's backend. Therefore ++ // I decided to copy the Encoder's implementation and make all changes ++ // I needed for a succesfull operation of XMLEncoder. ++ // ++ // The same is true for the writeStatement method. ++ ++ // Silently ignore out of bounds calls. ++ if (accessCounter <= 0) ++ return; ++ ++ scanEngine.writeExpression(expr); ++ ++ ++ Object target = expr.getTarget(); ++ Object value = null; ++ Object newValue = null; ++ ++ try ++ { ++ value = expr.getValue(); ++ } ++ catch (Exception e) ++ { ++ getExceptionListener().exceptionThrown(e); ++ return; ++ } ++ ++ ++ newValue = get(value); ++ ++ if (newValue == null) ++ { ++ Object newTarget = get(target); ++ if (newTarget == null) ++ { ++ writeObject(target); ++ newTarget = get(target); ++ ++ // May happen if exception was thrown. ++ if (newTarget == null) ++ { ++ return; ++ } ++ } ++ ++ Object[] args = expr.getArguments(); ++ Object[] newArgs = new Object[args.length]; ++ ++ for (int i = 0; i < args.length; i++) ++ { ++ newArgs[i] = get(args[i]); ++ if (newArgs[i] == null || isImmutableType(args[i].getClass())) ++ { ++ writeObject(args[i]); ++ newArgs[i] = get(args[i]); ++ } ++ } ++ ++ Expression newExpr = new Expression(newTarget, expr.getMethodName(), ++ newArgs); ++ ++ // Fakes the result of Class.forName(<primitiveType>) to make it possible ++ // to hand such a type to the encoding process. ++ if (value instanceof Class && ((Class) value).isPrimitive()) ++ newExpr.setValue(value); ++ ++ // Instantiates the new object. ++ try ++ { ++ newValue = newExpr.getValue(); ++ ++ putCandidate(value, newValue); ++ } ++ catch (Exception e) ++ { ++ getExceptionListener().exceptionThrown(e); ++ ++ // In Statement.writeExpression we had no possibility to flags ++ // an erroneous state to the ScanEngine without behaving different ++ // to the JDK. ++ scanEngine.revoke(); ++ ++ return; ++ } ++ ++ writeObject(value); ++ ++ } ++ else if(value.getClass() == String.class || value.getClass() == Class.class) ++ { ++ writeObject(value); ++ } ++ ++ scanEngine.end(); ++ } ++ ++ public void writeStatement(Statement stmt) ++ { ++ // In case of questions have a at the implementation note in ++ // writeExpression. ++ ++ scanEngine.writeStatement(stmt); ++ ++ // Silently ignore out of bounds calls. ++ if (accessCounter <= 0) ++ return; ++ ++ Object target = stmt.getTarget(); ++ ++ Object newTarget = get(target); ++ if (newTarget == null) ++ { ++ writeObject(target); ++ newTarget = get(target); ++ } ++ ++ Object[] args = stmt.getArguments(); ++ Object[] newArgs = new Object[args.length]; ++ ++ for (int i = 0; i < args.length; i++) ++ { ++ // Here is the difference to the original writeStatement ++ // method in Encoder. In case that the object is known or ++ // not an immutable we put it directly into the ScanEngine ++ // which will then generate an object reference for it. ++ newArgs[i] = get(args[i]); ++ if (newArgs[i] == null || isImmutableType(args[i].getClass())) ++ { ++ writeObject(args[i]); ++ newArgs[i] = get(args[i]); ++ } ++ else ++ scanEngine.writeObject(args[i]); ++ } ++ ++ Statement newStmt = new Statement(newTarget, stmt.getMethodName(), newArgs); ++ ++ try ++ { ++ newStmt.execute(); ++ } ++ catch (Exception e) ++ { ++ getExceptionListener().exceptionThrown(e); ++ ++ // In Statement.writeStatement we had no possibility to flags ++ // an erroneous state to the ScanEngine without behaving different ++ // to the JDK. ++ scanEngine.revoke(); ++ return; ++ } ++ ++ scanEngine.end(); ++ } ++ ++ public void writeObject(Object o) ++ { ++ accessCounter++; ++ ++ scanEngine.writeObject(o); ++ ++ if (get(o) == null); ++ super.writeObject(o); ++ ++ accessCounter--; ++ } ++ ++ public void setOwner(Object o) ++ { ++ owner = o; ++ } ++ ++ public Object getOwner() ++ { ++ return owner; ++ } ++ ++} diff --git a/dev-java/gcj/files/digest-gcj-4.1.0 b/dev-java/gcj/files/digest-gcj-4.1.0 new file mode 100644 index 00000000..eb3d355a --- /dev/null +++ b/dev-java/gcj/files/digest-gcj-4.1.0 @@ -0,0 +1,3 @@ +MD5 88785071f29ed0e0b6b61057a1079442 gcc-4.1.0.tar.bz2 38639061 +RMD160 a0640c52a53b69b0edcf66d9dc9a95d2112e8b41 gcc-4.1.0.tar.bz2 38639061 +SHA256 1159457a0e4c054b709547ae21ff624aebab2033e0d9e5bf46c9cf88b1970606 gcc-4.1.0.tar.bz2 38639061 diff --git a/dev-java/gcj/files/digest-gcj-4.1.0_pre20060219 b/dev-java/gcj/files/digest-gcj-4.1.0_pre20060219 new file mode 100644 index 00000000..2572483e --- /dev/null +++ b/dev-java/gcj/files/digest-gcj-4.1.0_pre20060219 @@ -0,0 +1,3 @@ +MD5 afe7a62dd812d7dbb9542472fc07cbe7 gcc-4.1.0-20060219.tar.bz2 38618939 +RMD160 488805c643b180cb3734cbee084cf0654666a387 gcc-4.1.0-20060219.tar.bz2 38618939 +SHA256 f8462dae0e7adf813766d9931767586f95a47e28facc4e2a82ad5f1147f2856e gcc-4.1.0-20060219.tar.bz2 38618939 diff --git a/dev-java/gcj/files/fix-java.beans.Encoder.patch b/dev-java/gcj/files/fix-java.beans.Encoder.patch new file mode 100644 index 00000000..bd5247ec --- /dev/null +++ b/dev-java/gcj/files/fix-java.beans.Encoder.patch @@ -0,0 +1,33 @@ +--- classpath/classpath/java/beans/Encoder.java 2006/01/24 16:57:57 1.2 ++++ classpath/classpath/java/beans/Encoder.java 2006/01/29 19:11:29 1.3 +@@ -1,5 +1,5 @@ + /* Encoder.java +- Copyright (C) 2005, 2006 Free Software Foundation, Inc. ++ Copyright (C) 2005 Free Software Foundation, Inc. + + This file is part of GNU Classpath. + +@@ -38,7 +38,6 @@ + + package java.beans; + +-import gnu.java.beans.DefaultExceptionListener; + import gnu.java.beans.encoder.ArrayPersistenceDelegate; + import gnu.java.beans.encoder.ClassPersistenceDelegate; + import gnu.java.beans.encoder.CollectionPersistenceDelegate; +@@ -169,8 +168,13 @@ + */ + public void setExceptionListener(ExceptionListener listener) + { +- exceptionListener = (listener != null) +- ? listener : DefaultExceptionListener.INSTANCE; ++ exceptionListener = (listener != null) ? listener : new ExceptionListener() ++ { ++ public void exceptionThrown(Exception e) ++ { ++ System.err.println("exception thrown: " + e); ++ } ++ }; + } + + /** diff --git a/dev-java/gcj/files/fix_libtool_files.sh b/dev-java/gcj/files/fix_libtool_files.sh new file mode 100644 index 00000000..c144be22 --- /dev/null +++ b/dev-java/gcj/files/fix_libtool_files.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# Copyright 1999-2005 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/sys-devel/gcc/files/fix_libtool_files.sh,v 1.12 2005/01/30 18:45:22 vapier Exp $ + +usage() { +cat << "USAGE_END" +Usage: fix_libtool_files.sh <old-gcc-version> [--oldarch <old-CHOST>] + + Where <old-gcc-version> is the version number of the + previous gcc version. For example, if you updated to + gcc-3.2.1, and you had gcc-3.2 installed, run: + + # fix_libtool_files.sh 3.2 + + If you updated to gcc-3.2.3, and the old CHOST was i586-pc-linux-gnu + but you now have CHOST as i686-pc-linux-gnu, run: + + # fix_libtool_files.sh 3.2 --oldarch i586-pc-linux-gnu + + Note that if only the CHOST and not the version changed, you can run + it with the current version and the '--oldarch <old-CHOST>' arguments, + and it will do the expected: + + # fix_libtool_files.sh `gcc -dumpversion` --oldarch i586-pc-linux-gnu + +USAGE_END + exit 1 +} + +if [[ $2 != "--oldarch" && $# -ne 1 ]] || \ + [[ $2 == "--oldarch" && $# -ne 3 ]] +then + usage +fi + +ARGV1=$1 +ARGV2=$2 +ARGV3=$3 + +source /etc/profile +source /sbin/functions.sh + +if [[ ${EUID} -ne 0 ]] ; then + eerror "${0##*/}: Must be root." + exit 1 +fi + +# make sure the files come out sane +umask 0022 + +if [[ ${ARGV2} == "--oldarch" ]] && [[ -n ${ARGV3} ]] ; then + OLDCHOST=${ARGV3} +else + OLDCHOST= +fi + +AWKDIR="/lib/rcscripts/awk" + +if [[ ! -r ${AWKDIR}/fixlafiles.awk ]] ; then + eerror "${0##*/}: ${AWKDIR}/fixlafiles.awk does not exist!" + exit 1 +fi + +OLDVER=${ARGV1} + +export OLDVER OLDCHOST + +einfo "Scanning libtool files for hardcoded gcc library paths..." +/bin/gawk -f "${AWKDIR}/fixlafiles.awk" + +# vim:ts=4 diff --git a/dev-java/gcj/files/gcc-configure-LANG.patch b/dev-java/gcj/files/gcc-configure-LANG.patch new file mode 100644 index 00000000..3ef76ef9 --- /dev/null +++ b/dev-java/gcj/files/gcc-configure-LANG.patch @@ -0,0 +1,41 @@ +The LANG vars aren't reset early enough so when sed tries to use [a-zA-Z] in +option parsing, it may break. + +http://bugs.gentoo.org/103483 + +--- configure ++++ configure +@@ -54,6 +54,16 @@ + infodir='${prefix}/info' + mandir='${prefix}/man' + ++# NLS nuisances. ++# Only set these to C if already set. These must not be set unconditionally ++# because not all systems understand e.g. LANG=C (notably SCO). ++# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! ++# Non-C LC_CTYPE values break the ctype check. ++if test "${LANG+set}" = set; then LANG=C; export LANG; fi ++if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi ++if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi ++if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi ++ + # Initialize some other variables. + subdirs= + MFLAGS= MAKEFLAGS= +@@ -452,16 +463,6 @@ + esac + done + +-# NLS nuisances. +-# Only set these to C if already set. These must not be set unconditionally +-# because not all systems understand e.g. LANG=C (notably SCO). +-# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +-# Non-C LC_CTYPE values break the ctype check. +-if test "${LANG+set}" = set; then LANG=C; export LANG; fi +-if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +-if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +-if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi +- + # confdefs.h avoids OS command line length limits that DEFS can exceed. + rm -rf conftest* confdefs.h + # AIX cpp loses on an empty file, so make sure it contains at least a newline. diff --git a/dev-java/gcj/files/gcc-spec-env.patch b/dev-java/gcj/files/gcc-spec-env.patch new file mode 100644 index 00000000..c2103206 --- /dev/null +++ b/dev-java/gcj/files/gcc-spec-env.patch @@ -0,0 +1,39 @@ + Add support for external spec file via the GCC_SPECS env var. This + allows us to easily control pie/ssp defaults with gcc-config profiles. + + Original patch by Rob Holland. Extended to support multiple + entries separated by ':' by Kevin F. Quinn + +--- gcc-4/gcc/gcc.c ++++ gcc-4/gcc/gcc.c +@@ -6482,6 +6482,30 @@ + + /* Process any user specified specs in the order given on the command + line. */ ++ /* Add specs listed in GCC_SPECS. Note; in the process of separating ++ * each spec listed, the string is overwritten at token boundaries ++ * (':') with '\0', an effect of strtok_r(). ++ */ ++ GET_ENVIRONMENT (specs_file, "GCC_SPECS"); ++ if (specs_file && (strlen(specs_file) > 0)) ++ { ++ char *spec, *saveptr; ++ for (spec=strtok_r(specs_file,":",&saveptr); ++ spec!=NULL; ++ spec=strtok_r(NULL,":",&saveptr)) ++ { ++ struct user_specs *user = (struct user_specs *) ++ xmalloc (sizeof (struct user_specs)); ++ ++ user->next = (struct user_specs *) 0; ++ user->filename = spec; ++ if (user_specs_tail) ++ user_specs_tail->next = user; ++ else ++ user_specs_head = user; ++ user_specs_tail = user; ++ } ++ } + for (uptr = user_specs_head; uptr; uptr = uptr->next) + { + char *filename = find_a_file (&startfile_prefixes, uptr->filename, diff --git a/dev-java/gcj/files/gcj-4.1 b/dev-java/gcj/files/gcj-4.1 new file mode 100644 index 00000000..2611a928 --- /dev/null +++ b/dev-java/gcj/files/gcj-4.1 @@ -0,0 +1,17 @@ +# Copyright 1999-2006 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: $ + +VERSION="GCJ @PV@" +JAVA_HOME=/opt/@P@ +JDK_HOME=/opt/@P@ +JAVAC=${JAVA_HOME}/bin/javac +PATH="${JAVA_HOME}/bin" +ROOTPATH="${JAVA_HOME}/bin" +LDPATH="${JAVA_HOME}/lib" +INFOPATH="${JAVA_HOME}/info" +MANPATH="${JAVA_HOME}/man" +PROVIDES_TYPE="JDK JRE" +PROVIDES_VERSION="1.5" +BOOTCLASSPATH="${JAVA_HOME}/share/java/libgcj-@PV@.jar" +ENV_VARS="JAVA_HOME JDK_HOME JAVAC PATH ROOTPATH LDPATH INFOPATH MANPATH" diff --git a/dev-java/gcj/files/java.in b/dev-java/gcj/files/java.in new file mode 100644 index 00000000..e9d3fa7e --- /dev/null +++ b/dev-java/gcj/files/java.in @@ -0,0 +1,8 @@ +#!/bin/bash +# wrapper script for gij as java + +JAVA_PKG_CLASSMAP=${JAVA_PKG_CLASSMAP:="/usr/share/java/classmap.gcjdb"} + +@HOME@/bin/gij \ + -Dgnu.gcj.precompiled.db.path=${JAVA_PKG_CLASSMAP} \ + "${@}" diff --git a/dev-java/gcj/files/javac.in b/dev-java/gcj/files/javac.in new file mode 100644 index 00000000..8628e7ef --- /dev/null +++ b/dev-java/gcj/files/javac.in @@ -0,0 +1,9 @@ +#!/bin/sh +# wrapper script for ecj-native as javac + +ecj=/usr/bin/ecj-native +if [[ ! -x ${ecj} ]] ; then + echo "ecj unusable (${ecj})" +fi + +${ecj} -bootclasspath @HOME@/share/java/libgcj-@PV@.jar -nowarn "${@}" diff --git a/dev-java/gcj/files/javadoc b/dev-java/gcj/files/javadoc new file mode 100755 index 00000000..1614fffb --- /dev/null +++ b/dev-java/gcj/files/javadoc @@ -0,0 +1,3 @@ +#!/bin/sh + +/usr/bin/gjdoc ${1+"${@}"} diff --git a/dev-java/gcj/files/libjava-include.XMLEncoder.patch b/dev-java/gcj/files/libjava-include.XMLEncoder.patch new file mode 100644 index 00000000..6bf8fec2 --- /dev/null +++ b/dev-java/gcj/files/libjava-include.XMLEncoder.patch @@ -0,0 +1,54 @@ +--- gcc-4.1.0/libjava/sources.am.orig 2006-03-06 01:07:56.000000000 +0100 ++++ gcc-4.1.0/libjava/sources.am 2006-03-06 01:13:43.000000000 +0100 +@@ -876,7 +876,37 @@ + classpath/gnu/java/beans/editors/NativeIntEditor.java \ + classpath/gnu/java/beans/editors/NativeLongEditor.java \ + classpath/gnu/java/beans/editors/NativeShortEditor.java \ +-classpath/gnu/java/beans/editors/StringEditor.java ++classpath/gnu/java/beans/editors/StringEditor.java \ ++classpath/gnu/java/beans/encoder/ArrayPersistenceDelegate.java \ ++classpath/gnu/java/beans/encoder/ClassPersistenceDelegate.java \ ++classpath/gnu/java/beans/encoder/CollectionPersistenceDelegate.java \ ++classpath/gnu/java/beans/encoder/Context.java \ ++classpath/gnu/java/beans/encoder/GenericScannerState.java \ ++classpath/gnu/java/beans/encoder/IgnoringScannerState.java \ ++classpath/gnu/java/beans/encoder/MapPersistenceDelegate.java \ ++classpath/gnu/java/beans/encoder/ObjectId.java \ ++classpath/gnu/java/beans/encoder/PrimitivePersistenceDelegate.java \ ++classpath/gnu/java/beans/encoder/ReportingScannerState.java \ ++classpath/gnu/java/beans/encoder/Root.java \ ++classpath/gnu/java/beans/encoder/ScanEngine.java \ ++classpath/gnu/java/beans/encoder/ScannerState.java \ ++classpath/gnu/java/beans/encoder/StAXWriter.java \ ++classpath/gnu/java/beans/encoder/Writer.java \ ++classpath/gnu/java/beans/encoder/elements/Array_Get.java \ ++classpath/gnu/java/beans/encoder/elements/ArrayInstantiation.java \ ++classpath/gnu/java/beans/encoder/elements/Array_Set.java \ ++classpath/gnu/java/beans/encoder/elements/ClassResolution.java \ ++classpath/gnu/java/beans/encoder/elements/Element.java \ ++classpath/gnu/java/beans/encoder/elements/List_Get.java \ ++classpath/gnu/java/beans/encoder/elements/List_Set.java \ ++classpath/gnu/java/beans/encoder/elements/MethodInvocation.java \ ++classpath/gnu/java/beans/encoder/elements/NullObject.java \ ++classpath/gnu/java/beans/encoder/elements/ObjectInstantiation.java \ ++classpath/gnu/java/beans/encoder/elements/ObjectReference.java \ ++classpath/gnu/java/beans/encoder/elements/PrimitiveInstantiation.java \ ++classpath/gnu/java/beans/encoder/elements/StaticFieldAccess.java \ ++classpath/gnu/java/beans/encoder/elements/StaticMethodInvocation.java \ ++classpath/gnu/java/beans/encoder/elements/StringReference.java + + gnu-java-beans.lo: $(gnu_java_beans_source_files) + @find classpath/lib/gnu/java/beans -name '*.class' > gnu-java-beans.list +@@ -2840,7 +2870,11 @@ + classpath/java/beans/VetoableChangeListenerProxy.java \ + classpath/java/beans/VetoableChangeSupport.java \ + classpath/java/beans/Visibility.java \ +-classpath/java/beans/XMLDecoder.java ++classpath/java/beans/XMLDecoder.java \ ++classpath/java/beans/XMLEncoder.java \ ++classpath/java/beans/DefaultPersistenceDelegate.java \ ++classpath/java/beans/PersistenceDelegate.java \ ++classpath/java/beans/Encoder.java + + java_beans_header_files = $(patsubst classpath/%,%,$(patsubst %.java,%.h,$(java_beans_source_files))) + diff --git a/dev-java/gcj/files/mkinfodir b/dev-java/gcj/files/mkinfodir new file mode 100755 index 00000000..a62840ee --- /dev/null +++ b/dev-java/gcj/files/mkinfodir @@ -0,0 +1,233 @@ +#!/bin/bash +# $Id: mkinfodir,v 1.1 2001/09/01 07:56:19 drobbins Exp $ +# Generate the top-level Info node, given a directory of Info files +# and (optionally) a skeleton file. The output will be suitable for a +# top-level dir file. The skeleton file contains info topic names in the +# order they should appear in the output. There are three special +# lines that alter the behavior: a line consisting of just "--" causes +# the next line to be echoed verbatim to the output. A line +# containing just "%%" causes all the remaining filenames (wildcards +# allowed) in the rest of the file to be ignored. A line containing +# just "!!" exits the script when reached (unless preceded by a line +# containing just "--"). Once the script reaches the end of the +# skeleton file, it goes through the remaining files in the directory +# in order, putting their entries at the end. The script will use the +# ENTRY information in each info file if it exists. Otherwise it will +# make a minimal entry. + +# sent by Jeffrey Osier <jeffrey@cygnus.com>, who thinks it came from +# zoo@winternet.com (david d `zoo' zuhn) + +# modified 7 April 1995 by Joe Harrington <jh@tecate.gsfc.nasa.gov> to +# take special flags + +INFODIR=$1 +if [ $# = 2 ] ; then + SKELETON=$2 +else + SKELETON=/dev/null +fi + +skip= + +if [ $# -gt 2 ] ; then + echo usage: $0 info-directory [ skeleton-file ] 1>&2 + exit 1 +elif [ -z "${INFODIR}" ] ; then + INFODIR="%%DEFAULT_INFO_DIR%%" +else + true +fi + +if [ ! -d ${INFODIR} ] ; then + echo "$0: first argument must specify a directory" + exit 1 +fi + +### output the dir header +echo "-*- Text -*-" +echo "This file was generated automatically by $0." +echo "This version was generated on `date`" +echo "by `whoami`@`hostname` for `(cd ${INFODIR}; pwd)`" + +cat << moobler +\$Id: mkinfodir,v 1.1 2001/09/01 07:56:19 drobbins Exp $ +This is the file .../info/dir, which contains the topmost node of the +Info hierarchy. The first time you invoke Info you start off +looking at that node, which is (dir)Top. + +File: dir Node: Top This is the top of the INFO tree + + This (the Directory node) gives a menu of major topics. + Typing "q" exits, "?" lists all Info commands, "d" returns here, + "h" gives a primer for first-timers, + "mEmacs<Return>" visits the Emacs topic, etc. + + In Emacs, you can click mouse button 2 on a menu item or cross reference + to select it. + +* Menu: The list of major topics begins on the next line. + +moobler + +### go through the list of files in the skeleton. If an info file +### exists, grab the ENTRY information from it. If an entry exists +### use it, otherwise create a minimal dir entry. +### +### Then remove that file from the list of existing files. If any +### additional files remain (ones that don't have a skeleton entry), +### then generate entries for those in the same way, putting the info for +### those at the end.... + +infofiles=`(cd ${INFODIR}; /bin/ls | grep -v '\-[0-9]*\.gz$' | grep -v '\-[0-9]*$' | egrep -v '^dir$|^dir\.info$|^dir\.orig$')` + +# echoing gets clobbered by backquotes; we do it the hard way... +lines=`wc $SKELETON | awk '{print $1}'` +line=1 +while [ $lines -ge $line ] ; do + # Read one line from the file. This is so that we can echo lines with + # whitespace and quoted characters in them. + fileline=`awk NR==$line $SKELETON` + + # flag fancy features + if [ ! -z "$echoline" ] ; then # echo line + echo "$fileline" + fileline= + echoline= + elif [ "${fileline}" = "--" ] ; then # should we echo the next line? + echoline=1 + elif [ "${fileline}" = "%%" ] ; then # eliminate remaining files from dir? + skip=1 + elif [ "${fileline}" = "!!" ] ; then # quit now + exit 0 + fi + + # handle files if they exist + for file in $fileline"" ; do # expand wildcards ("" handles blank lines) + + fname= + + if [ -z "$echoline" -a ! -z "$file" ] ; then + + # Find the file to operate upon. Check both possible names. + infoname=`echo $file | sed 's/\.gz$//'` + infoname=`echo $infoname | sed 's/\.info$//'` + noext= + ext= + if [ -f ${INFODIR}/$infoname ] ; then + noext=$infoname + fi + if [ -f ${INFODIR}/${infoname}.info ] ; then + ext=${infoname}.info + fi + if [ -f ${INFODIR}/${infoname}.info.gz ] ; then + ext=${infoname}.info.gz + fi + # If it exists with both names take what was said in the file. + if [ ! -z "$ext" -a ! -z "$noext" ]; then + fname=$file + warn="### Warning: $ext and $noext both exist! Using ${file}. ###" + elif [ ! \( -z "$ext" -a -z "$noext" \) ]; then + # just take the name if it exists only once + fname=${noext}${ext} + fi + + # if we found something and aren't skipping, do the entry + if [ ! -z "$fname" ] ; then + if [ -z "$skip" ] ; then + + if [ ! -z "$warn" ] ; then # issue any warning + echo $warn + warn= + fi + if [ "${fname##*.}" = "gz" ] ; then + entry=`zcat ${INFODIR}/${fname} | sed -e '1,/START-INFO-DIR-ENTRY/d' \ + -e '/END-INFO-DIR-ENTRY/,$d' ` + else + entry=`sed -e '1,/START-INFO-DIR-ENTRY/d' \ + -e '/END-INFO-DIR-ENTRY/,$d' ${INFODIR}/$fname` + fi + if [ ! -z "${entry}" ] ; then + echo "${entry}" + else + echo "* ${infoname}: (${infoname})." + fi + fi + + # remove the name from the directory listing + infofiles=`echo "" ${infofiles} "" | sed -e "s/ ${fname} / /" -e "s/ / /g"` + + fi + + fi + + done + + line=`expr $line + 1` +done + +if [ -z "${infofiles}" ] ; then + exit 0 +elif [ $lines -gt 0 ]; then + echo +fi + +# Sort remaining files by INFO-DIR-SECTION. +prevsect= +filesectdata=`(cd ${INFODIR}; fgrep INFO-DIR-SECTION /dev/null ${infofiles} | \ + fgrep -v 'INFO-DIR-SECTION Miscellaneous' | \ + sort -t: -k2 -k1 | tr ' ' '_')` +for sectdata in ${filesectdata}; do + file=`echo ${sectdata} | cut -d: -f1` + section=`sed -n -e 's/^INFO-DIR-SECTION //p' ${INFODIR}/${file}` + infofiles=`echo "" ${infofiles} "" | sed -e "s/ ${file} / /" -e "s/ / /g"` + + if [ "${prevsect}" != "${section}" ] ; then + if [ ! -z "${prevsect}" ] ; then + echo "" + fi + echo "${section}" + prevsect="${section}" + fi + infoname=`echo $file | sed 's/\.gz$//'` + infoname=`echo $infoname | sed 's/\.info$//'` + if [ "${file##*.}" = "gz" ] ; then + entry=`zcat ${INFODIR}/$file | sed -e '1,/START-INFO-DIR-ENTRY/d' \ + -e '/END-INFO-DIR-ENTRY/,$d' ` + else + entry=`sed -e '1,/START-INFO-DIR-ENTRY/d' \ + -e '/END-INFO-DIR-ENTRY/,$d' ${INFODIR}/$file` + fi + if [ ! -z "${entry}" ] ; then + echo "${entry}" + elif [ ! -d "${INFODIR}/${file}" ] ; then + echo "* ${infoname}: (${infoname})." + fi +done + +# Process miscellaneous files. +for file in ${infofiles}; do + if [ ! -z "${prevsect}" ] ; then + echo "" + echo "Miscellaneous" + prevsect="" + fi + + infoname=`echo $file | sed 's/\.gz$//'` + infoname=`echo $infoname | sed 's/\.info$//'` + if [ "${file##*.}" = "gz" ] ; then + entry=`zcat ${INFODIR}/${file} | sed -e '1,/START-INFO-DIR-ENTRY/d' \ + -e '/END-INFO-DIR-ENTRY/,$d'` + else + entry=`sed -e '1,/START-INFO-DIR-ENTRY/d' \ + -e '/END-INFO-DIR-ENTRY/,$d' ${INFODIR}/$file` + fi + + + if [ ! -z "${entry}" ] ; then + echo "${entry}" + elif [ ! -d "${INFODIR}/${file}" ] ; then + echo "* ${infoname}: (${infoname})." + fi +done + diff --git a/dev-java/gcj/files/pro-police-docs.patch b/dev-java/gcj/files/pro-police-docs.patch new file mode 100644 index 00000000..091ea44e --- /dev/null +++ b/dev-java/gcj/files/pro-police-docs.patch @@ -0,0 +1,74 @@ +Index: gcc/doc/invoke.texi +=================================================================== +RCS file: /cvsroot/gcc/gcc/gcc/doc/invoke.texi,v +retrieving revision 1.364 +diff -c -3 -p -r1.364 invoke.texi +*** gcc/doc/invoke.texi 21 Nov 2003 11:42:58 -0000 1.364 +--- gcc/doc/invoke.texi 22 Nov 2003 08:12:35 -0000 +*************** in the following sections. +*** 228,234 **** + -Wno-multichar -Wnonnull -Wpacked -Wpadded @gol + -Wparentheses -Wpointer-arith -Wredundant-decls @gol + -Wreturn-type -Wsequence-point -Wshadow @gol +! -Wsign-compare -Wstrict-aliasing @gol + -Wswitch -Wswitch-default -Wswitch-enum @gol + -Wsystem-headers -Wtrigraphs -Wundef -Wuninitialized @gol + -Wunknown-pragmas -Wunreachable-code @gol +--- 228,234 ---- + -Wno-multichar -Wnonnull -Wpacked -Wpadded @gol + -Wparentheses -Wpointer-arith -Wredundant-decls @gol + -Wreturn-type -Wsequence-point -Wshadow @gol +! -Wsign-compare -Wstack-protector -Wstrict-aliasing @gol + -Wswitch -Wswitch-default -Wswitch-enum @gol + -Wsystem-headers -Wtrigraphs -Wundef -Wuninitialized @gol + -Wunknown-pragmas -Wunreachable-code @gol +*************** in the following sections. +*** 681,686 **** +--- 681,687 ---- + -fshort-double -fshort-wchar @gol + -fverbose-asm -fpack-struct -fstack-check @gol + -fstack-limit-register=@var{reg} -fstack-limit-symbol=@var{sym} @gol ++ -fstack-protector -fstack-protector-all @gol + -fargument-alias -fargument-noalias @gol + -fargument-noalias-global -fleading-underscore @gol + -ftls-model=@var{model} @gol +*************** effectively. Often, the problem is that +*** 3014,3019 **** +--- 3015,3024 ---- + complex; GCC will refuse to optimize programs when the optimization + itself is likely to take inordinate amounts of time. + ++ @item -Wstack-protector ++ @opindex Wstack-protector ++ Warn when not issuing stack smashing protection for some reason ++ + @item -Werror + @opindex Werror + Make all warnings into errors. +*************** and grows downwards, you can use the fla +*** 11474,11479 **** +--- 11479,11502 ---- + @option{-fstack-limit-symbol=__stack_limit} and + @option{-Wl,--defsym,__stack_limit=0x7ffe0000} to enforce a stack limit + of 128KB@. Note that this may only work with the GNU linker. ++ ++ @item -fstack-protector ++ @item -fstack-protector-all ++ @opindex fstack-protector ++ @opindex fstack-protector-all ++ @opindex fno-stack-protector ++ Generate code to protect an application from a stack smashing ++ attack. The features are (1) the insertion of random value next to the ++ frame pointer to detect the integrity of the stack, (2) the reordering ++ of local variables to place buffers after pointers to avoid the ++ corruption of pointers that could be used to further corrupt arbitrary ++ memory locations, (3) the copying of pointers in function arguments to ++ an area preceding local variable buffers to prevent the corruption of ++ pointers that could be used to further corrupt arbitrary memory ++ locations, and the (4) omission of instrumentation code from some ++ functions to decrease the performance overhead. If the integrity ++ would be broken, the program is aborted. If no-stack-protector is ++ specified, instrumentation codes are generated at every functions. + + @cindex aliasing of parameters + @cindex parameters, aliased diff --git a/dev-java/gcj/files/rebuild-classmap-db b/dev-java/gcj/files/rebuild-classmap-db new file mode 100755 index 00000000..e8744e3a --- /dev/null +++ b/dev-java/gcj/files/rebuild-classmap-db @@ -0,0 +1,110 @@ +#!/bin/sh + +# set defaults +JAVA_PKG_DB_TOOL=${JAVA_PKG_DB_TOOL:="${JAVA_HOME}/bin/gcj-dbtool"} +JAVA_PKG_CLASSMAP=${JAVA_PKG_CLASSMAP:="/usr/share/java/classmap.gcjdb"} + +# functions +die() { + echo "ERROR: ${@}" + exit 1 +} + +show_help() { + echo "To rebuild your database run:" + echo " '${0} <database file> [ <packages> ]'" + echo + echo + echo " database file: /path/to/file.gcjdb" + echo + echo " packages: comma-separated list of packages from 'java-config -l'" + echo + echo + echo "To print only what would be done run:" + echo " '${0} printonly [ <packages> ]'" + echo + echo " packages: comma-separated list of packages from 'java-config -l'" + echo + echo + echo "To recreate the default database with all packages being checked execute:" + echo " '${0} ${JAVA_PKG_CLASSMAP}'" +} + +check_classpath() { + if [[ "$(java-config --classpath=${2} 2>&1)" =~ "Could not find package" ]] ; then + die "A package missing/mispelled?!" + fi +} + +add_lib() { + echo "register: ${2}" + if [ "${DB_FILE}" != "printonly" ] ; then + ${JAVA_PKG_DB_TOOL} -a ${DB_FILE} ${1} ${2} \ + || die "failed to register jar file" + fi +} + +reg_pkgs() { + local pkg pkgs + for pkg in $(java-config -l | cut -d] -f1 | cut -c2-) + do + pkgs="${pkg},${pkgs}" + done + reg_classpath "${pkgs%,}" +} + +reg_classpath() { + check_classpath + + echo "check package(s) ..." + echo "${@}" + echo + + local jar to + classpath="$(java-config --classpath=${@})" + for jar in ${classpath//:/ } + do + to="$(dirname ${jar})/lib$(basename ${jar}).so" + [[ ( -f ${jar} ) && ( ".jar" == "${jar: -4:4}" ) && ( -f ${to} ) ]] \ + && add_lib ${jar} ${to} + done +} + +# errors +if [[ ( ${#} -lt 1 ) || ( ${#} -ge 3 ) ]] ; then + show_help + exit 1 +fi + +if [[ ! -x ${JAVA_PKG_DB_TOOL} ]] ; then + die "Java database tool unusable!" +fi + +DB_FILE="${1}" + +if [ "${DB_FILE}" != "printonly" ] ; then + if [[ ! -d $(dirname ${DB_FILE}) ]] ; then + die "Path to database file missing?!" + fi + + if [ ".gcjdb" != "${DB_FILE: -6:6}" ] ; then + die "Given file has unknown format?!" + fi +fi + +# start +echo "(re)create database (${DB_FILE})" +if [ "${DB_FILE}" != "printonly" ] ; then + rm -f ${DB_FILE} + ${JAVA_PKG_DB_TOOL} -n ${DB_FILE} +fi + +if [[ -n "${2}" ]] ; then + check_classpath + reg_classpath "${2}" +else + reg_pkgs +fi + +echo "... done!" +exit 0 diff --git a/dev-java/gcj/files/scan_libgcc_linked_ssp.sh b/dev-java/gcj/files/scan_libgcc_linked_ssp.sh new file mode 100755 index 00000000..f8817e21 --- /dev/null +++ b/dev-java/gcj/files/scan_libgcc_linked_ssp.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# Copyright 1999-2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# Author: Martin Schlemmer <azarah@gentoo.org> +# $Header: /var/cvsroot/gentoo-x86/sys-devel/gcc/files/scan_libgcc_linked_ssp.sh,v 1.3 2004/07/15 00:59:02 agriffis Exp $ + +usage() { +cat << "USAGE_END" +Usage: can_libgcc_linked_ssp.sh + + This scans the system for files that contains the __guard symbol, that was + linked against libgcc. + + +USAGE_END + + exit 1 +} + +if [ "$#" -ne 0 ] +then + usage +fi + +source /etc/profile +source /sbin/functions.sh + +AWKDIR="$(portageq envvar PORTDIR)/sys-devel/gcc/files/awk" + +if [ ! -r "${AWKDIR}/scanforssp.awk" ] +then + eerror "${0##*/}: ${AWKDIR}/scanforssp.awk does not exist!" + exit 1 +fi + +einfo "Scanning system for __guard@GCC symbols..." +/bin/gawk -f "${AWKDIR}/scanforssp.awk" + +exit $? + + +# vim:ts=4 diff --git a/dev-java/gcj/gcj-4.1.0.ebuild b/dev-java/gcj/gcj-4.1.0.ebuild new file mode 100644 index 00000000..d1b596a7 --- /dev/null +++ b/dev-java/gcj/gcj-4.1.0.ebuild @@ -0,0 +1,48 @@ +# Copyright 1999-2006 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# Header: $ + +inherit gcc-java + +GCJ_HOME="/opt/${P}" + +DESCRIPTION="The GNU Compiler for the Java(tm) Programming Language" +HOMEPAGE="http://gcc.gnu.org/java/" + +LICENSE="GPL-2 LGPL-2.1" +KEYWORDS="-*" +SLOT="4.1" + +src_unpack() { + gcc-java_src_unpack + + echo ${PV/_/-} > "${S}"/gcc/BASE-VER + echo "" > "${S}"/gcc/DATESTAMP + + cd ${S}/libjava/classpath/ + EPATCH_SUFFIX="patch" EPATCH_FORCE="yes" \ + EPATCH_MULTI_MSG="fixes/ports from gnu-classpath ..." \ + epatch ${FILESDIR}/classpath/ + + einfo "tweak ports for GCJ ..." + epatch ${FILESDIR}/fix-java.beans.Encoder.patch + + cd ${S} + epatch ${FILESDIR}/libjava-include.XMLEncoder.patch +} + +src_install() { + gcc-java_src_install + + # copy rebuild-classmap-db + exeinto /usr/bin + doexe ${FILESDIR}/rebuild-classmap-db +} + +pkg_postinst() { + ewarn "This gcj ebuild is provided for your convenience, and the use" + ewarn "of this JDK replacement is not supported by the Gentoo Developers." + ewarn "" + ewarn "You are on your own using this! If you have any interesting news" + ewarn "let us know: http://forums.gentoo.org/viewtopic-t-379693.html" +} diff --git a/dev-java/gcj/gcj-4.1.0_pre20060219.ebuild b/dev-java/gcj/gcj-4.1.0_pre20060219.ebuild new file mode 100644 index 00000000..fd8599c6 --- /dev/null +++ b/dev-java/gcj/gcj-4.1.0_pre20060219.ebuild @@ -0,0 +1,27 @@ +# Copyright 1999-2006 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# Header: $ + +inherit gcc-java + +DESCRIPTION="GCJ: the GCC project's free Java compiler and runtime with the CLASSPATH Java libraries" +HOMEPAGE="http://gcc.gnu.org/java/" + +LICENSE="GPL-2 LGPL-2.1" +KEYWORDS="-*" +SLOT="4.1" + +src_unpack() { + gcc-java_src_unpack + + echo ${SLOT} > "${S}"/gcc/BASE-VER + echo "" > "${S}"/gcc/DATESTAMP +} + +pkg_postinst() { + ewarn "This gcj ebuild is provided for your convenience, and the use" + ewarn "of this JDK replacement is not supported by the Gentoo Developers." + ewarn "" + ewarn "You are on your own using this! If you have any interesting news" + ewarn "let us know: http://forums.gentoo.org/viewtopic-t-379693.html" +} |