Copying over old 3.0.4 branch to new root tapestry3 svn path.
git-svn-id: https://svn.apache.org/repos/asf/tapestry/tapestry3/trunk@670581 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/3.0.4/.checkstyle b/3.0.4/.checkstyle
new file mode 100644
index 0000000..2e8139b
--- /dev/null
+++ b/3.0.4/.checkstyle
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<fileset-config file-format-version="1.2.0" simple-config="true">
+ <fileset name="all" enabled="true" check-config-name="Sun Checks" local="false">
+ <file-match-pattern match-pattern="." include-pattern="true"/>
+ </fileset>
+</fileset-config>
diff --git a/3.0.4/.classpath b/3.0.4/.classpath
new file mode 100644
index 0000000..8842b6c
--- /dev/null
+++ b/3.0.4/.classpath
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="lib" path="config"/>
+ <classpathentry kind="src" path="framework/src"/>
+ <classpathentry kind="src" path="contrib/src"/>
+ <classpathentry kind="src" path="junit/src"/>
+ <classpathentry kind="src" path="examples/VlibBeans/src"/>
+ <classpathentry kind="src" path="examples/Vlib/src"/>
+ <classpathentry kind="src" path="examples/Workbench/src"/>
+ <classpathentry kind="src" path="examples/wap/src"/>
+ <classpathentry exported="true" kind="lib" path="lib/ext/jakarta-oro-2.0.6.jar"/>
+ <classpathentry exported="true" kind="lib" path="lib/ext/commons-logging-1.0.2.jar"/>
+ <classpathentry exported="true" kind="lib" path="lib/ext/commons-lang-1.0.jar"/>
+ <classpathentry exported="true" kind="lib" path="lib/ext/bsf-2.3.0.jar"/>
+ <classpathentry kind="lib" path="ext-dist/junit.jar"/>
+ <classpathentry exported="true" kind="lib" path="lib/ext/commons-beanutils-1.6.1.jar"/>
+ <classpathentry kind="lib" path="examples/Workbench/lib/jCharts-0.6.0.jar"/>
+ <classpathentry exported="true" kind="lib" path="lib/ext/commons-collections-2.1.jar"/>
+ <classpathentry kind="lib" path="lib/ext/commons-fileupload-1.0.jar"/>
+ <classpathentry exported="true" kind="lib" path="lib/ext/javassist-2.5.1.jar"/>
+ <classpathentry exported="true" kind="lib" path="lib/ext/commons-digester-1.5.jar"/>
+ <classpathentry kind="lib" path="lib/ext/commons-codec-1.2.jar"/>
+ <classpathentry kind="lib" path="lib/j2ee/geronimo-ejb.jar"/>
+ <classpathentry kind="lib" path="lib/j2ee/jsp-api.jar"/>
+ <classpathentry exported="true" kind="lib" path="lib/j2ee/servlet-api.jar"/>
+ <classpathentry kind="lib" path="lib/runtime/log4j-1.2.6.jar"/>
+ <classpathentry kind="lib" path="ext-dist/jdom-1.0.jar"/>
+ <classpathentry kind="lib" path="lib/ext/ognl-2.6.7.jar"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre-1.4"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/3.0.4/.cvsignore b/3.0.4/.cvsignore
new file mode 100644
index 0000000..ce9ad11
--- /dev/null
+++ b/3.0.4/.cvsignore
@@ -0,0 +1,13 @@
+bin
+private
+dist
+.temp
+target
+maven.log
+velocity.log
+*.out
+build
+${destdir}
+cachedir
+ext-package
+.settings
diff --git a/3.0.4/.project b/3.0.4/.project
new file mode 100644
index 0000000..54808f1
--- /dev/null
+++ b/3.0.4/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>Tapestry</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/3.0.4/KEYS b/3.0.4/KEYS
new file mode 100644
index 0000000..b61702f
--- /dev/null
+++ b/3.0.4/KEYS
@@ -0,0 +1,115 @@
+This file contains the PGP keys of various developers.
+
+Users: pgp < KEYS
+ gpg --import KEYS
+Developers:
+ pgp -kxa <your name> and append it to this file.
+ (pgpk -ll <your name> && pgpk -xa <your name>) >> this file.
+ (gpg --list-sigs <your name>
+ && gpg --armor --export <your name>) >> this file.
+
+
+
+
+
+pub 1024D/2DDB17D0 2003-06-01 Howard M. Lewis Ship <hlship@apache.org>
+sig 3 2DDB17D0 2003-06-01 Howard M. Lewis Ship <hlship@apache.org>
+sub 1024g/7837388C 2003-06-01
+sig 2DDB17D0 2003-06-01 Howard M. Lewis Ship <hlship@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.2.2 (Cygwin)
+
+mQGiBD7aKV8RBACd181gddOl6a2AM57Ae1r14d3u2TOXDvZRICl4wH8TjJO/+M/4
+K27+3X2ENLo3zuI5aVnDo1png/KVVx7PzRdyru1O4D3TDNLKKahmN/eAW2MvnLBK
+SCaEz+FjSt16M+wGoOkd0M2JMIXGD44r6k74e7lCvj/wnsBVaIcB/y7HtwCglqYe
+DtMa0lmDAZW0vZ5G2zqL/vkD/0cnfWXyL+a+GobHzXKc245UmPpfSzCPqjYFyr+W
+UjU4qQrmod+CoTRADmu+qdeHJSX9Bs0y6HKSFYalEOfl7m90xvH+pdKvdPOsu2LU
+SMH0cpmZHt7NJmXOUeaaTNJ2fcO+exRhqiijSREgBDiVO8YsBTHXiNxTaJREHIeN
+0RRiA/9fw8GzIN6Nez8ikKHanvuKojNE68GfIlJqCrJBNB2/rPBIQgCnKuwjwQpX
+73EalqEfQiIAI/Ekq6TZ9rzoxICaO0CdMDCGuStdL74Vq7XKQvX5ifuQzXgZ1jdf
+3CAZo5vrMDc5b6p+Mt8Gw/uSjK+Sl8tg6PkC1pTcxjCbAm1T8LQoSG93YXJkIE0u
+IExld2lzIFNoaXAgPGhsc2hpcEBhcGFjaGUub3JnPohbBBMRAgAbBQI+2ilfBgsJ
+CAcDAgMVAgMDFgIBAh4BAheAAAoJEIa00not2xfQIjYAn2V6U4zBa5FT0gPSJgCt
+6ZZBBLNxAJ9sPcjK2OS8TL5OvbN9J5BUuReNKbkBDQQ+2ilhEAQAu5TtBmHvKB1T
+7xrTMBJxEmdfxZodrCqR11tZOqRrvT/RcLLZbDQ3ntscZNoiAxoGrGv1vpeO4FwD
+t5T2G93Hza7aYuVV3ucNMAiWUCnkXzLVvVxZ9xK1hnhKDkeQyIyyIjaoiRyq19bi
+2j0NBaG2QNMQpcDSkwy1vHO2SPW8GNMAAwUD/Atf6puXOZn7vj0My580uy5PczQh
+f6EazspE7hqTxuTR8Um6mznAlaFiEjXoprTk6vBpiRzihYHXWhdsOTcLzxVxK+TW
+7Ve2OJGc8jwEWWXfXImorvvlH3HTadV0d63+Sw4oLgO9etUamlM3vVOYavBCfC81
+FVh4vOvy4cKKizOFiEYEGBECAAYFAj7aKWEACgkQhrTSei3bF9CZowCdEiyvPimY
+D3G2EeSaq1C4qb2iqREAn2qZk6Dlf4XrWJiZG+27KvdyaA5N
+=p680
+-----END PGP PUBLIC KEY BLOCK-----
+pub 1024D/FD6C524C 2005-03-29
+uid Paul Ferraro <pferraro@apache.org>
+sig 3 FD6C524C 2005-03-29 Paul Ferraro <pferraro@apache.org>
+sub 2048g/B89AF99B 2005-03-29
+sig FD6C524C 2005-03-29 Paul Ferraro <pferraro@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.0 (Cygwin)
+
+mQGiBEJInnIRBADLh6hjNRNPUDshPXl4iuzmVU2tGYfjYfOoAitU6AtAl5astuwe
+0EprzpTXrf1axd84CWlWmx/iI244UhAljEbHoZ5kI/MMJm6P0DoQRIWj3nvtdbJw
+jlgjwij1gWb3c3o3GwIwZx5onB252Np9whhG33lTmq3gVnPi528DxXpQwwCg71l8
+ZQfCR4bIGrmptM7iF2HpdJ0D/Avik9oyxvKqb8rvM72/UhP6WPl/W/6PGe7zDdzM
+9zAUdkXDmSRD4pHS2lOARHGIT3dZ/L2/Hwgc2U9IaWGnxr64WM8VqyKLF8Fx89/5
+NjvwDAwXWTdyDojvg4TamVF4xycQhSLtAyWxXp983OPp4eBGjMlAGV7SH9RtaNGw
+bQfDBACRIT3QXGQPN4ZA9osVvudo3v1OLV7whbvyPVZoRz85dtSNrDquXGmsmsLm
+g/qBMHV++QiNKF0zCR3LgSKMgBXNLKiYrKZAP+ITXn1PWDZDqHGrst58qJ1AcAe3
+JnPsqqMKzY50bd1P7lQjq9ZQM0FL29imwjiM4YhdZvT/r+PQFrQiUGF1bCBGZXJy
+YXJvIDxwZmVycmFyb0BhcGFjaGUub3JnPoheBBMRAgAeBQJCSJ5yAhsDBgsJCAcD
+AgMVAgMDFgIBAh4BAheAAAoJENoTCsn9bFJM9l0AoL+sj2ysb0pdwEHlIejG54ZW
+GV9vAKDU3+oVU0xxnd+R9yWkG7Ys32i5+LkCDQRCSJ6hEAgAx+a5d4krGWo+BFsC
+EeNDPI/3anJhvACuMwoYbWpResZH1G39UA9mUG/kI2A7Gbm96DGiPpsB9KKJWBfE
+SuXEBLjp8ukXZvrmS8NLrH0bLajptTrjlq8P49AK6C1CFPZRaoq+yd/zA+9ZlM6z
+gPFypK/WoTCQtng0ej4YGA/KEZEIE4FwU+2i9UieVcWJOarggStibPclfY+wZy6p
+YPmkHcUtKTjDTzkdileT11DahACDPAnfjVMvAb3JrkdAqTEapEMkB8TpgZx9NZKB
+yqilxfxDGKAL079exx8ats5XowBQ4/arisHc9AA26MwtoqJowsqpMUPutJ4Rskw8
+59KQCwADBgf/ZliG2GwY7SnE5jujECBGSLJLFb5CuZc/M+RyjqlhnMQsQYmj9GZT
+92I5r5jlydB3tKZ//pkA/YUqHPgKNR4VFO46SAO1QFtau3Sd6Plz82v4KVBt4HUr
+P3w4xl5p1NY/T03qij3Mn/ly6Gkn+b1CmJBBa0+ebaT63bgpRa5MaazWGf+WXx/Y
+BoBBTOOSkKrLJ6YlTQOzIKlknSlQvEuLVdAY+MNetYXpkjW0cjI0Yt9f+obSrsI6
+SeiqO57xRBK+aeDcQMVLrzAdVNkV4UMiLjLc/quLTJ3ShbO8t9RU2JIBZrppplog
+LFSMO33g6znCNXXsmzeMVHxKyrAnDzDI1ohJBBgRAgAJBQJCSJ6hAhsMAAoJENoT
+Csn9bFJMUZEAn2VCJH3MjoV6rVAt5Df892iX0zsMAJ96iBYmm/1KV2NaaqWb7XjY
+YBlFKw==
+=xwwi
+-----END PGP PUBLIC KEY BLOCK-----
+pub 1024D/3E6D26D2 2006-01-26
+uid Jesse Kuhnert <jkuhnert@apache.org>
+sig 3 3E6D26D2 2006-01-26 Jesse Kuhnert <jkuhnert@apache.org>
+sub 2048g/BFF7F76A 2006-01-26
+sig 3E6D26D2 2006-01-26 Jesse Kuhnert <jkuhnert@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2.2 (GNU/Linux)
+
+mQGiBEPYLjoRBACa783DbiuMCc1LlbRDHbD8SYXz6zMMS3zSZ698yk91HG15mejQ
+hLXjenuH7PWuh83m5YyqRz3s2tuEROng5iXwn+A6iVJwnHNNMAA9l+Jy0Z9u5eFN
+29Dwd37GW0yF3tfivN/Y6b2fJzsQh6mTIwuSp6wfLtIvnBwXcDwsIQYgvwCgqX8w
+x3+fLdhPUj5VkYh9CqtBF60EAILCIaiUwk1TH6nFCfPg+UJQLLXpD6YaPItlkEdO
+OIM6P8mfYNraO8O2ZnZtdATRImaOIQ5pSbbQ44d2rGEwr7johU3B8KWb0r0RwLEE
+KAksAgdVZQ4HH9HIL3OYH7b2ED4KyhHG3TTQBmz7h6k4zNgTW3I5GHRVmoM1+x2q
++BY2A/9Z24Oixhq2hbHPbl3YceYJE8W9l4hV+e/a9jP0G4WcvOGxMpj7yO7I/eaf
+ARCr+TjCHEMBEaZXjXe3w1F8iHyf3w5XMVbYCbhPRYUle0Z+690Lz2+hPwXOXFI5
+yVxK2J0xDrQ24CjMAZxdOlzxscIEvPkif2FlIlcElaCaw8NsbLQjSmVzc2UgS3Vo
+bmVydCA8amt1aG5lcnRAYXBhY2hlLm9yZz6IYAQTEQIAIAUCQ9guOgIbAwYLCQgH
+AwIEFQIIAwQWAgMBAh4BAheAAAoJEMB0lGc+bSbShlAAmwe4+Uexyc35UaNWAVhz
+6kiiEQbeAJ97yOFs2rpg5D3jLjK+Oowp6nvKmrkCDQRD2C5EEAgA6SBt6HRmAT0h
+hZJYmmjQZZ4FTxHHxwoIBxbnB/UcrtmavPMTSmaTwmq/EtbCWk4L/IonDXTLtLMa
+Q2UhXrBUIuK2mzOMQ4D96Dcga/M/PiR8Gtnr8t0jDimah/6IVDyKU3cyJ5LfXxP2
+/uIOcAdbwXmR/Pq64SRQx6ub3kkU/5gDGf/B8OmYTRPT+MsfkrS9V2Uo6QDx2nFq
+zel7a3KD4g4s+wybTMSC1W3pYGUeyUgRRMOIJ3MG0zJi//zkohj4QdSgnZvNciwk
+Cud0v6F+OkuMEF8rprJPCDWHrE3mbYjmVVmoVkmsjWpNEvZXuGZnfhw9RE9L2awo
+1bE6PcyXSwADBggAsJ/Rxk49qrn77X/7iOukDQHEz98yDqXxxM/l2edeyjURFbWE
+elu3BLUNGgaUVAMT+/W6dxrH4S9G8K5xLVwiNSelTtOLylYOjiO16InPpZ6I8HcX
+u9CkONthpaj7Es4hGpXxmYpnIkBN0EFA/cEK3GfPX2OiFKJ0CxOAlIkT0wMbFdpU
+tpvyltlD7KMglUJobOtFYjq5wfMyROWnJ4XLIc2XtiiT9Bzgw2blxVtfjCJ4uUUf
+c0JJ8UT+5w7/2QB3RdiSocKpS5FAkemH1gknpHhEeG8cItY0DTNDB39aa8jOIm+1
+Al0KHk4S6kedJEz4t0xcGo5NzZU323Xcl4UEPohJBBgRAgAJBQJD2C5EAhsMAAoJ
+EMB0lGc+bSbS1okAnR498zEVDPUHFMoT3kGd+xkPyf0FAJ44KZYBZLXHFIwiwuMb
+FrdorwKsLQ==
+=1t0m
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/3.0.4/LICENSE-2.0.txt b/3.0.4/LICENSE-2.0.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/3.0.4/LICENSE-2.0.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/3.0.4/NOTICE.txt b/3.0.4/NOTICE.txt
new file mode 100644
index 0000000..3f59805
--- /dev/null
+++ b/3.0.4/NOTICE.txt
@@ -0,0 +1,2 @@
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/3.0.4/Readme.html b/3.0.4/Readme.html
new file mode 100644
index 0000000..cc4949f
--- /dev/null
+++ b/3.0.4/Readme.html
@@ -0,0 +1,230 @@
+<html>
+<!-- $Id$ -->
+<head>
+<title>Tapestry: Java Web Components</title>
+<link rel="STYLESHEET" type="text/css" href="web/scripts/style_virtlib_pcIE55.css">
+</head>
+
+<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
+<table width="100%" border="0" cellspacing="0" cellpadding="0" bgcolor="white">
+ <tr>
+ <td height="5"><IMG height=1 src="web/images/spacer.gif" width=1 border=0>
+ </td>
+ </tr>
+ <tr>
+ <td align="left" valign="top" height="20"><span class="release">Release @VERSION@</RELEASE></span>
+ </td>
+ </tr>
+ <tr bgcolor="#4b5887">
+ <td colspan="3" height="20"><IMG height=1 src="web/images/spacer.gif" width=1 border=0>
+ </td>
+ </tr>
+</table>
+
+<table width="100%" border="0" cellspacing="0" cellpadding="2">
+ <tr>
+ <td><IMG src="web/images/Tapestry-Banner.png" align=absMiddle border=0>
+<p>Tapestry is a component based framework for creating sophisticated web applications.
+It's used with existing application servers, acting as a kind of "super servlet".
+Tapestry applications are built by configuring and combining components to form pages. You
+get surprisingly large amounts of robust functionality for
+startingly small amounts of effort and code!
+
+
+<p>The JARs were created on
+@OS_NAME@ @OS_VERSION@
+using the
+@JAVA_VENDOR@ JDK @JAVA_VM_VERSION@
+compiler.
+
+<p>This product includes software developed by the Apache Software Foundation
+(<a href="http://www.apache.org/">http://www.apache.org/</a>).
+
+<br><br>.....................................................<br><br>
+<h2>Non-ASL Libraries</h2>
+
+<p>
+Tapestry depends on a handful of non-ASL libraries. Because these libraries are not distributed under the terms
+of the Apache Software License, they may not be redistributed with as part of Tapestry. Tapestry's build scripts will
+automatically download the libraries as needed. Several libraries are only needed at build time, but
+some are needed at runtime (and are typically copied into <code>WEB-INF/lib</code>). The two runtime libraries are:
+<ul>
+<li><a href="http://www.ognl.org/">OGNL</a> (Object Graph Navigation Library), version @OGNL_VERSION@
+<li><a href="http://jboss.org/developers/projects/javassist.html">Javassist</a> (byte code enhancement library), version @JAVASSIST_VERSION@
+</ul>
+
+<p>
+The necessary libraries will automatically be downloaded when building the examples. The
+Ant target <code>download-ext-framework</code> will also download the libraries. If you
+are behind a firewall, you may need to <a href="ext-dist/README.html">provide some additional properties</a> in
+<code>config/build.properties</code>.
+
+<br><br>.....................................................<br><br>
+<h2>Configuration</h2>
+
+<p>
+In order to run the Tapestry demos, you need only the <b>binary</b> distribution (it includes the source code
+for the examples). The Ant build scripts will compile and build the Workbench and the Virtual Library example
+applications on your workstation, then deploy them into Jetty, Tomcat or JBoss.
+
+<pTo run these Tapestry applications please ensure:
+ <ul>
+ <li>JDK 1.3 or newer JVM is installed, and the <tt>JAVA_HOME</tt> environment variable is set.</B>
+ <li><b><a href="http://jakarta.apache.org/ant">Ant</a></b> 1.5 or newer is installed, and is added
+to the system <tt>PATH</tt>.</li>
+<li>You have both the <b>binary</b> and the <b>source</b> Tapestry distributions installed
+ </ul>
+
+<p>
+Basic setup: The demos require several external dependencies that cannot be distributed with Tapestry
+because of licensing conflicts. You will need one of the following:
+<ul>
+<li><a href="http://sf.net/projects/jetty">Jetty</a> servlet container, release 4.2 or above.
+<li><a href="http://jakarta.apache.org/tomcat/index.html">Tomcat</a> servlet container, release 4.1 or above.
+<li><a href="http://www.jboss.org">JBoss</a> application server, release 3.0.6.
+ Running the Virtual Library application requires JBoss.</li>
+
+</ul>
+
+<p>
+In each case you will create the file
+<code>config/build.properties</code>
+and put an <em>absolute path</em> to the installation directory (of Jetty, JBoss or Tomcat).
+<b>Always use only forward slashes in the path name.</b>
+
+<p>
+A sample file, <code>config/build.properties.template</code>, is provided. You may edit
+and rename this file.
+
+<p>
+The build process downloads a number of extra files into the
+<code>ext-dist</code> and <code>lib/ext</code>
+directories. See the <A href="ext-dist/README.html">README.html</a> in that directory
+for more details.
+
+<h3>Configuring JBoss</h3>
+
+<p>To run the Tapestry Workbench and the Virtual Library applications with the
+<a href="http://sourceforge.net/projects/jboss">JBoss</a> server:
+ <ul>
+ <li>Download and install <a href="http://prdownloads.sourceforge.net/jboss/jboss-3.0.6.zip?download">JBoss 3.0.6</a>.
+ <br>JBoss is an open-source application server, used to run the database and Enterprise JavaBeans in the Virtual Library.
+<p><span class="hyper-em">This auto-configuration requires JBoss 3.0.6 exactly, not a later release.
+This only affects these turn-key
+demos, not deployment of your own Tapestry applications.</span></p>
+ <li>
+ Update <code>config/build.properties</code>
+ and set property
+ <b><code>jboss.dir</code></b>
+ to the absolute path name
+ of the JBoss installation directory.
+ <li>Download the external dependencies.
+ <li>Execute the command:
+ <br>
+ <b><code>ant -emacs configure run-jboss</code></b>
+
+ <br>This will build, copy and configure the necessary files in the JBoss installation directory, then
+run the JBoss server, automatically deploying the example applications.
+ (The
+ <code>-emacs</code> option
+ changes the Ant output format to be less verbose).</li>
+ </ul>
+
+ <blockquote>You can now run the
+<a href="http://localhost/workbench">Tapestry Workbench</a>
+or the
+<a href="http://localhost">Virtual Library</a> applications.</blockquote>
+
+
+<h3>Configuring Jetty</h3>
+
+<p>To run the Tapestry Workbench application with
+Jetty servlet container:
+ <ul>
+ <li>Obtain and install a copy of Jetty.
+ <li>
+ Update <code>config/build.properties</code>
+ and set property
+ <b><code>jetty.dir</code></b>
+ to the absolute path name
+ of the Jetty installation directory.
+
+ <li>Execute the command:
+ <br>
+ <b>
+ <code>ant -emacs run-workbench</code></b><br>This will run the embedded
+ Jetty server.
+ <br></li>
+ </ul>
+
+ <blockquote>You can now run the
+<a href="http://localhost:8080/workbench">Tapestry Workbench</a> application.
+</blockquote>
+
+ <h3>Configuring Tomcat</h3>
+
+<p>To deploy the Tapestry Workbench application onto an existing
+Tomcat installation:
+
+<p>To run the Tapestry Workbench application with
+Tomcat servlet container:
+ <ul>
+ <li>Obtain and install a copy of Tomcat.
+ <li>
+ Update <code>config/build.properties</code>
+ and set property
+ <b><code>tomcat.dir</code></b>
+ to the absolute path name
+ of the Tomcat installation directory, for example <code>C:/Program Files/Apache Group/Tomcat 4.1</code>.
+
+ <li>Execute the command:
+ <br>
+ <b>
+ <code>ant -emacs deploy-tomcat</code></b>
+
+ <br>This will deploy the Workbench application into Tomcat. If Tomcat is running, you will
+ be able to access the application immediately.
+ <br></li>
+ </ul>
+
+ <blockquote>You can then run the
+<a href="http://localhost:8080/workbench">Tapestry Workbench</a> application.
+</blockquote>
+
+<br><br>.....................................................<br><br>
+<h2>Building from Source</h2>
+
+<p>
+The source distribution includes the source code for the framework and the contrib library. You should extract
+the source distribution to the same directory as the binary distribution.
+You may then execute <b><code>ant install</code></b> to compile all the frameworks and examples.
+Building documentation and running the unit tests requires some additional
+setup that is discussed in
+the <A href="web/doc/ContributorsGuide/ContributorsGuide.html">Tapestry Contributor's Guide</A>.
+</p>
+
+<br><br>.....................................................<br><br>
+<h2>Documentation</h2>
+
+A complete set of <a href="web/doc.html">documentation</a> is distributed with Tapestry.
+
+
+ <br><br>
+ .....................................................
+ <br><br>
+
+<p>Tapestry is an open source project, hosted by
+ <a href="http://jakarta.apache.org">The Jakarta Project</a>
+ and distributed under the terms
+of the <A href="LICENSE-2.0.txt">Apache Software License 2.0</A>.</p></td></tr></table>
+
+<p>
+<a href="http://jakarta.apache.org"><IMG alt="Jakarta Banner" src="web/images/jakarta.png" border=0 ></a>
+<br>©
+2003-2004 Apache Software Foundation.</p>
+
+
+</body>
+
+</html>
+
diff --git a/3.0.4/STATUS.html b/3.0.4/STATUS.html
new file mode 100644
index 0000000..6178a75
--- /dev/null
+++ b/3.0.4/STATUS.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html public "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<title>Tapestry Status</title>
+<link rel="STYLESHEET" type="text/css" href="web/scripts/style_virtlib_pcIE55.css"/>
+</head>
+<body>
+
+$Id$
+
+<br/>
+
+Status documentation (including committer votes) are now recorded inside status.xml.
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/3.0.4/TODO.html b/3.0.4/TODO.html
new file mode 100644
index 0000000..eda0ac0
--- /dev/null
+++ b/3.0.4/TODO.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html public "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+<title>Tapestry TODO List</title>
+<link rel="STYLESHEET" type="text/css" href="web/scripts/style_virtlib_pcIE55.css"/>
+</head>
+<body>
+<h1>Release 3.0</h1>
+<br/>
+$Id$
+<p> Some of these items overlap requests Bugzilla.</p>
+<p><i>This list is anything but final! Not in any (prioritized) order.</i></p>
+<ul>
+ <li>Decide on final release number for "NextGen"</li>
+ <li>Bugzilla or Scarab?</li>
+ <li>Deal with character sets and localization properly</li>
+ <li>Handle change of locale correctly, by reloading new
+ instance of page in proper locale</li>
+ <li>Improved User's Guide to replace existing Developer's
+ Guide</li>
+ <li>Replace the current tutorial with Neil Clayton's
+ Tutorial2</li>
+ <li>Reoganize directory structure to more standard format
+ (compatible with Maven)</li>
+ <li>Use Forrest, or somesuch, for documentation
+ (possibly, convert User's Guide and friends to alternate format)</li>
+ <li>Get Tapestry compiling under Maven, have nightly
+ builds</li>
+ <li>Fill out the test suite and code coverage, reach 85%
+ or better</li>
+ <li>Fix all the Component Reference pages to use the 3.0
+ syntax</li>
+ <li>Unit testing stategy for the JSP tags and tagsupport
+ service</li>
+ <li>Allow auto parameters to not be required</li>
+</ul>
+<h2>Completed items in 3.0</h2>
+<ul>
+ <li>Declarative transient properties - define transient properties in spec,
+ Tapestry builds subclass with instance variables, accessors and
+ initialize() <b>HLS</b></li>
+ <li>Declarative persistant properties - as with transient, but properties are
+ made persistant <b>HLS</b></li>
+ <li>Traditional bin/src distros <b>HLS</b></li>
+ <li>Rename packages from net.sf.tapestry to org.apache.tapestry <b>HLS</b></li>
+ <li>Resolve GPL issues around McKoiDBMBean <b>HLS</b></li>
+ <li>Tapestry JSP tag library <b>HLS</b></li>
+ <li>Support array types for declared properties and connected parameters <b>HLS</b></li>
+ <li>Support primitive types for connected parameters <b>HLS</b></li>
+ <li>Integrate David Solis' WML component contributions <b>DS</b></li>
+ <li>Get Tapestry building under Gump <b>HLS</b></li>
+ <li>Properly sign the distribution and have it mirrored
+ with the other Jakarta downloads <b>HLS</b></li>
+ <li>New features for Script Specification: <b>HLS</b>
+ <ul>
+ <li>Improve the "include script" element to support </li>
+ relative scripts, scripts in context, script in classpath</li>
+ <li>Some kind of "include only once" block</li>
+ <li>Name uniquer</li>
+ <li>New DTD w/Jakarta public/system ids</li>
+ </ul></li>
+ <li>Change build environment to NOT compile against LGPL
+ frameworks (J2EE from JBoss) <b>HLS</b></li>
+</ul>
+<h2>Rejected items in 3.0</h2>
+<ul>
+ <li>Change <extension> initializers to use OGNL
+ expressions <b>HLS<BR></b><i>
+ <br/>Need an "object" for OGNL expressions, not clear what that would be.</i></li>
+</ul>
+<h1>Release 3.1</h1>
+<ul>
+ <li>Intersertials</li>
+ <li>Extend listener methods to take parameters (matching service parameters to actual method parameters)</li>
+</ul>
+</body>
+</html>
diff --git a/3.0.4/build.xml b/3.0.4/build.xml
new file mode 100644
index 0000000..42eed76
--- /dev/null
+++ b/3.0.4/build.xml
@@ -0,0 +1,762 @@
+<?xml version="1.0"?>
+<!-- $Id$ -->
+<!-- Top-level buildfile for the Tapestry module. -->
+<project name="Tapestry Web Application Framework" default="install">
+ <property name="root.dir" value="./"/>
+ <property name="config.dir" value="${root.dir}/config"/>
+ <property file="${config.dir}/Version.properties"/>
+ <property file="${config.dir}/build.properties"/>
+ <property file="${config.dir}/common.properties"/>
+ <property name="javadoc.dir" value="web/doc/api"/>
+ <property name="private.dir" value="private"/>
+
+ <!-- Forrest prefers to put stuff in here. -->
+
+ <property name="build.dir" value="build"/>
+
+ <property environment="env"/>
+
+ <path id="jetty.classpath">
+ <fileset dir="${jetty.dir}">
+ <include name="lib/javax.servlet.jar"/>
+ <include name="lib/org.mortbay.jetty.jar"/>
+ <include name="ext/*.jar"/>
+ </fileset>
+ <!-- Needed to support JSP compilation -->
+ <pathelement location="${env.JAVA_HOME}/lib/tools.jar"/>
+ </path>
+
+ <path id="ext.dist.classpath">
+ <fileset dir="${ext.dist.dir}">
+ <include name="*.jar"/>
+ </fileset>
+ </path>
+
+ <path id="workbench.classpath">
+ <fileset dir="${root.lib.dir}">
+ <include name="${framework.jar}"/>
+ <include name="${contrib.jar}"/>
+ <include name="${ext.dir}/*.jar"/>
+ <include name="${runtime.dir}/*.jar"/>
+ </fileset>
+ <pathelement location="config"/>
+ </path>
+
+ <path id="vlib.classpath">
+ <pathelement location="${vlibbeans.jar}"/>
+ <pathelement location="examples/VlibBeans/jboss"/>
+ <pathelement location="${jboss.client.dir}/jboss-j2ee.jar"/>
+ <pathelement location="${jboss.client.dir}/jboss-client.jar"/>
+ <pathelement location="${jboss.client.dir}/jnp-client.jar"/>
+ <path refid="workbench.classpath"/>
+ </path>
+
+ <target name="clean" description="Cleans all sub-projects.">
+ <ant dir="framework" target="clean"/>
+ <ant dir="contrib" target="clean"/>
+ <ant dir="junit" target="clean"/>
+ <ant dir="examples" target="clean"/>
+ <ant dir="doc/src" target="clean"/>
+ <delete dir="${private.dir}" quiet="true"/>
+ </target>
+
+ <target name="clean-all" depends="clean"
+ description="Cleans all subprojects and deletes installed frameworks, WARs and generated documentation."
+ >
+ <delete quiet="true">
+ <fileset dir="${root.lib.dir}">
+ <include name="*.jar"/>
+ <include name="examples/**"/>
+ </fileset>
+ </delete>
+ <delete dir="web/doc" quiet="true"/>
+ <delete dir="${build.dir}" quiet="true"/>
+ </target>
+
+ <target name="install" description="Builds all frameworks and examples."
+ depends="download-ext-install">
+ <!-- Each project has its own definitions for many properties.
+ inheritAll="false" ensures that definitions in this buildfile
+ doesn't override definitions in each project's buildfile. -->
+ <ant dir="framework" target="install" inheritAll="false"/>
+ <ant dir="contrib" target="install" inheritAll="false"/>
+ <ant dir="examples" target="install" inheritAll="false"/>
+ </target>
+
+ <target name="build-workbench" description="Builds and installs the Workbench demo."
+ depends="download-ext-framework">
+ <ant dir="examples/Workbench" target="install" inheritAll="false"/>
+ </target>
+
+ <target name="build-vlib" description="Builds and installs the Virtual Library demo."
+ depends="download-ext-framework,check-for-jboss-dir">
+ <ant dir="examples/VlibBeans" target="install" inheritAll="false"/>
+ <ant dir="examples/Vlib" target="install" inheritAll="false"/>
+ <ant dir="examples/VlibEAR" target="install" inheritAll="false"/>
+ </target>
+
+ <target name="documentation" depends="download-ext-doc"
+ description="Builds the Tapestry documentation.">
+
+ <ant dir="doc/src" target="install" inheritAll="false">
+ <property name="ext.dist.dir" location="${ext.dist.dir}"/>
+ </ant>
+
+ <echo>Building site documentation using Forrest ...</echo>
+
+ <antcall target="site" inheritall="true"/>
+ </target>
+
+ <target name="junit" depends="check-for-jython-dir,download-ext-junit"
+ description="Run the JUnit test suite for Tapestry.">
+ <ant dir="junit" target="run" inheritAll="false">
+ <property name="ext.dist.dir" location="${ext.dist.dir}"/>
+ </ant>
+ </target>
+
+ <target name="clover" depends="check-for-clover-dir,check-for-jython-dir"
+ description="Execute the JUnit tests and generate Code Coverage report."
+ >
+ <ant dir="junit" target="clover" inheritAll="false">
+ <property name="ext.dist.dir" location="${ext.dist.dir}"/>
+ </ant>
+ </target>
+
+ <target name="dist"
+ description="Builds the Tapestry distribution from scratch."
+ depends="clean-all,install,junit,documentation,clover,javadoc">
+ <!-- After building, clean all the subprojects. -->
+ <antcall target="clean"/>
+ <!-- Now, build that actual distribution. -->
+ <antcall target="build-dist"/>
+ </target>
+
+ <property name="dist.root.dir" value="dist"/>
+ <property name="dist.base" value="Tapestry-${framework.version}"/>
+ <property name="dist.dir" value="${dist.root.dir}/${dist.base}"/>
+
+ <target name="build-dist"
+ description="Builds the Tapestry distribution files.">
+ <!-- Delete the base directory. -->
+ <delete dir="${dist.root.dir}" quiet="true"/>
+ <antcall target="build-dist-tarball"/>
+ </target>
+
+ <target name="build-dist-copy">
+ <echo>Copying to ${dist.dir} ...</echo>
+ <!-- Copy all the relevant files to the base directory. -->
+ <echo> Copying documentation ...</echo>
+ <copy todir="${dist.dir}" includeEmptyDirs="false">
+ <fileset dir=".">
+ <include name="build.xml"/>
+ <include name="*.html"/>
+ <include name="*.txt"/>
+ <include name="KEYS"/>
+ <!-- Skip HTML files in web, since those need
+ a seperate path, to provide filtering. -->
+ <exclude name="Readme.html"/>
+ <include name="config/**"/>
+ <include name="ext-dist/README.html"/>
+ <exclude name="lib/*"/>
+ <exclude name="lib/**"/>
+ <!-- Exclude Paint Shop Pro files (used to generate images
+ in various places) -->
+ <exclude name="**/*.psp"/>
+ <exclude name="**/*.jbf"/>
+ <!-- Don't include build.properties; that's specific to this build
+ environment. We ship a sample file instead. -->
+ <exclude name="config/build.properties"/>
+ <!-- This is where Eclipse puts classes. -->
+ <exclude name="bin/**"/>
+ <exclude name="${build.dir}"/>
+ <!-- It isn't a good idea to generate a distribution from a normal working
+ directory, since the <copy> will include things like backup files created
+ while editting. Better to check out the Tapestry module via anon CVS to
+ a temporary directory, configure build.properties, and build the
+ release there. -->
+ </fileset>
+ </copy>
+ <!-- The Readme.html file and several of the web pages
+ include a version number; copy w/ filtering. -->
+ <echo> Copying (and filtering) Readme.html ...</echo>
+ <copy todir="${dist.dir}" includeEmptyDirs="false">
+ <fileset dir=".">
+ <include name="Readme.html"/>
+ </fileset>
+
+ <filterset>
+ <filter token="VERSION" value="${framework.version}"/>
+ <filter token="OS_NAME" value="${os.name}"/>
+ <filter token="OS_VERSION" value="${os.version}"/>
+ <filter token="JAVA_VENDOR" value="${java.vendor}"/>
+ <filter token="JAVA_VM_VERSION" value="${java.vm.version}"/>
+ <filter token="COPY_YEARS" value="${copyright.years}"/>
+ <filter token="HOME_PAGE_URL"
+ value="http://jakarta.apache.org/tapestry"/>
+ <filter token="OGNL_VERSION" value="${ognl.version}"/>
+ <filter token="JAVASSIST_VERSION" value="${javassist.version}"/>
+ </filterset>
+ </copy>
+
+ <echo> Copying compiled and redistributable libraries ...</echo>
+ <copy todir="${dist.dir}/lib">
+ <fileset dir="${root.lib.dir}">
+ <include name="**/*.jar"/>
+ <exclude name="examples/*"/>
+ <exclude name="${ext.dir}/ognl-*.jar"/>
+ <exclude name="${ext.dir}/javassist-*.jar"/>
+ <include name="**/LICENSE*"/>
+ </fileset>
+ </copy>
+
+ <echo> Copying Tapestry Tag Library Descriptor ...</echo>
+ <copy
+ file="framework/META-INF/taglib.tld"
+ tofile="${dist.dir}/lib/tapestry-${framework.version}.tld"/>
+
+ <echo> Copying framework and examples source code ...</echo>
+ <copy todir="${dist.dir}" includeEmptyDirs="false">
+ <fileset dir=".">
+ <include name="framework/**"/>
+ <include name="contrib/**"/>
+ <include name="examples/**"/>
+
+ <!-- These two aren't quite ready for primetime. -->
+ <exclude name="examples/DevelopmentEnvironment/**"/>
+ <exclude name="examples/Tutorial2/**"/>
+
+ <!-- These are thumnail files that turn up in directories that contain images. These
+ are not stored in CVS and should not be part of the distribution. -->
+ <exclude name="**/Thumbs.db"/>
+ <exclude name="**/pspbrwse.jbf"/>
+ <exclude name="**/classes/"/>
+ </fileset>
+ </copy>
+
+ <property name="web.dir" value="${dist.dir}/web"/>
+ <property name="dtd.dir" value="${web.dir}/dtd"/>
+
+ <echo> Copying Tapestry DTDs ...</echo>
+ <copy todir="${dtd.dir}" flatten="true">
+ <fileset dir="framework/src">
+ <include name="**/*.dtd"/>
+ </fileset>
+ </copy>
+
+ <!-- Copy over javadoc, component references, and docs generated from docbook.
+ We tend to copy the same files too many times (i.e., the builds for the
+ TapestryUsersGuide could generate the HTML files directly into the dist), but
+ it's still fast *enough* so not to fiddle. -->
+
+ <echo> Copying documentation, JavaDoc, Clover report ...</echo>
+ <copy todir="${web.dir}" includeEmptyDirs="false">
+ <fileset dir="web">
+ <!-- Exclude the top level stuff (any remnants of the old, static web site).
+ Include all the docs and reports generated below. -->
+ <exclude name="*.html"/>
+ <include name="**/*"/>
+ </fileset>
+ <fileset dir="${build.dir}/site"/>
+ </copy>
+ </target>
+
+ <target name="build-dist-tarball"
+ description="Builds the tarball distributions."
+ depends="build-dist-copy">
+
+ <property name="bin.tar.gz" value="${dist.dir}-bin.tar.gz"/>
+ <property name="src.tar.gz" value="${dist.dir}-src.tar.gz"/>
+ <tar tarfile="${bin.tar.gz}" longfile="gnu" compression="gzip">
+ <tarfileset dir="${dist.root.dir}" id="dist.bin.set">
+ <include name="${dist.base}/*"/>
+ <include name="${dist.base}/config/**"/>
+ <include name="${dist.base}/lib/**"/>
+ <!-- Have to include a lot of Workbench source in the binary distro, because
+ it has to be compiled and built using the dynamically downloaded non-ASL
+ libraries (such as OGNL). -->
+ <include name="${dist.base}/examples/Workbench/**"/>
+ <exclude name="${dist.base}/examples/Workbench/.build/**"/>
+ <exclude name="${dist.base}/examples/Workbench/image-src/**"/>
+
+ <include name="${dist.base}/examples/Vlib/**"/>
+ <include name="${dist.base}/examples/VlibBeans/**"/>
+ <include name="${dist.base}/examples/VlibEAR/**"/>
+
+ <include name="${dist.base}/examples/wap/**"/>
+
+ <include name="${dist.base}/examples/build.xml"/>
+
+ <!-- Don't ship the code coverage report; it's huge. -->
+ <include name="${dist.base}/web/**"/>
+ <exclude name="${dist.base}/web/doc/clover/**"/>
+ </tarfileset>
+ </tar>
+ <tar tarfile="${src.tar.gz}" longfile="gnu" compression="gzip">
+ <tarfileset dir="${dist.root.dir}" id="dist.src.set">
+ <!-- Include the sub-projects excluded from the -bin distro. -->
+ <include name="${dist.base}/framework/**"/>
+ <include name="${dist.base}/contrib/**"/>
+ </tarfileset>
+ </tar>
+
+ <property name="bin.zip" value="${dist.dir}-bin.zip"/>
+ <property name="src.zip" value="${dist.dir}-src.zip"/>
+
+ <zip destfile="${bin.zip}">
+ <zipfileset refid="dist.bin.set"/>
+ </zip>
+
+ <zip destfile="${src.zip}">
+ <zipfileset refid="dist.src.set"/>
+ </zip>
+
+ <!-- Create the web distribution (to be put up on the web site). This *does*
+ include the code coverage report. -->
+ <property name="web.tar.gz"
+ value="${dist.root.dir}/Tapestry-Web-${framework.version}.tar.gz"/>
+ <tar basedir="${web.dir}" tarfile="${web.tar.gz}" longfile="gnu"
+ compression="gzip"/>
+ </target>
+
+ <target name="javadoc"
+ description="Generate API documentation for the framework and examples."
+ >
+ <mkdir dir="${javadoc.dir}"/>
+ <javadoc author="true" version="true" destdir="${javadoc.dir}"
+ splitindex="true" windowtitle="Tapestry API ${framework.version}">
+ <doctitle>Tapestry ${framework.version} API</doctitle>
+ <package name="org.apache.tapestry.*"/>
+
+ <link href="http://java.sun.com/j2se/1.3/docs/api/"
+ offline="true" packageListLoc="package-lists/jdk"/>
+
+ <link href="http://java.sun.com/j2ee/sdk_1.2.1/techdocs/api/"
+ offline="true" packageListLoc="package-lists/j2ee"/>
+
+ <link href="http://jakarta.apache.org/log4j/docs/api/"
+ offline="true" packageListLoc="package-lists/log4j"/>
+
+ <link href="http://www.junit.org/junit/javadoc/3.7/" offline="true"
+ packageListLoc="package-lists/junit"/>
+
+ <link href="http://jakarta.apache.org/oro/api/" offline="true"
+ packageListLoc="package-lists/jakarta-oro"/>
+
+ <group title="Tapestry Framework"
+ packages="org.apache.tapestry:org.apache.tapestry.*"/>
+ <group title="Tapestry Contributions Framework"
+ packages="org.apache.tapestry.contrib.*"/>
+
+ <sourcepath>
+ <pathelement location="framework/src"/>
+ <pathelement location="contrib/src"/>
+ </sourcepath>
+
+ <classpath>
+ <path refid="vlib.classpath"/>
+ <path refid="ext.dist.classpath"/>
+ <fileset dir="${root.lib.dir}">
+ <include name="${j2ee.dir}/*.jar"/>
+ </fileset>
+ </classpath>
+ </javadoc>
+ </target>
+
+ <target name="run-workbench" depends="check-for-jetty-dir,build-workbench"
+ description="Runs the Tapestry Workbench using Jetty.">
+ <delete dir="${private.dir}" quiet="true"/>
+ <mkdir dir="${private.dir}"/>
+ <echo>Running Tapestry Workbench on port 8080 ...</echo>
+ <java classname="org.mortbay.jetty.Server" fork="true" maxmemory="128M">
+ <classpath>
+ <path refid="jetty.classpath"/>
+ </classpath>
+ <arg value="config/jetty-workbench.xml"/>
+ <!-- Enable debugging when running the tutorial -->
+ <jvmarg line="-showversion -Xdebug -Xnoagent"/>
+ <jvmarg
+ line="-Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=20150"
+ />
+ <!-- Jetty can get easily confused (under NT) unless this is turned off. -->
+ <sysproperty key="org.mortbay.util.FileResource.checkAliases"
+ value="false"/>
+ <sysproperty key="org.apache.tapestry.asset.dir" value="${private.dir}"
+ />
+ <sysproperty key="org.apache.tapestry.asset.URL" value="/private"/>
+ </java>
+ </target>
+
+ <!-- ===================================================================================
+
+ JBoss 3.0.6 auto configuration
+
+ Configures a JBoss 3.0.6 with a new configuration, tapestry. Part of the configuration
+ comes with the Tapestry distribution; part is copied from the JBoss default server
+ configuration.
+
+ This only works with JBoss 3.0.6; other releases differ enough that this
+ simple script is broken.
+
+ ==================================================================================== -->
+ <property name="tapestry.dir" value="${jboss.dir}/server/tapestry"/>
+ <property name="tapestry.conf.dir" value="${tapestry.dir}/conf"/>
+ <property name="tapestry.lib.dir" value="${tapestry.dir}/lib"/>
+ <property name="tapestry.db.dir" value="${tapestry.dir}/db"/>
+ <property name="tapestry.deploy.dir" value="${tapestry.dir}/deploy"/>
+ <property name="tapestry.private.dir"
+ value="${tapestry.dir}/tmp/${private.dir}"/>
+ <property name="jboss.server.default.dir"
+ value="${jboss.dir}/server/default"/>
+ <target name="configure" depends="check-for-jboss-dir,download-ext-examples"
+ description="Configure the JBoss 3.0.6 server and setup the Tapestry database."
+ >
+ <delete dir="${tapestry.lib.dir}" quiet="true"/>
+ <mkdir dir="${tapestry.lib.dir}"/>
+ <copy todir="${tapestry.lib.dir}" flatten="true">
+ <fileset dir="${root.lib.dir}">
+ <include name="*-${framework.version}.jar"/>
+ <include name="${ext.dir}/*.jar"/>
+ </fileset>
+ <fileset dir="${ext.dist.dir}">
+ <include name="mckoidb*.jar"/>
+ </fileset>
+ <fileset dir="${jboss.server.default.dir}/lib">
+ <!-- Could do a careful analysis of just what we need and copy only that,
+ but this is good for now. -->
+ <include name="*.jar"/>
+ </fileset>
+ </copy>
+ <!-- Delete, recreate and copy -->
+ <delete dir="${tapestry.conf.dir}" quiet="true"/>
+ <mkdir dir="${tapestry.conf.dir}"/>
+ <copy todir="${tapestry.conf.dir}" filtering="true">
+ <fileset dir="config/jboss/conf"/>
+ <filterset>
+ <filter token="jboss.dir" value="${jboss.dir}"/>
+ <filter token="user.dir" value="${user.dir}"/>
+ </filterset>
+ </copy>
+ <mkdir dir="${tapestry.deploy.dir}"/>
+ <copy todir="${tapestry.deploy.dir}">
+ <fileset dir="${jboss.server.default.dir}/deploy">
+ <!-- Skip one file that is replaced -->
+ <exclude name="jbossweb.sar/META-INF/jboss-service.xml"/>
+ <include name="*"/>
+ <include name="**/*"/>
+ </fileset>
+ </copy>
+ <!-- Technically, this isn't necessary any longer (the filtering part),
+ but it does no harm, and may be needed again in the future. -->
+ <copy todir="${tapestry.deploy.dir}" filtering="true">
+ <fileset dir="config/jboss/deploy"/>
+ <filterset>
+ <filter token="user.dir" value="${user.dir}"/>
+ <filter token="jboss.dir" value="${jboss.dir}"/>
+ </filterset>
+ </copy>
+ <!-- Set a flag if the vlib already exists, then extract it if necessary. -->
+ <mkdir dir="${tapestry.db.dir}"/>
+ <available file="${tapestry.db.dir}/tapestry.conf"
+ property="tapestry.db.exists"/>
+ <antcall target="unpack-tapestry-database"/>
+ </target>
+
+ <target name="unpack-tapestry-database"
+ description="Unpacks the Tapestry demos database."
+ unless="tapestry.db.exists">
+ <unzip src="config/jboss/tapestry-db.zip" dest="${tapestry.db.dir}"/>
+ </target>
+
+ <target name="deploy-jboss-demos" depends="check-for-jboss-dir,build-workbench,build-vlib"
+ description="Deploys the demos and Tapestry frameworks into JBoss.">
+ <copy todir="${tapestry.deploy.dir}">
+ <fileset dir="${examples.dir}">
+ <include name="${vlib.ear}"/>
+ <include name="${workbench.war}"/>
+ </fileset>
+ </copy>
+ </target>
+
+ <target name="run-jboss" depends="deploy-jboss-demos"
+ description="Launch the JBoss application server.">
+ <delete dir="${tapestry.private.dir}" quiet="true"/>
+ <mkdir dir="${tapestry.private.dir}"/>
+ <java fork="true" dir="${jboss.dir}/bin" classname="org.jboss.Main">
+ <!-- Launch using the tapestry configuration, not the default. -->
+ <arg line="--configuration=tapestry"/>
+ <classpath>
+ <pathelement location="${jboss.dir}/bin/run.jar"/>
+ <!-- Include this so that the JMX control panel (based on JSPs) can work. -->
+ <pathelement location="${java.home}/../lib/tools.jar"/>
+ </classpath>
+ <!-- Enable debugging -->
+ <jvmarg line="-showversion -Xdebug -Xnoagent"/>
+ <jvmarg
+ line="-Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=20500"
+ />
+ <!-- These allow private assets to be exported as static
+ files. This coordinates with portions of
+ config/deploy/jbossweb.sar/META-INF/jboss-service.xml -->
+ <sysproperty key="org.apache.tapestry.asset.dir"
+ value="${tapestry.private.dir}"/>
+ <sysproperty key="org.apache.tapestry.asset.URL" value="/private"/>
+ <!-- The following is probably only necessary under Windows. Jetty gets
+ tripped up by the fact that pathnames are case-insensitive. -->
+ <sysproperty key="org.mortbay.util.FileResource.checkAliases"
+ value="false"/>
+ </java>
+ </target>
+
+ <target name="deploy-tomcat"
+ depends="check-for-tomcat-dir,build-workbench"
+ description="Deploys the Workbench application into Tomcat.">
+
+ <copy file="${examples.dir}/${workbench.war}" todir="${tomcat.dir}/webapps"/>
+
+ </target>
+
+ <target name="check-for-jboss-dir">
+ <available property="exists.jboss.dir" type="dir" file="${jboss.dir}"/>
+ <fail unless="jboss.dir"
+ message="Property jboss.dir not specified in config/build.properties."
+ />
+ <fail unless="exists.jboss.dir"
+ message="Directory ${jboss.dir} (jboss.dir from config/build.properties) does not exist."
+ />
+ </target>
+
+ <target name="check-for-tomcat-dir">
+ <available property="exists.tomcat.dir" type="dir" file="${tomcat.dir}"
+ />
+ <fail unless="tomcat.dir"
+ message="Property tomcat.dir not specified in config/build.properties."
+ />
+ <fail unless="exists.tomcat.dir"
+ message="Directory ${tomcat.dir} (tomcat.dir from config/build.properties) does not exist."
+ />
+ </target>
+
+ <target name="check-for-clover-dir">
+ <available property="exists.clover.dir" type="dir" file="${clover.dir}"
+ />
+ <fail unless="clover.dir"
+ message="Property clover.dir not specified in config/build.properties."
+ />
+ <fail unless="exists.clover.dir"
+ message="Directory ${clover.dir} (clover.dir from config/build.properties) does not exist."
+ />
+ </target>
+
+ <target name="check-for-jython-dir">
+ <available property="exists.jython.dir" type="dir" file="${jython.dir}"
+ />
+ <fail unless="jython.dir"
+ message="Property jython.dir not specified in config/build.properties."
+ />
+ <fail unless="exists.jython.dir"
+ message="Directory ${jython.dir} (jython.dir from config/build.properties) does not exist."
+ />
+ </target>
+
+ <target name="check-for-jetty-dir">
+ <available property="exists.jetty.dir" type="dir" file="${jetty.dir}" />
+ <fail unless="jetty.dir"
+ message="Property jetty.dir not specified in config/build.properties."
+ />
+ <fail unless="exists.jetty.dir"
+ message="Directory ${jetty.dir} (jetty.dir from config/build.properties) does not exist."
+ />
+ </target>
+
+ <target name="check-for-forrest-dir" depends="check-defined-forrest-dir,check-downloaded-forrest">
+ </target>
+
+ <target name="site" description="Generates static HTML documentation" depends="check-for-forrest-dir">
+ <ant antfile="${installed.forrest.dir}/forrest.antproxy.xml" target="site">
+ <property name="forrest.home" value="${installed.forrest.dir}"/>
+ </ant>
+ </target>
+
+ <target name="validate" depends="check-for-forrest-dir" description="Validates XML documentation files">
+ <ant antfile="${installed.forrest.home}/forrest.antproxy.xml" target="validate"/>
+ </target>
+
+ <target name="check-defined-forrest-dir" if="forrest.dir">
+ <available property="exists.forrest.dir" type="dir" file="${forrest.dir}"/>
+ <fail unless="exists.forrest.dir"
+ message="Directory ${forrest.dir} (forrest.dir from config/build.properties) does not exist."/>
+ <property name="installed.forrest.dir" value="${forrest.dir}"/>
+ </target>
+
+ <target name="check-downloaded-forrest" unless="forrest.home" depends="proxyflags"
+ description="Download forrest package">
+ <echo message="Property forrest.dir not specified in config/build.properties"/>
+ <echo message="Downloading Forrest"/>
+ <antcall target="downloadzip">
+ <param name="sourcefile" value="${forrestdl.loc}"/>
+ <param name="dlfile" value="${forrestdl.ant.xml}"/>
+ <param name="destdir" value="${ext.download.dir}"/>
+ </antcall>
+ <property name="installed.forrest.dir" value="${forrestdl.home}"/>
+ </target>
+
+ <target name="download-ext-install"
+ depends="download-ext-framework, download-ext-examples"
+ description="Download binary packages for the install target"/>
+
+ <target name="download-ext-framework" depends="proxyflags"
+ description="Download binary packages for compiling the framework and examples" >
+ <mkdir dir="${ext.download.dir}" />
+
+ <antcall target="installgz">
+ <param name="sourcefile" value="${jdom.loc}"/>
+ <param name="dlfile" value="${jdom.jar}"/>
+ <param name="destfile" value="${jdom.ext.jar}"/>
+ <param name="destdir" value="${ext.download.dir}"/>
+ </antcall>
+
+ <antcall target="installzip">
+ <param name="sourcefile" value="${javassist.loc}"/>
+ <param name="dlfile" value="${javassist.jar}"/>
+ <param name="destfile" value="${javassist.ext.jar}"/>
+ <param name="destdir" value="${javassist.dest}"/>
+ </antcall>
+
+ <antcall target="installjar">
+ <param name="sourcefile" value="${ognl.loc}"/>
+ <param name="destfile" value="${ognl.dest}"/>
+ </antcall>
+
+ </target>
+
+ <target name="download-ext-examples" depends="proxyflags"
+ description="Download binary packages for compiling the examples" >
+ <mkdir dir="${ext.download.dir}" />
+
+ <antcall target="installzip">
+ <param name="sourcefile" value="${mckoi.loc}"/>
+ <param name="dlfile" value="${mckoi.jar}"/>
+ <param name="destfile" value="${mckoi.ext.jar}"/>
+ <param name="destdir" value="${ext.download.dir}"/>
+ </antcall>
+ </target>
+
+ <target name="download-ext-junit" depends="proxyflags"
+ description="Download binary packages for compiling the unit tests" >
+ <mkdir dir="${ext.download.dir}" />
+
+ <antcall target="installzip">
+ <param name="sourcefile" value="${junit.loc}"/>
+ <param name="dlfile" value="${junit.jar}"/>
+ <param name="destfile" value="${junit.ext.jar}"/>
+ <param name="destdir" value="${ext.download.dir}"/>
+ </antcall>
+
+ <antcall target="installgz">
+ <param name="sourcefile" value="${jdom.loc}"/>
+ <param name="dlfile" value="${jdom.jar}"/>
+ <param name="destfile" value="${jdom.ext.jar}"/>
+ <param name="destdir" value="${ext.download.dir}"/>
+ </antcall>
+ </target>
+
+ <target name="download-ext-doc" depends="proxyflags"
+ description="Download binary packages for compiling the documentation" >
+ <mkdir dir="${ext.download.dir}" />
+
+ <antcall target="downloadfile">
+ <param name="sourcefile" value="${docbookxml.loc}"/>
+ <param name="destfile" value="${docbookxml.file}"/>
+ <param name="destdir" value="${ext.dist.dir}"/>
+ </antcall>
+
+ <antcall target="downloadfile">
+ <param name="sourcefile" value="${docbookxsl.loc}"/>
+ <param name="destfile" value="${docbookxsl.file}"/>
+ <param name="destdir" value="${ext.dist.dir}"/>
+ </antcall>
+ </target>
+
+ <target name="download-alert" unless="download-alert-shown">
+ <echo>
+*********************************************************************************
+* Due to the restrictions of the Apache Software License 2.0, it is necessary *
+* to download some additional libraries that use non-ASL licenses. You should *
+* be aware that redistribution of these files are regulated by their individual *
+* licenses. If you experience problems with the download, consult the file *
+* ext-dist/README.html for details on how to configure the build to work *
+* around a firewall. *
+*********************************************************************************
+ </echo>
+
+ <!-- This doesn't work so well ... the property must be getting lost after
+ each antcall completes. -->
+
+ <property name="download-alert-shown" value="you-betcha"/>
+
+ </target>
+
+ <target name="installjar" unless="exist" depends="setproxy,testexistdest,download-alert">
+ <get src="${sourcefile}" dest="${destfile}"/>
+ </target>
+
+ <target name="installgz" unless="exist" depends="setproxy,testexistdest">
+ <antcall target="downloadgz"/>
+ <copy file="${dlfile}" tofile="${destfile}"/>
+ </target>
+
+ <target name="downloadgz" unless="exist" depends="setproxy,testexist,download-alert">
+ <mkdir dir="${ext.download.dir}"/>
+ <!-- Download and extract the package -->
+ <get src="${sourcefile}" dest="${ext.download.dir}/file.tar.gz" />
+ <gunzip src="${ext.download.dir}/file.tar.gz" dest="${ext.download.dir}/file.tar"/>
+ <untar src="${ext.download.dir}/file.tar" dest="${ext.download.dir}"/>
+ <delete file="${ext.download.dir}/file.tar"/>
+ <delete file="${ext.download.dir}/file.tar.gz"/>
+ </target>
+
+ <target name="installzip" unless="exist" depends="setproxy,testexistdest">
+ <antcall target="downloadzip"/>
+ <copy file="${dlfile}" tofile="${destfile}"/>
+ </target>
+
+ <target name="downloadzip" unless="exist" depends="setproxy,testexist,download-alert">
+ <!-- Download and extract the package -->
+ <mkdir dir="${ext.download.dir}"/>
+ <get src="${sourcefile}" dest="${ext.download.dir}/file.zip" />
+ <mkdir dir="${destdir}" />
+ <unzip src="${ext.download.dir}/file.zip" dest="${destdir}"/>
+ <delete file="${ext.download.dir}/file.zip"/>
+ </target>
+
+ <target name="downloadfile" unless="exist" depends="setproxy,testexistdest">
+ <!-- Download extract the file -->
+ <mkdir dir="${destdir}" />
+ <get src="${sourcefile}" dest="${destfile}" />
+ </target>
+
+ <target name="proxyflags">
+ <!-- check proxy parameters. -->
+ <condition property="useproxy">
+ <equals arg1="${proxy.use}" arg2="on" />
+ </condition>
+ </target>
+
+ <target name="setproxy" if="useproxy">
+ <taskdef name="setproxy"
+ classname="org.apache.tools.ant.taskdefs.optional.net.SetProxy" />
+ <setproxy proxyhost="${proxy.host}" proxyport="${proxy.port}"/>
+ <echo message="Using ${proxy.host}:${proxy.port} to download ${sourcefile}"/>
+ </target>
+
+ <target name="testexistdest">
+ <echo message="Testing for ${destfile}"/>
+ <available file="${destfile}" property="exist"/>
+ </target>
+
+ <target name="testexist">
+ <echo message="Testing for ${dlfile}"/>
+ <available file="${dlfile}" property="exist"/>
+ </target>
+
+</project>
diff --git a/3.0.4/config/.cvsignore b/3.0.4/config/.cvsignore
new file mode 100644
index 0000000..9a96d4a
--- /dev/null
+++ b/3.0.4/config/.cvsignore
@@ -0,0 +1,2 @@
+build.properties
+build.properties
diff --git a/3.0.4/config/Version.properties b/3.0.4/config/Version.properties
new file mode 100644
index 0000000..2cd3a42
--- /dev/null
+++ b/3.0.4/config/Version.properties
@@ -0,0 +1,5 @@
+# $Id$
+#
+# Stores the version number of the framework.
+
+framework.version=3.0.4
diff --git a/3.0.4/config/build.properties.sample b/3.0.4/config/build.properties.sample
new file mode 100644
index 0000000..df89514
--- /dev/null
+++ b/3.0.4/config/build.properties.sample
@@ -0,0 +1,32 @@
+# $Id$
+# This file is used to configure the Tapestry build.
+# Copy it as "build.properties" and fill in the necessary data.
+
+# The absolute path to the directory where external distributions
+# used in the building process will be downloaded and installed
+base.path=/usr/share/java
+
+# The absolute path to the directory containing the JBoss installation.
+# Required to execute the configure and run-jboss targets.
+jboss.dir=
+
+# The absolute path to the directory containing the Tomcat installation.
+# Required to execute the deploy-tomcat target.
+#
+tomcat.dir=
+
+# The absolute path to the directory containing the Jetty installation.
+# Required to execute the run-workbench target.
+jetty.dir=
+
+# The absolute path to the directory containing the Jython installation.
+# Required to execute the junit target.
+jython.dir=
+
+# Home for xml-forrest, used to build documentation.
+# Available from :pserver:anoncvs@cvs.apache.org:/home/cvspublic as module xml-forrest
+# Build forrest, then set to the shbat directory, i.e.
+# C:/workspace/xml-forrest/build/dist/shbat
+
+forrest.home=
+
diff --git a/3.0.4/config/common.properties b/3.0.4/config/common.properties
new file mode 100644
index 0000000..94d02b0
--- /dev/null
+++ b/3.0.4/config/common.properties
@@ -0,0 +1,94 @@
+# $Id$
+#
+# Specifies some general properties used throughout.
+# Each build.xml must specify root.dir (as a relative path).
+
+lib.dir=lib
+
+root.lib.dir=${root.dir}/${lib.dir}
+
+ext.dist.dir=${root.dir}/ext-dist
+
+root.config.dir=${root.dir}/config
+
+framework.jar=tapestry-${framework.version}.jar
+contrib.jar=tapestry-contrib-${framework.version}.jar
+
+examples.dir=${root.lib.dir}/examples
+
+vlib.war=vlib.war
+vlib.ear=vlib.ear
+vlibbeans.jar=vlibbeans.jar
+workbench.war=workbench.war
+wap.war=wap.war
+
+ext.download.dir=${ext.dist.dir}/downloads
+
+# Names of directories under lib
+
+ext.dir=ext
+j2ee.dir=j2ee
+runtime.dir=runtime
+
+jboss.lib.dir=${jboss.dir}/lib
+jboss.client.dir=${jboss.dir}/client
+jboss.server.all.lib.dir=${jboss.dir}/server/all/lib
+
+# Directory containing source code and package resources
+src.dir=src
+
+# Directory containing compiled Java code
+classes.dir=classes
+
+# Used as part of copyrights
+
+copyright.years=2000-2004
+
+# ----- JUnit Unit Test Suite, version 3.8 or later -----
+junit.home=${ext.download.dir}/junit3.8.1
+junit.lib=${junit.home}
+junit.jar=${junit.lib}/junit.jar
+junit.ext.jar=${ext.dist.dir}/junit.jar
+junit.loc=http://telia.dl.sourceforge.net/sourceforge/junit/junit3.8.1.zip
+
+# ----- JDOM Library, version 1.0 -----
+jdom.home=${ext.download.dir}/jdom-1.0
+jdom.lib=${jdom.home}
+jdom.jar=${jdom.lib}/build/jdom.jar
+jdom.ext.jar=${ext.dist.dir}/jdom-1.0.jar
+jdom.loc=http://www.jdom.org/dist/binary/jdom-1.0.tar.gz
+
+# ----- McKoi Pure Java Database, version 1.0.2 -----
+mckoi.home=${ext.download.dir}/mckoi1.0.2
+mckoi.lib=${mckoi.home}
+mckoi.jar=${mckoi.lib}/mckoidb.jar
+mckoi.ext.jar=${ext.dist.dir}/mckoidb.jar
+mckoi.loc=http://www.mckoi.com/database/ver/mckoi1.0.2.zip
+
+# ----- DocBook XML, version 4.1.2 -----
+docbookxml.file=${ext.dist.dir}/docbkx412.zip
+docbookxml.loc=http://www.docbook.org/xml/4.1.2/docbkx412.zip
+
+# ----- DocBook XSL, version 1.64.1 -----
+docbookxsl.file=${ext.dist.dir}/docbook-xsl-1.64.1.zip
+docbookxsl.loc=http://telia.dl.sourceforge.net/sourceforge/docbook/docbook-xsl-1.64.1.zip
+
+# ----- Apache Forrest, version 0.5.1 -----
+forrestdl.home=${ext.download.dir}/apache-forrest-0.5.1-bin
+forrestdl.ant.xml=${forrestdl.home}/forrest.antproxy.xml
+forrestdl.loc=http://archive.apache.org/dist/forrest/pre-0.6/apache-forrest-0.5.1-bin.zip
+
+# ---- OGNL ----
+ognl.version=2.6.7
+ognl.loc=http://ognl.org/${ognl.version}/ognl-${ognl.version}.jar
+ognl.dest=${root.lib.dir}/${ext.dir}/ognl-${ognl.version}.jar
+
+# ---- Javassist ----
+
+javassist.version=2.5.1
+javassist.loc=http://umn.dl.sourceforge.net/sourceforge/jboss/javassist-${javassist.version}.zip
+javassist.dest=${ext.download.dir}/javassist-${javassist.version}
+javassist.ext.jar=${root.lib.dir}/${ext.dir}/javassist-${javassist.version}.jar
+javassist.jar=${javassist.dest}/javassist.jar
+
+
diff --git a/3.0.4/config/jboss/conf/auth.conf b/3.0.4/config/jboss/conf/auth.conf
new file mode 100644
index 0000000..2fe9341
--- /dev/null
+++ b/3.0.4/config/jboss/conf/auth.conf
@@ -0,0 +1,12 @@
+// This file is now obsolete but is read for backward compatability
+// Use the login-config.xml file instead
+// $Id$
+
+simple {
+ // Very simple login module:
+ // any user name is accepted.
+ // password should either coincide with user name or be null,
+ // all users have role "guest",
+ // users with non-null password also have role "user"
+ org.jboss.security.auth.spi.SimpleServerLoginModule required;
+};
diff --git a/3.0.4/config/jboss/conf/jboss-minimal.xml b/3.0.4/config/jboss/conf/jboss-minimal.xml
new file mode 100644
index 0000000..22dec8e
--- /dev/null
+++ b/3.0.4/config/jboss/conf/jboss-minimal.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE server>
+<!-- $Id$ -->
+
+<!-- ===================================================================== -->
+<!-- -->
+<!-- A minimal JBoss Server Configuration -->
+<!-- -->
+<!-- ===================================================================== -->
+
+<server>
+
+ <!-- Load all jars from the JBOSS_DIST/server/<config>/lib directory. This
+ can be restricted to specific jars by specifying them in the archives
+ attribute.
+ -->
+ <classpath codebase="lib" archives="*"/>
+
+ <!-- ==================================================================== -->
+ <!-- Log4j Initialization -->
+ <!-- ==================================================================== -->
+ <mbean code="org.jboss.logging.Log4jService"
+ name="jboss.system:type=Log4jService,service=Logging">
+ <attribute name="ConfigurationURL">resource:log4j.xml</attribute>
+ </mbean>
+
+ <!-- ==================================================================== -->
+ <!-- JNDI -->
+ <!-- ==================================================================== -->
+
+ <mbean code="org.jboss.naming.NamingService"
+ name="jboss:service=Naming">
+ <!-- The listening port for the bootstrap JNP service. Set this to -1
+ to run the NamingService without the JNP invoker listening port.
+ -->
+ <attribute name="Port">1099</attribute>
+ </mbean>
+ <mbean code="org.jboss.naming.JNDIView"
+ name="jboss:service=JNDIView"/>
+
+ <!-- ==================================================================== -->
+ <!-- Deployment Scanning -->
+ <!-- ==================================================================== -->
+
+ <!-- An mbean for hot deployment/undeployment of archives.
+ -->
+ <mbean code="org.jboss.deployment.scanner.URLDeploymentScanner"
+ name="jboss.deployment:type=DeploymentScanner,flavor=URL">
+
+ <depends optional-attribute-name="Deployer">jboss.system:service=MainDeployer</depends>
+
+ <!-- The URLComparator can be used to specify a deployment ordering
+ for deployments found in a scanned directory. The class specified
+ must be an implementation of java.util.Comparator, it must be able
+ to compare two URL objects, and it must have a no-arg constructor.
+ Two deployment comparators are shipped with JBoss:
+ - org.jboss.deployment.DeploymentSorter
+ Sorts by file extension, as follows:
+ "sar", "service.xml", "rar", "jar", "war", "wsr", "ear", "zip",
+ "*"
+ - org.jboss.deployment.scanner.PrefixDeploymentSorter
+ If the name portion of the url begins with 1 or more digits, those
+ digits are converted to an int (ignoring leading zeroes), and
+ files are deployed in that order. Files that do not start with
+ any digits will be deployed last, and they will be sorted by
+ extension as above with DeploymentSorter.
+ -->
+ <attribute name="URLComparator">org.jboss.deployment.DeploymentSorter</attribute>
+ <!-- The Filter specifies a java.io.FileFilter for scanned
+ directories. Any file not accepted by this filter will not be
+ deployed. The org.jboss.deployment.scanner.DeploymentFilter
+ rejects the following patterns:
+ "#*", "%*", ",*", ".*", "_$*", "*#", "*$", "*%", "*.BAK",
+ "*.old", "*.orig", "*.rej", "*.bak", "*,v", "*~", ".make.state",
+ ".nse_depinfo", "CVS", "CVS.admin", "RCS", "RCSLOG", "SCCS",
+ "TAGS", "core", "tags"
+ -->
+ <attribute name="Filter">org.jboss.deployment.scanner.DeploymentFilter</attribute>
+
+ <attribute name="ScanPeriod">5000</attribute>
+
+ <!-- URLs are comma seperated and unprefixed arguments are considered
+ file URLs and resolve relative to server home(JBOSS_DIST/server/default)
+ unless the given path is absolute. Any referenced directories cannot
+ be unpackaged archives, use the parent directory of the unpacked
+ archive.
+ -->
+ <attribute name="URLs">
+ ./deploy
+ </attribute>
+ </mbean>
+
+</server>
diff --git a/3.0.4/config/jboss/conf/jboss-service.xml b/3.0.4/config/jboss/conf/jboss-service.xml
new file mode 100644
index 0000000..e52d927
--- /dev/null
+++ b/3.0.4/config/jboss/conf/jboss-service.xml
@@ -0,0 +1,336 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE server>
+<!-- $Id$ -->
+
+<!-- ===================================================================== -->
+<!-- -->
+<!-- JBoss Server Configuration -->
+<!-- -->
+<!-- ===================================================================== -->
+
+<server>
+
+ <!-- Load all jars from the JBOSS_DIST/server/<config>/lib directory. This
+ can be restricted to specific jars by specifying them in the archives
+ attribute.
+ -->
+ <classpath codebase="lib" archives="*"/>
+
+ <!-- ==================================================================== -->
+ <!-- PropertyEditors and System Properties -->
+ <!-- ==================================================================== -->
+ <mbean code="org.jboss.varia.property.PropertyEditorManagerService"
+ name="jboss:type=Service,name=BootstrapEditors">
+ <!-- Preload all custom editors for VMs that don't use the thread
+ context class loader when searching for PropertyEditors
+ -->
+ <attribute name="BootstrapEditors">
+ java.math.BigDecimal=org.jboss.util.propertyeditor.BigDecimalEditor
+ java.lang.Boolean=org.jboss.util.propertyeditor.BooleanEditor
+ java.lang.Class=org.jboss.util.propertyeditor.ClassEditor
+ java.util.Date=org.jboss.util.propertyeditor.DateEditor
+ java.io.File=org.jboss.util.propertyeditor.FileEditor
+ java.net.InetAddress=org.jboss.util.propertyeditor.InetAddressEditor
+ java.lang.Integer=org.jboss.util.propertyeditor.IntegerEditor
+ javax.management.ObjectName=org.jboss.util.propertyeditor.ObjectNameEditor
+ java.util.Properties=org.jboss.util.propertyeditor.PropertiesEditor
+ [Ljava.lang.String;=org.jboss.util.propertyeditor.StringArrayEditor
+ java.net.URL=org.jboss.util.propertyeditor.URLEditor
+ </attribute>
+ </mbean>
+ <mbean code="org.jboss.varia.property.SystemPropertiesService"
+ name="jboss:type=Service,name=SystemProperties">
+ <!-- The invokerServletPath property gives the public URL to the
+ org.jboss.invocation.http.servlet.InvokerServlet used by the
+ HTTP proxy for RMI/HTTP. This is only needed if the http-invoker.sar
+ is deployed.
+ -->
+ <attribute name="Properties">
+ invokerServletPath=http://localhost:8080/invoker/JMXInvokerServlet
+ </attribute>
+ <!-- Load properties from each of the given comma seperated URLs
+ <attribute name="URLList">
+ http://somehost/some-location.properties,
+ ./conf/somelocal.properties
+ </attribute>
+ -->
+ </mbean>
+
+ <!-- ==================================================================== -->
+ <!-- Log4j Initialization -->
+ <!-- ==================================================================== -->
+ <mbean code="org.jboss.logging.Log4jService"
+ name="jboss.system:type=Log4jService,service=Logging">
+ <attribute name="ConfigurationURL">resource:log4j.xml</attribute>
+ </mbean>
+
+ <!-- ==================================================================== -->
+ <!-- Class Loading -->
+ <!-- ==================================================================== -->
+
+ <mbean code="org.jboss.web.WebService"
+ name="jboss:service=Webserver">
+ <attribute name="Port">8083</attribute>
+ <!-- Should resources and non-EJB classes be downloadable -->
+ <attribute name="DownloadServerClasses">true</attribute>
+ </mbean>
+
+ <!-- ==================================================================== -->
+ <!-- JSR-77 Single JBoss Server Management Domain -->
+ <!-- ==================================================================== -->
+
+ <mbean code="org.jboss.management.j2ee.SingleJBossServerManagement"
+ name="jboss.management.single:j2eeType=J2EEDomain,name=Manager" >
+ </mbean>
+
+ <!-- ==================================================================== -->
+ <!-- JNDI -->
+ <!-- ==================================================================== -->
+
+ <mbean code="org.jboss.naming.NamingService"
+ name="jboss:service=Naming">
+ <!-- The listening port for the bootstrap JNP service. Set this to -1
+ to run the NamingService without the JNP invoker listening port.
+ -->
+ <attribute name="Port">1099</attribute>
+ </mbean>
+ <mbean code="org.jboss.naming.JNDIView"
+ name="jboss:service=JNDIView"/>
+
+ <!-- ==================================================================== -->
+ <!-- Security -->
+ <!-- ==================================================================== -->
+
+ <mbean code="org.jboss.security.plugins.SecurityConfig"
+ name="jboss.security:name=SecurityConfig">
+ <attribute name="LoginConfig">jboss.security:service=XMLLoginConfig</attribute>
+ </mbean>
+ <mbean code="org.jboss.security.auth.login.XMLLoginConfig"
+ name="jboss.security:service=XMLLoginConfig">
+ <attribute name="ConfigResource">login-config.xml</attribute>
+ </mbean>
+
+ <!-- JAAS security manager and realm mapping -->
+ <mbean code="org.jboss.security.plugins.JaasSecurityManagerService"
+ name="jboss.security:service=JaasSecurityManager">
+ <attribute name="SecurityManagerClassName">
+ org.jboss.security.plugins.JaasSecurityManager
+ </attribute>
+ </mbean>
+
+ <!-- ==================================================================== -->
+ <!-- Transactions -->
+ <!-- ==================================================================== -->
+
+ <mbean code="org.jboss.tm.XidFactory"
+ name="jboss:service=XidFactory">
+ </mbean>
+
+ <mbean code="org.jboss.tm.TransactionManagerService"
+ name="jboss:service=TransactionManager">
+ <attribute name="TransactionTimeout">300</attribute>
+ <depends optional-attribute-name="XidFactory">jboss:service=XidFactory</depends>
+ </mbean>
+
+ <!--
+ | Uncomment to use Tyrex (tyrex.exolab.org) transaction manager plugin
+ | instead of the org.jboss.tm.TransactionManagerService and comment out
+ | the TransactionManagerService above.
+ | Make sure you have Xerces in lib/. At the moment JBoss does not
+ | ship Xerces as part of distribution. Version 1.x seems to work fine,
+ | though 2.x should as well, use whichever you like.
+ |
+ <mbean code="org.jboss.tm.plugins.tyrex.TransactionManagerService"
+ name="jboss:service=TransactionManager">
+ <attribute name="ConfigFileName">../conf/default/domain.xml</attribute>
+ </mbean>
+ -->
+
+ <mbean code="org.jboss.tm.usertx.server.ClientUserTransactionService"
+ name="jboss:service=ClientUserTransaction">
+ </mbean>
+
+ <!-- The CachedConnectionManager is used partly to relay started UserTransactions to
+ open connections so they may be enrolled in the new tx-->
+ <mbean code="org.jboss.resource.connectionmanager.CachedConnectionManager" name="jboss.jca:service=CachedConnectionManager">
+ </mbean>
+
+
+ <!-- ==================================================================== -->
+ <!-- The deployers... -->
+ <!-- ==================================================================== -->
+
+ <!-- Main Deployer and SARDeployer are provided by main -->
+
+ <!-- EJB deployer, remove to disable EJB behavior-->
+ <mbean code="org.jboss.ejb.EJBDeployer" name="jboss.ejb:service=EJBDeployer">
+ <attribute name="VerifyDeployments">true</attribute>
+ <attribute name="ValidateDTDs">false</attribute>
+ <attribute name="MetricsEnabled">false</attribute>
+ <attribute name="VerifierVerbose">true</attribute>
+ <!-- Add a dependency on the JMS provider(jms-service.xml) for MDBs. If
+ you are not using MDBs and JMS remove these.
+ -->
+ <depends>jboss.mq:service=JMSProviderLoader,name=JBossMQProvider</depends>
+ <depends>jboss.mq:service=ServerSessionPoolMBean,name=StdJMSPool</depends>
+ </mbean>
+
+ <!-- EAR deployer -->
+ <mbean code="org.jboss.deployment.EARDeployer" name="jboss.j2ee:service=EARDeployer">
+ </mbean>
+
+ <!-- WAR Deployer is provided by tomcat or jetty -->
+ <!-- RAR Deployer is provided by the rar.sar package -->
+
+
+ <!-- ==================================================================== -->
+ <!-- JBoss Server Management -->
+ <!-- ==================================================================== -->
+
+ <!-- AS Temporary not available
+ <mbean code="org.jboss.management.ServerDataCollector"
+ name="jboss.management:service=Collector">
+ <attribute name="RefreshSleep">5000</attribute>
+ </mbean>
+ -->
+
+ <!-- ==================================================================== -->
+ <!-- Monitoring and Management -->
+ <!-- ==================================================================== -->
+
+ <!-- Uncomment to enable JMX monitoring of the bean cache
+ <mbean code="org.jboss.monitor.BeanCacheMonitor"
+ name="jboss.monitor:name=BeanCacheMonitor"/>
+ -->
+
+ <!-- Uncomment to enable JMX monitoring of the entity bean locking
+ <mbean code="org.jboss.monitor.EntityLockMonitor"
+ name="jboss.monitor:name=EntityLockMonitor"/>
+ -->
+
+
+
+ <!-- ==================================================================== -->
+ <!-- Invokers to the JMX node -->
+ <!-- ==================================================================== -->
+
+ <!-- RMI/JRMP invoker -->
+ <mbean code="org.jboss.invocation.jrmp.server.JRMPInvoker"
+ name="jboss:service=invoker,type=jrmp">
+ <attribute name="RMIObjectPort">4444</attribute>
+ <!--
+ <attribute name="RMIClientSocketFactory">custom</attribute>
+ <attribute name="RMIServerSocketFactory">custom</attribute>
+ <attribute name="RMIServerSocketAddr">custom</attribute>
+ -->
+ </mbean>
+
+ <mbean code="org.jboss.invocation.pooled.server.PooledInvoker"
+ name="jboss:service=invoker,type=pooled">
+ </mbean>
+
+ <mbean code="org.jboss.invocation.local.LocalInvoker"
+ name="jboss:service=invoker,type=local">
+ </mbean>
+
+ <!-- ==================================================================== -->
+ <!-- Deployment Scanning -->
+ <!-- ==================================================================== -->
+
+ <!-- Uncomment to enable caching of deployment units
+ <mbean code="org.jboss.deployment.cache.FileDeploymentStore"
+ name="jboss.deployment:type=DeploymentStore,flavor=File">
+ <attribute name="DirectoryName">data/deployment-cache</attribute>
+ </mbean>
+
+ <mbean code="org.jboss.deployment.cache.DeploymentCache"
+ name="jboss.deployment:type=DeploymentCache">
+ <depends optional-attribute-name="Deployer">jboss.system:service=MainDeployer</depends>
+ <depends optional-attribute-name="Store">jboss.deployment:type=DeploymentStore,flavor=File</depends>
+ </mbean>
+ -->
+
+ <!-- An mbean for hot deployment/undeployment of archives.
+ -->
+ <mbean code="org.jboss.deployment.scanner.URLDeploymentScanner"
+ name="jboss.deployment:type=DeploymentScanner,flavor=URL">
+
+ <!-- Uncomment (and comment/remove version below) to enable usage of the
+ DeploymentCache
+ <depends optional-attribute-name="Deployer">jboss.deployment:type=DeploymentCache</depends>
+ -->
+ <depends optional-attribute-name="Deployer">jboss.system:service=MainDeployer</depends>
+
+ <!-- The URLComparator can be used to specify a deployment ordering
+ for deployments found in a scanned directory. The class specified
+ must be an implementation of java.util.Comparator, it must be able
+ to compare two URL objects, and it must have a no-arg constructor.
+ Two deployment comparators are shipped with JBoss:
+ - org.jboss.deployment.DeploymentSorter
+ Sorts by file extension, as follows:
+ "sar", "service.xml", "rar", "jar", "war", "wsr", "ear", "zip",
+ "*"
+ - org.jboss.deployment.scanner.PrefixDeploymentSorter
+ If the name portion of the url begins with 1 or more digits, those
+ digits are converted to an int (ignoring leading zeroes), and
+ files are deployed in that order. Files that do not start with
+ any digits will be deployed first, and they will be sorted by
+ extension as above with DeploymentSorter.
+ -->
+ <attribute name="URLComparator">org.jboss.deployment.DeploymentSorter</attribute>
+ <!--
+ <attribute name="URLComparator">org.jboss.deployment.scanner.PrefixDeploymentSorter</attribute>
+ -->
+
+ <!-- The Filter specifies a java.io.FileFilter for scanned
+ directories. Any file not accepted by this filter will not be
+ deployed. The org.jboss.deployment.scanner.DeploymentFilter
+ rejects the following patterns:
+ "#*", "%*", ",*", ".*", "_$*", "*#", "*$", "*%", "*.BAK",
+ "*.old", "*.orig", "*.rej", "*.bak", "*,v", "*~", ".make.state",
+ ".nse_depinfo", "CVS", "CVS.admin", "RCS", "RCSLOG", "SCCS",
+ "TAGS", "core", "tags"
+ -->
+ <attribute name="Filter">org.jboss.deployment.scanner.DeploymentFilter</attribute>
+
+ <attribute name="ScanPeriod">5000</attribute>
+
+ <!-- URLs are comma seperated and unprefixed arguments are considered
+ file URLs and resolve relative to server home(JBOSS_DIST/server/default)
+ unless the given path is absolute. Any referenced directories cannot
+ be unpackaged archives, use the parent directory of the unpacked
+ archive.
+ -->
+ <attribute name="URLs">
+ ./deploy
+ </attribute>
+ </mbean>
+
+ <!-- An alternate hot deployer mbean. Use URLDirectoryScanner if you need to
+ specify which urls are directories to scan, and which are urls to be
+ deployed directly. URLDeploymentScanner assumes that all directories are to
+ be scanned, which can cause problems if directory referred to in the
+ deploy attribute is an exploded archive.
+ <mbean code="org.jboss.deployment.scanner.URLDirectoryScanner"
+ name="jboss.deployment:type=DeploymentScanner,flavor=URL">
+
+ <depends optional-attribute-name="Deployer">jboss.system:service=MainDeployer</depends>
+ <attribute name="URLComparator">org.jboss.deployment.DeploymentSorter</attribute>
+ <attribute name="Filter">org.jboss.deployment.scanner.DeploymentFilter</attribute>
+ <attribute name="ScanPeriod">5000</attribute>
+ /* Each entry specifies either a dir (directory to be scanned),
+ or url (url to be deployed). Like the URLs for the DeploymentScanner
+ above, a file: protocol will be assumed if not specified otherwise.
+ */
+ <attribute name="URLs">
+ <urls>
+ <dir name="./deploy" />
+ <url name="./deploy/examples/myapp.ear" />
+ <dir name="./deploy/examples" />
+ <url name="http://www.test.com/samples/myapp.ear" />
+ </urls>
+ </attribute>
+ </mbean>
+ -->
+
+</server>
diff --git a/3.0.4/config/jboss/conf/jbossmq-state.xml b/3.0.4/config/jboss/conf/jbossmq-state.xml
new file mode 100644
index 0000000..113ec64
--- /dev/null
+++ b/3.0.4/config/jboss/conf/jbossmq-state.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<StateManager>
+ <Users>
+ <User>
+ <Name>john</Name>
+ <Password>needle</Password>
+ <Id>DurableSubscriberExample</Id>
+ </User>
+ <User>
+ <Name>guest</Name>
+ <Password>guest</Password>
+ </User>
+ <User>
+ <Name>nobody</Name>
+ <Password>nobody</Password>
+ </User>
+ <User>
+ <Name>dynsub</Name>
+ <Password>dynsub</Password>
+ </User>
+ </Users>
+ <Roles>
+ <Role name="guest">
+ <UserName>guest</UserName>
+ <UserName>john</UserName>
+ </Role>
+ <Role name="subscriber">
+ <UserName>john</UserName>
+ </Role>
+ <Role name="publisher">
+ <UserName>john</UserName>
+ <UserName>dynsub</UserName>
+ </Role>
+ <Role name="durpublisher">
+ <UserName>john</UserName>
+ <UserName>dynsub</UserName>
+ </Role>
+ <Role name="noacc">
+ <UserName>nobody</UserName>
+ </Role>
+ </Roles>
+ <DurableSubscriptions>
+ </DurableSubscriptions>
+</StateManager>
diff --git a/3.0.4/config/jboss/conf/jndi.properties b/3.0.4/config/jboss/conf/jndi.properties
new file mode 100644
index 0000000..c59f571
--- /dev/null
+++ b/3.0.4/config/jboss/conf/jndi.properties
@@ -0,0 +1,5 @@
+java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
+java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
+# Do NOT uncomment this line as it causes in VM calls to go over
+# RMI!
+#java.naming.provider.url=localhost
diff --git a/3.0.4/config/jboss/conf/log4j.xml b/3.0.4/config/jboss/conf/log4j.xml
new file mode 100644
index 0000000..000fa62
--- /dev/null
+++ b/3.0.4/config/jboss/conf/log4j.xml
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<!-- ===================================================================== -->
+<!-- -->
+<!-- Log4j Configuration -->
+<!-- -->
+<!-- ===================================================================== -->
+
+<!-- $Id$ -->
+
+<!--
+ | For more configuration infromation and examples see the Jakarta Log4j
+ | owebsite: http://jakarta.apache.org/log4j
+ -->
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
+
+ <!-- ================================= -->
+ <!-- Preserve messages in a local file -->
+ <!-- ================================= -->
+
+ <!-- A time/date based rolling appender -->
+ <appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender">
+ <param name="File" value="${jboss.server.home.dir}/log/server.log"/>
+ <param name="Append" value="false"/>
+ <param name="Threshold" value="INFO"/>
+
+ <!-- Rollover at midnight each day -->
+ <param name="DatePattern" value="'.'yyyy-MM-dd"/>
+
+ <!-- Rollover at the top of each hour
+ <param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>
+ -->
+
+ <layout class="org.apache.log4j.PatternLayout">
+ <!-- The default pattern: Date Priority [Category] Message\n -->
+ <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
+
+ <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n
+ <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
+ -->
+ </layout>
+ </appender>
+
+ <!-- A size based file rolling appender
+ <appender name="FILE" class="org.jboss.logging.appender.RollingFileAppender">
+ <param name="File" value="${jboss.server.home.dir}/log/server.log"/>
+ <param name="Append" value="false"/>
+ <param name="MaxFileSize" value="500KB"/>
+ <param name="MaxBackupIndex" value="1"/>
+
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
+ </layout>
+ </appender>
+ -->
+
+ <!-- ============================== -->
+ <!-- Append messages to the console -->
+ <!-- ============================== -->
+
+ <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+ <param name="Threshold" value="INFO"/>
+ <param name="Target" value="System.out"/>
+
+ <layout class="org.apache.log4j.PatternLayout">
+ <!-- The default pattern: Date Priority [Category] Message\n -->
+ <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
+ </layout>
+ </appender>
+
+
+ <!-- ====================== -->
+ <!-- More Appender examples -->
+ <!-- ====================== -->
+
+ <!-- Buffer events and log them asynchronously
+ <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
+ <appender-ref ref="FILE"/>
+ <appender-ref ref="CONSOLE"/>
+ <appender-ref ref="SMTP"/>
+ </appender>
+ -->
+
+ <!-- EMail events to an administrator
+ <appender name="SMTP" class="org.apache.log4j.net.SMTPAppender">
+ <param name="Threshold" value="ERROR"/>
+ <param name="To" value="admin@myhost.domain.com"/>
+ <param name="From" value="nobody@myhost.domain.com"/>
+ <param name="Subject" value="JBoss Sever Errors"/>
+ <param name="SMTPHost" value="localhost"/>
+ <param name="BufferSize" value="10"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="[%d{ABSOLUTE},%c{1}] %m%n"/>
+ </layout>
+ </appender>
+ -->
+
+ <!-- Syslog events
+ <appender name="SYSLOG" class="org.apache.log4j.net.SyslogAppender">
+ <param name="Facility" value="LOCAL7"/>
+ <param name="FacilityPrinting" value="true"/>
+ <param name="SyslogHost" value="localhost"/>
+ </appender>
+ -->
+
+ <!-- Log events to JMS (requires a topic to be created)
+ <appender name="JMS" class="org.apache.log4j.net.JMSAppender">
+ <param name="Threshold" value="ERROR"/>
+ <param name="TopicConnectionFactoryBindingName" value="java:/ConnectionFactory"/>
+ <param name="TopicBindingName" value="topic/MyErrorsTopic"/>
+ </appender>
+ -->
+
+ <!-- ================ -->
+ <!-- Limit categories -->
+ <!-- ================ -->
+
+ <!-- Limit JBoss categories to INFO
+ <category name="org.jboss">
+ <priority value="INFO"/>
+ </category>
+ -->
+
+ <!-- Increase the priority threshold for the DefaultDS category
+ <category name="DefaultDS">
+ <priority value="FATAL"/>
+ </category>
+ -->
+
+ <!-- Decrease the priority threshold for the org.jboss.varia category
+ <category name="org.jboss.varia">
+ <priority value="DEBUG"/>
+ </category>
+ -->
+
+ <category name="org.apache.tapestry">
+ <priority value="ERROR"/>
+ </category>
+
+
+ <!--
+ | An example of enabling the custom TRACE level priority that is used
+ | by the JBoss internals to diagnose low level details. This example
+ | turns on TRACE level msgs for the org.jboss.ejb.plugins package and its
+ | subpackages. This will produce A LOT of logging output.
+ If you use replace the log4j 1.2 jar with a 1.1.3 jar you will need to
+ change this from XLevel to XPriority.
+ <category name="org.jboss.system">
+ <priority value="TRACE" class="org.jboss.logging.XLevel"/>
+ </category>
+ <category name="org.jboss.ejb.plugins">
+ <priority value="TRACE" class="org.jboss.logging.XLevel"/>
+ </category>
+ -->
+
+ <!-- ======================= -->
+ <!-- Setup the Root category -->
+ <!-- ======================= -->
+
+ <root>
+ <appender-ref ref="CONSOLE"/>
+ <appender-ref ref="FILE"/>
+ </root>
+
+ <!-- Clustering logging -->
+ <!-- Uncomment the following to redirect the org.javagroups and
+ org.jboss.ha categories to a cluster.log file.
+
+ <appender name="CLUSTER" class="org.jboss.logging.appender.RollingFileAppender">
+ <param name="File" value="${jboss.server.home.dir}/log/cluster.log"/>
+ <param name="Append" value="false"/>
+ <param name="MaxFileSize" value="500KB"/>
+ <param name="MaxBackupIndex" value="1"/>
+
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
+ </layout>
+ </appender>
+ <category name="org.javagroups">
+ <priority value="DEBUG" />
+ <appender-ref ref="CLUSTER"/>
+ </category>
+ <category name="org.jboss.ha">
+ <priority value="DEBUG" />
+ <appender-ref ref="CLUSTER"/>
+ </category>
+ -->
+
+</log4j:configuration>
diff --git a/3.0.4/config/jboss/conf/login-config.xml b/3.0.4/config/jboss/conf/login-config.xml
new file mode 100644
index 0000000..7760d26
--- /dev/null
+++ b/3.0.4/config/jboss/conf/login-config.xml
@@ -0,0 +1,122 @@
+<?xml version='1.0'?>
+<!DOCTYPE policy PUBLIC
+ "-//JBoss//DTD JBOSS Security Config 3.0//EN"
+ "http://www.jboss.org/j2ee/dtd/security_config.dtd">
+
+<!-- The XML based JAAS login configuration read by the
+org.jboss.security.auth.login.XMLLoginConfig mbean. Add
+an application-policy element for each security domain.
+
+The outline of the application-policy is:
+<application-policy name="security-domain-name">
+ <authentication>
+ <login-module code="login.module1.class.name" flag="control_flag">
+ <module-option name = "option1-name">option1-value</module-option>
+ <module-option name = "option2-name">option2-value</module-option>
+ ...
+ </login-module>
+
+ <login-module code="login.module2.class.name" flag="control_flag">
+ ...
+ </login-module>
+ ...
+ </authentication>
+</application-policy>
+
+$Revision$
+-->
+
+<policy>
+ <!-- Used by clients within the application server VM such as
+ mbeans and servlets that access EJBs.
+ -->
+ <application-policy name = "client-login">
+ <authentication>
+ <login-module code = "org.jboss.security.ClientLoginModule"
+ flag = "required">
+ </login-module>
+ </authentication>
+ </application-policy>
+
+ <!-- Security domain for JBossMQ -->
+ <application-policy name = "jbossmq">
+ <authentication>
+ <login-module code = "org.jboss.mq.sm.file.DynamicLoginModule"
+ flag = "required">
+ <module-option name = "unauthenticatedIdentity">guest</module-option>
+ <module-option name = "sm.objectname">jboss.mq:service=StateManager</module-option>
+ </login-module>
+ </authentication>
+ </application-policy>
+
+ <!-- Security domains for testing new jca framework -->
+ <application-policy name = "HsqlDbRealm">
+ <authentication>
+ <login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule"
+ flag = "required">
+ <module-option name = "principal">sa</module-option>
+ <module-option name = "userName">sa</module-option>
+ <module-option name = "password"></module-option>
+ <module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=hsqldbDS</module-option>
+ </login-module>
+ </authentication>
+ </application-policy>
+
+ <application-policy name = "FirebirdDBRealm">
+ <authentication>
+ <login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule"
+ flag = "required">
+ <module-option name = "principal">sysdba</module-option>
+ <module-option name = "userName">sysdba</module-option>
+ <module-option name = "password">masterkey</module-option>
+ <module-option name = "managedConnectionFactoryName">jboss.jca:service=XaTxCM,name=FirebirdDS</module-option>
+ </login-module>
+ </authentication>
+ </application-policy>
+
+ <application-policy name = "JmsXARealm">
+ <authentication>
+ <login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule"
+ flag = "required">
+ <module-option name = "principal">guest</module-option>
+ <module-option name = "userName">guest</module-option>
+ <module-option name = "password">guest</module-option>
+ <module-option name = "managedConnectionFactoryName">jboss.jca:service=XaTxCM,name=jmsra</module-option>
+ </login-module>
+ </authentication>
+ </application-policy>
+
+ <!-- A template configuration for the jmx-console web application. This
+ defaults to the UsersRolesLoginModule the same as other and should be
+ changed to a stronger authentication mechanism as required.
+ -->
+ <application-policy name = "jmx-console">
+ <authentication>
+ <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
+ flag = "required" />
+ </authentication>
+ </application-policy>
+
+ <!-- The default login configuration used by any security domain that
+ does not have a application-policy entry with a matching name
+ -->
+ <application-policy name = "other">
+ <!-- A simple server login module, which can be used when the number
+ of users is relatively small. It uses two properties files:
+ users.properties, which holds users (key) and their password (value).
+ roles.properties, which holds users (key) and a comma-separated list of
+ their roles (value).
+ The unauthenticatedIdentity property defines the name of the principal
+ that will be used when a null username and password are presented as is
+ the case for an unuathenticated web client or MDB. If you want to
+ allow such users to be authenticated add the property, e.g.,
+ unauthenticatedIdentity="nobody"
+ -->
+ <authentication>
+ <login-module code = "org.jboss.security.auth.spi.UsersRolesLoginModule"
+ flag = "required" />
+ </authentication>
+ </application-policy>
+
+</policy>
+
diff --git a/3.0.4/config/jboss/conf/server.policy b/3.0.4/config/jboss/conf/server.policy
new file mode 100644
index 0000000..da69056
--- /dev/null
+++ b/3.0.4/config/jboss/conf/server.policy
@@ -0,0 +1,12 @@
+/// ====================================================================== ///
+// //
+// JBoss Security Policy //
+// //
+/// ====================================================================== ///
+
+// $Id$
+
+grant {
+ // Allow everything for now
+ permission java.security.AllPermission;
+};
diff --git a/3.0.4/config/jboss/conf/standardjaws.xml b/3.0.4/config/jboss/conf/standardjaws.xml
new file mode 100644
index 0000000..f9deeb4
--- /dev/null
+++ b/3.0.4/config/jboss/conf/standardjaws.xml
@@ -0,0 +1,1267 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE jbosscmp-jdbc PUBLIC
+ "-//JBoss//DTD JBOSSCMP-JDBC 3.0//EN"
+ "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_3_0.dtd">
+
+<!-- ===================================================================== -->
+<!-- -->
+<!-- Standard Jaws Configuration -->
+<!-- -->
+<!-- ===================================================================== -->
+
+<!-- $Id$ -->
+
+<jaws>
+ <datasource>java:/DefaultDS</datasource>
+ <type-mapping>Hypersonic SQL</type-mapping>
+ <debug>false</debug>
+
+ <default-entity>
+ <create-table>true</create-table>
+ <remove-table>false</remove-table>
+ <tuned-updates>true</tuned-updates>
+ <read-only>false</read-only>
+ <time-out>300</time-out>
+ <row-locking>false</row-locking>
+ <read-ahead>false</read-ahead>
+ </default-entity>
+
+ <type-mappings>
+ <type-mapping-definition>
+ <name>InterBase</name>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>NUMERIC(18,0)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE PRECISION</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(64)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>VARCHAR(2000)</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>DB2</name>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <!-- DB2 does not appear to support columns of type "byte"
+ Regrettably, this means they'll be serialized.
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR(1) FOR BIT DATA</sql-type>
+ </mapping>
+ -->
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>BIGINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>REAL</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(254)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>BLOB(2000)</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>Oracle8</name>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>NUMBER(1)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>NUMBER(3)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>NUMBER(5)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>NUMBER(10)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>NUMBER(19)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>NUMBER(38,7)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>DECIMAL</jdbc-type>
+ <sql-type>NUMBER(38,15)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>NUMBER(38,15)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR2(255)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>BLOB</jdbc-type>
+ <sql-type>BLOB</sql-type>
+ <!-- Change this from BLOB to RAW(255) if you know your
+ serialized object will be <= 255 bytes -->
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>Oracle7</name>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>NUMBER(1)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>NUMBER(3)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>NUMBER(5)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>NUMBER(10)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>NUMBER(19)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>NUMBER(38,7)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>NUMBER(38,15)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR2(255)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>LONG RAW</sql-type>
+ <!-- Change this from LONG RAW to RAW(255) if you know your
+ serialized object will be <= 255 bytes -->
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>Sybase</name>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BIT</sql-type>
+ </mapping>
+ <!-- Current Sybase JDBC drivers (jConnect 5.2) don't support
+ byte or short. Unfortunately they'll be serialized.
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>TINYINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ -->
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>NUMERIC(38,0)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>REAL</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE PRECISION</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(255)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>SMALLDATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>IMAGE</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>PostgreSQL</name>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>BOOLEAN</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>INT2</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>INT2</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INT4</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>INT8</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT(7)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>FLOAT8</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR(1)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>TEXT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>OID</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>PostgreSQL 7.2</name>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>BOOLEAN</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>INT2</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>INT2</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INT4</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>INT8</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT(7)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>FLOAT8</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR(1)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>TEXT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>OID</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>Hypersonic SQL</name>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BIT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>OBJECT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>REAL</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>BIGINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>PointBase</name>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BINARY</jdbc-type>
+ <sql-type>BOOLEAN</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>BLOB</jdbc-type>
+ <sql-type>BLOB</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>SOLID</name>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>TINYINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>BLOB</jdbc-type>
+ <sql-type>BLOB</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BIT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>BIGINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>mySQL</name>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>TINYINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>BLOB</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>TINYINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>BIGINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(255) BINARY</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>BIGINT</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>MS SQLSERVER</name>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>DECIMAL</jdbc-type>
+ <sql-type>DECIMAL(20)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>IMAGE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>TINYINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BIT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>MS SQLSERVER2000</name>
+
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>BIGINT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>IMAGE</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>TINYINT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BIT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>REAL</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>DB2/400</name>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR(1)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+ <!-- Apparent DB2/400 doesn't handle Byte type either
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR(1) FOR BIT DATA</sql-type>
+ </mapping>
+ -->
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR(5)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>VARCHAR(4096) FOR BIT DATA</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>SapDB</name>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>LONG BYTE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>CHAR BYTE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BOOLEAN</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE PRECISION</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>DECIMAL</jdbc-type>
+ <sql-type>DECIMAL(20)</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+ <type-mapping-definition>
+ <name>Cloudscape</name>
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>LONGVARCHAR</jdbc-type>
+ <sql-type>LONG VARCHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BOOLEAN</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>TINYINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>LONGINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>REAL</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE PRECISION</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>LONGVARCHAR</jdbc-type>
+ <sql-type>LONG VARCHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>LONG VARBINARY</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+
+ <type-mapping-definition>
+ <name>InformixDB</name>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR(1)</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(255,0)</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>DECIMAL</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>NUMERIC(18,0)</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE PRECISION</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATETIME YEAR TO FRACTION(3)</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>BYTE</sql-type>
+ </mapping>
+ </type-mapping-definition>
+
+ </type-mappings>
+</jaws>
diff --git a/3.0.4/config/jboss/conf/standardjboss.xml b/3.0.4/config/jboss/conf/standardjboss.xml
new file mode 100644
index 0000000..fdd3fc1
--- /dev/null
+++ b/3.0.4/config/jboss/conf/standardjboss.xml
@@ -0,0 +1,992 @@
+<?xml version = "1.0" encoding = "UTF-8"?>
+
+<!-- ===================================================================== -->
+<!-- -->
+<!-- Standard JBoss Configuration -->
+<!-- -->
+<!-- ===================================================================== -->
+
+<!-- $Id$ -->
+<jboss>
+ <enforce-ejb-restrictions>false</enforce-ejb-restrictions>
+ <container-configurations>
+ <container-configuration>
+ <container-name>Standard CMP 2.x EntityBean</container-name>
+ <sync-on-commit-only>false</sync-on-commit-only>
+ <call-logging>false</call-logging>
+ <container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+ <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.cmp.jdbc.JDBCRelationInterceptor</interceptor>
+ </container-interceptors>
+ <client-interceptors>
+ <home>
+ <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </home>
+ <bean>
+ <interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </bean>
+ <list-entity>
+ <interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </list-entity>
+ </client-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+ <instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ <commit-option>B</commit-option>
+ </container-configuration>
+ <container-configuration>
+ <container-name>Instance Per Transaction CMP 2.x EntityBean</container-name>
+ <call-logging>false</call-logging>
+ <sync-on-commit-only>false</sync-on-commit-only>
+ <container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityMultiInstanceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+ <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityMultiInstanceSynchronizationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.cmp.jdbc.JDBCRelationInterceptor</interceptor>
+ </container-interceptors>
+ <client-interceptors>
+ <home>
+ <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </home>
+ <bean>
+ <interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </bean>
+ <list-entity>
+ <interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </list-entity>
+ </client-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+ <instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <locking-policy>org.jboss.ejb.plugins.lock.NoLock</locking-policy>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ <commit-option>B</commit-option>
+ </container-configuration>
+ <container-configuration>
+ <container-name>Standard CMP EntityBean</container-name>
+ <call-logging>false</call-logging>
+ <sync-on-commit-only>false</sync-on-commit-only>
+ <container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+ <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+ </container-interceptors>
+ <client-interceptors>
+ <home>
+ <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </home>
+ <bean>
+ <interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </bean>
+ <list-entity>
+ <interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </list-entity>
+ </client-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+ <instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.jaws.JAWSPersistenceManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ <commit-option>A</commit-option>
+ </container-configuration>
+ <container-configuration>
+ <container-name>Instance Per Transaction CMP EntityBean</container-name>
+ <call-logging>false</call-logging>
+ <sync-on-commit-only>false</sync-on-commit-only>
+ <container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityMultiInstanceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+ <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityMultiInstanceSynchronizationInterceptor</interceptor>
+ </container-interceptors>
+ <client-interceptors>
+ <home>
+ <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </home>
+ <bean>
+ <interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </bean>
+ <list-entity>
+ <interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </list-entity>
+ </client-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+ <instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.jaws.JAWSPersistenceManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <locking-policy>org.jboss.ejb.plugins.lock.NoLock</locking-policy>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ <commit-option>A</commit-option>
+ </container-configuration>
+ <container-configuration>
+ <container-name>Clustered CMP 2.x EntityBean</container-name>
+ <call-logging>false</call-logging>
+ <sync-on-commit-only>false</sync-on-commit-only>
+ <container-invoker>org.jboss.proxy.ejb.ProxyFactoryHA</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.CleanShutdownInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+ <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.cmp.jdbc.JDBCRelationInterceptor</interceptor>
+ </container-interceptors>
+ <client-interceptors>
+ <home>
+ <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </home>
+ <bean>
+ <interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </bean>
+ <list-entity>
+ <interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </list-entity>
+ </client-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+ <instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ <commit-option>B</commit-option>
+ </container-configuration>
+ <container-configuration>
+ <container-name>Clustered CMP EntityBean</container-name>
+ <call-logging>false</call-logging>
+ <sync-on-commit-only>false</sync-on-commit-only>
+ <container-invoker>org.jboss.proxy.ejb.ProxyFactoryHA</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.CleanShutdownInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+ <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+ </container-interceptors>
+ <client-interceptors>
+ <home>
+ <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </home>
+ <bean>
+ <interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </bean>
+ <list-entity>
+ <interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </list-entity>
+ </client-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+ <instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.jaws.JAWSPersistenceManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ <commit-option>B</commit-option>
+ </container-configuration>
+ <container-configuration>
+ <container-name>Standard Stateless SessionBean</container-name>
+ <call-logging>false</call-logging>
+ <container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <!-- CMT -->
+
+ <interceptor transaction = "Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor transaction = "Container" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor transaction = "Container">org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor</interceptor>
+ <!-- BMT -->
+
+ <interceptor transaction = "Bean">org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor</interceptor>
+ <interceptor transaction = "Bean">org.jboss.ejb.plugins.TxInterceptorBMT</interceptor>
+ <interceptor transaction = "Bean" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor> <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+ </container-interceptors>
+ <client-interceptors>
+ <home>
+ <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </home>
+ <bean>
+ <interceptor>org.jboss.proxy.ejb.StatelessSessionInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </bean>
+ </client-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.StatelessSessionInstancePool</instance-pool>
+ <instance-cache/>
+ <persistence-manager/>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ </container-configuration>
+ <container-configuration>
+ <container-name>Clustered Stateless SessionBean</container-name>
+ <call-logging>false</call-logging>
+ <container-invoker>org.jboss.proxy.ejb.ProxyFactoryHA</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.CleanShutdownInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <!-- CMT -->
+
+ <interceptor transaction = "Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor transaction = "Container" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor transaction = "Container">org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor</interceptor>
+ <!-- BMT -->
+
+ <interceptor transaction = "Bean">org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor</interceptor>
+ <interceptor transaction = "Bean">org.jboss.ejb.plugins.TxInterceptorBMT</interceptor>
+ <interceptor transaction = "Bean" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor> <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+ </container-interceptors>
+ <client-interceptors>
+ <home>
+ <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </home>
+ <bean>
+ <interceptor>org.jboss.proxy.ejb.StatelessSessionInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </bean>
+ </client-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.StatelessSessionInstancePool</instance-pool>
+ <instance-cache/>
+ <persistence-manager/>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ </container-configuration>
+ <container-configuration>
+ <container-name>Standard Stateful SessionBean</container-name>
+ <call-logging>false</call-logging>
+ <container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <!-- CMT -->
+
+ <interceptor transaction = "Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor transaction = "Container" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor transaction = "Container">org.jboss.ejb.plugins.StatefulSessionInstanceInterceptor</interceptor>
+ <!-- BMT -->
+
+ <interceptor transaction = "Bean">org.jboss.ejb.plugins.StatefulSessionInstanceInterceptor</interceptor>
+ <interceptor transaction = "Bean">org.jboss.ejb.plugins.TxInterceptorBMT</interceptor>
+ <interceptor transaction = "Bean" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor> <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ </container-interceptors>
+ <client-interceptors>
+ <home>
+ <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </home>
+ <bean>
+ <interceptor>org.jboss.proxy.ejb.StatefulSessionInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </bean>
+ </client-interceptors>
+ <instance-cache>org.jboss.ejb.plugins.StatefulSessionInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.StatefulSessionFilePersistenceManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUStatefulContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <remover-period>1800</remover-period>
+ <max-bean-life>1800</max-bean-life>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ </container-configuration>
+ <container-configuration>
+ <container-name>Clustered Stateful SessionBean</container-name>
+ <call-logging>false</call-logging>
+ <container-invoker>org.jboss.proxy.ejb.ProxyFactoryHA</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.CleanShutdownInterceptor</interceptor>
+ <!-- CMT -->
+
+ <interceptor transaction = "Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor transaction = "Container" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor transaction = "Container">org.jboss.ejb.plugins.StatefulSessionInstanceInterceptor</interceptor>
+ <!-- BMT -->
+
+ <interceptor transaction = "Bean">org.jboss.ejb.plugins.StatefulSessionInstanceInterceptor</interceptor>
+ <interceptor transaction = "Bean">org.jboss.ejb.plugins.TxInterceptorBMT</interceptor>
+ <interceptor transaction = "Bean" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor> <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.StatefulHASessionSynchronisationInterceptor</interceptor>
+ </container-interceptors>
+ <client-interceptors>
+ <home>
+ <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </home>
+ <bean>
+ <interceptor>org.jboss.proxy.ejb.StatefulSessionInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </bean>
+ </client-interceptors>
+ <instance-cache>org.jboss.ejb.plugins.StatefulSessionInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.StatefulHASessionPersistenceManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUStatefulContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <remover-period>1800</remover-period>
+ <max-bean-life>1800</max-bean-life>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ </container-configuration>
+ <container-configuration>
+ <container-name>Standard BMP EntityBean</container-name>
+ <call-logging>false</call-logging>
+ <sync-on-commit-only>false</sync-on-commit-only>
+ <container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+ <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+ </container-interceptors>
+ <client-interceptors>
+ <home>
+ <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </home>
+ <bean>
+ <interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </bean>
+ <list-entity>
+ <interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </list-entity>
+ </client-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+ <instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.BMPPersistenceManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ <commit-option>A</commit-option>
+ </container-configuration>
+ <container-configuration>
+ <container-name>Instance Per Transaction BMP EntityBean</container-name>
+ <call-logging>false</call-logging>
+ <sync-on-commit-only>false</sync-on-commit-only>
+ <container-invoker>org.jboss.proxy.ejb.ProxyFactory</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityMultiInstanceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+ <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityMultiInstanceSynchronizationInterceptor</interceptor>
+ </container-interceptors>
+ <client-interceptors>
+ <home>
+ <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </home>
+ <bean>
+ <interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </bean>
+ <list-entity>
+ <interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </list-entity>
+ </client-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+ <instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.BMPPersistenceManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <locking-policy>org.jboss.ejb.plugins.lock.NoLock</locking-policy>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ <commit-option>B</commit-option>
+ </container-configuration>
+ <container-configuration>
+ <container-name>Clustered BMP EntityBean</container-name>
+ <call-logging>false</call-logging>
+ <sync-on-commit-only>false</sync-on-commit-only>
+ <container-invoker>org.jboss.proxy.ejb.ProxyFactoryHA</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.CleanShutdownInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+ <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+ </container-interceptors>
+ <client-interceptors>
+ <home>
+ <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </home>
+ <bean>
+ <interceptor>org.jboss.proxy.ejb.EntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </bean>
+ <list-entity>
+ <interceptor>org.jboss.proxy.ejb.ListEntityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </list-entity>
+ </client-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+ <instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.BMPPersistenceManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ <commit-option>B</commit-option>
+ </container-configuration>
+ <container-configuration>
+ <container-name>Standard Message Driven Bean</container-name>
+ <call-logging>false</call-logging>
+ <container-invoker>org.jboss.ejb.plugins.jms.JMSContainerInvoker</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.RunAsSecurityInterceptor</interceptor>
+ <!-- CMT -->
+
+ <interceptor transaction = "Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor transaction = "Container" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor transaction = "Container">org.jboss.ejb.plugins.MessageDrivenInstanceInterceptor</interceptor>
+ <!-- BMT -->
+
+ <interceptor transaction = "Bean">org.jboss.ejb.plugins.MessageDrivenInstanceInterceptor</interceptor>
+ <interceptor transaction = "Bean">org.jboss.ejb.plugins.MessageDrivenTxInterceptorBMT</interceptor>
+ <interceptor transaction = "Bean" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor> <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>
+ </container-interceptors>
+ <client-interceptors>
+ <home>
+ <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </home>
+ <bean>
+ <interceptor>new org.jboss.proxy.ejb.StatelessSessionInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
+ <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
+ </bean>
+ </client-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.MessageDrivenInstancePool</instance-pool>
+ <instance-cache/>
+ <persistence-manager/>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <container-invoker-conf>
+ <JMSProviderAdapterJNDI>DefaultJMSProvider</JMSProviderAdapterJNDI>
+ <ServerSessionPoolFactoryJNDI>StdJMSPool</ServerSessionPoolFactoryJNDI>
+ <MaximumSize>15</MaximumSize>
+ <MaxMessages>1</MaxMessages>
+ <MDBConfig>
+ <ReconnectIntervalSec>10</ReconnectIntervalSec>
+ <DLQConfig>
+ <DestinationQueue>queue/DLQ</DestinationQueue>
+ <MaxTimesRedelivered>10</MaxTimesRedelivered>
+ <TimeToLive>0</TimeToLive>
+ </DLQConfig>
+ </MDBConfig>
+ </container-invoker-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ </container-configuration>
+ <container-configuration>
+ <container-name>IIOP CMP 2.x EntityBean</container-name>
+ <call-logging>false</call-logging>
+ <sync-on-commit-only>false</sync-on-commit-only>
+ <container-invoker>org.jboss.ejb.plugins.iiop.server.IIOPContainerInvoker</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.cmp.jdbc.JDBCRelationInterceptor</interceptor>
+ </container-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+ <instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <web-class-loader>org.jboss.iiop.WebCL</web-class-loader>
+ <locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ <commit-option>B</commit-option>
+ </container-configuration>
+ <container-configuration>
+ <container-name>IIOP CMP EntityBean</container-name>
+ <call-logging>false</call-logging>
+ <sync-on-commit-only>false</sync-on-commit-only>
+ <container-invoker>org.jboss.ejb.plugins.iiop.server.IIOPContainerInvoker</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+ </container-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+ <instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.jaws.JAWSPersistenceManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <web-class-loader>org.jboss.iiop.WebCL</web-class-loader>
+ <locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ <commit-option>A</commit-option>
+ </container-configuration>
+ <container-configuration>
+ <container-name>IIOP Stateless SessionBean</container-name>
+ <call-logging>false</call-logging>
+ <container-invoker>org.jboss.ejb.plugins.iiop.server.IIOPContainerInvoker</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <!-- CMT -->
+ <interceptor transaction = "Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor transaction = "Container" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor transaction = "Container">org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor</interceptor>
+ <!-- BMT -->
+ <interceptor transaction = "Bean">org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor</interceptor>
+ <interceptor transaction = "Bean">org.jboss.ejb.plugins.TxInterceptorBMT</interceptor>
+ <interceptor transaction = "Bean" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ </container-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.StatelessSessionInstancePool</instance-pool>
+ <instance-cache/>
+ <persistence-manager/>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <web-class-loader>org.jboss.iiop.WebCL</web-class-loader>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ </container-configuration>
+ <container-configuration>
+ <container-name>IIOP Stateful SessionBean</container-name>
+ <call-logging>false</call-logging>
+ <container-invoker>org.jboss.ejb.plugins.iiop.server.IIOPContainerInvoker</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <!-- CMT -->
+
+ <interceptor transaction = "Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor transaction = "Container" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor transaction = "Container">org.jboss.ejb.plugins.StatefulSessionInstanceInterceptor</interceptor>
+ <!-- BMT -->
+
+ <interceptor transaction = "Bean">org.jboss.ejb.plugins.StatefulSessionInstanceInterceptor</interceptor>
+ <interceptor transaction = "Bean">org.jboss.ejb.plugins.TxInterceptorBMT</interceptor>
+ <interceptor transaction = "Bean" metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ </container-interceptors>
+ <instance-cache>org.jboss.ejb.plugins.StatefulSessionInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.StatefulSessionFilePersistenceManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <web-class-loader>org.jboss.iiop.WebCL</web-class-loader>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUStatefulContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <remover-period>1800</remover-period>
+ <max-bean-life>1800</max-bean-life>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ </container-configuration>
+ <container-configuration>
+ <container-name>IIOP BMP EntityBean</container-name>
+ <call-logging>false</call-logging>
+ <sync-on-commit-only>false</sync-on-commit-only>
+ <container-invoker>org.jboss.ejb.plugins.iiop.server.IIOPContainerInvoker</container-invoker>
+ <container-interceptors>
+ <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.SecurityInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>
+ <interceptor metricsEnabled = "true">org.jboss.ejb.plugins.MetricsInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityCreationInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityLockInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityInstanceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntityReentranceInterceptor</interceptor>
+ <interceptor>org.jboss.ejb.plugins.EntitySynchronizationInterceptor</interceptor>
+ </container-interceptors>
+ <instance-pool>org.jboss.ejb.plugins.EntityInstancePool</instance-pool>
+ <instance-cache>org.jboss.ejb.plugins.EntityInstanceCache</instance-cache>
+ <persistence-manager>org.jboss.ejb.plugins.BMPPersistenceManager</persistence-manager>
+ <transaction-manager>org.jboss.tm.TxManager</transaction-manager>
+ <web-class-loader>org.jboss.iiop.WebCL</web-class-loader>
+ <locking-policy>org.jboss.ejb.plugins.lock.QueuedPessimisticEJBLock</locking-policy>
+ <container-cache-conf>
+ <cache-policy>org.jboss.ejb.plugins.LRUEnterpriseContextCachePolicy</cache-policy>
+ <cache-policy-conf>
+ <min-capacity>50</min-capacity>
+ <max-capacity>1000000</max-capacity>
+ <overager-period>300</overager-period>
+ <max-bean-age>600</max-bean-age>
+ <resizer-period>400</resizer-period>
+ <max-cache-miss-period>60</max-cache-miss-period>
+ <min-cache-miss-period>1</min-cache-miss-period>
+ <cache-load-factor>0.75</cache-load-factor>
+ </cache-policy-conf>
+ </container-cache-conf>
+ <container-pool-conf>
+ <MaximumSize>100</MaximumSize>
+ </container-pool-conf>
+ <commit-option>A</commit-option>
+ </container-configuration>
+ </container-configurations>
+</jboss>
diff --git a/3.0.4/config/jboss/conf/standardjbosscmp-jdbc.xml b/3.0.4/config/jboss/conf/standardjbosscmp-jdbc.xml
new file mode 100644
index 0000000..8bc80b7
--- /dev/null
+++ b/3.0.4/config/jboss/conf/standardjbosscmp-jdbc.xml
@@ -0,0 +1,2005 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE jbosscmp-jdbc>
+
+<!-- ===================================================================== -->
+<!-- -->
+<!-- Standard JBossCMP-JDBC Configuration -->
+<!-- -->
+<!-- ===================================================================== -->
+
+<!-- $Id$ -->
+
+<jbosscmp-jdbc>
+
+ <defaults>
+ <datasource>java:/DefaultDS</datasource>
+ <datasource-mapping>Hypersonic SQL</datasource-mapping>
+
+ <create-table>true</create-table>
+ <remove-table>false</remove-table>
+ <read-only>false</read-only>
+ <time-out>300</time-out>
+ <pk-constraint>true</pk-constraint>
+ <fk-constraint>false</fk-constraint>
+ <row-locking>false</row-locking>
+ <preferred-relation-mapping>foreign-key</preferred-relation-mapping>
+ <read-ahead>
+ <strategy>on-load</strategy>
+ <page-size>1000</page-size>
+ <eager-load-group>*</eager-load-group>
+ </read-ahead>
+ <list-cache-max>1000</list-cache-max>
+ </defaults>
+
+ <type-mappings>
+ <type-mapping>
+ <name>McKoi</name>
+ <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>TRUE</true-mapping>
+ <false-mapping>FALSE</false-mapping>
+
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BOOLEAN</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>BIGINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(64)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>JAVA_OBJECT</sql-type>
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>InterBase</name>
+ <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>NUMERIC(18,0)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE PRECISION</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(64)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>VARCHAR(2000)</sql-type>
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>DB2</name>
+ <row-locking-template/>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <!-- DB2 does not appear to support columns of type "byte"
+ Regrettably, this means they'll be serialized.
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR(1) FOR BIT DATA</sql-type>
+ </mapping>
+ -->
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>BIGINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>REAL</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(254)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>BLOB(2000)</sql-type>
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>Oracle9i</name>
+ <!--
+ | Make sure that you have the Oracle 9i version of classes12.jar
+ | or you will suffer
+ -->
+ <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>30</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <function-mapping>
+ <function-name>concat</function-name>
+ <function-sql>(?1 || ?2)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>substring</function-name>
+ <function-sql>substr(?1, ?2, ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>lcase</function-name>
+ <function-sql>lower(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>length</function-name>
+ <function-sql>length(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>locate</function-name>
+ <function-sql>instr(?2, ?1, ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>abs</function-name>
+ <function-sql>abs(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>sqrt</function-name>
+ <function-sql>sqrt(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>ucase</function-name>
+ <function-sql>upper(?1)</function-sql>
+ </function-mapping>
+
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>NUMBER(1)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>NUMBER(3)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>NUMBER(5)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>NUMBER(10)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>NUMBER(19)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>NUMBER(38,7)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>DECIMAL</jdbc-type>
+ <sql-type>NUMBER(38,15)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>NUMBER(38,15)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR2(255)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP(3)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP(9)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>BLOB</jdbc-type>
+ <sql-type>BLOB</sql-type>
+ <!--
+ | Change this from BLOB to RAW(n) if you know your
+ | serialized object will be <= n bytes and n <= 2000
+ -->
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>Oracle8</name>
+ <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>30</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <function-mapping>
+ <function-name>concat</function-name>
+ <function-sql>(?1 || ?2)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>substring</function-name>
+ <function-sql>substr(?1, ?2, ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>lcase</function-name>
+ <function-sql>lower(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>length</function-name>
+ <function-sql>length(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>locate</function-name>
+ <function-sql>instr(?2, ?1, ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>abs</function-name>
+ <function-sql>abs(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>sqrt</function-name>
+ <function-sql>sqrt(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>ucase</function-name>
+ <function-sql>upper(?1)</function-sql>
+ </function-mapping>
+
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>NUMBER(1)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>NUMBER(3)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>NUMBER(5)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>NUMBER(10)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>NUMBER(19)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>NUMBER(38,7)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>DECIMAL</jdbc-type>
+ <sql-type>NUMBER(38,15)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>NUMBER(38,15)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR2(255)</sql-type>
+ </mapping>
+ <mapping>
+ <!--
+ | Note that you lose granularity here
+ | Use a numeric type and store milliseconds if you really need it
+ -->
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <!--
+ | Note that you lose granularity here
+ | Use a numeric type and store milliseconds if you really need it
+ -->
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>BLOB</jdbc-type>
+ <sql-type>BLOB</sql-type>
+ <!--
+ | Change this from BLOB to RAW(n) if you know your
+ | serialized object will be <= n bytes and n <= 2000
+ -->
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>Oracle7</name>
+ <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>30</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <function-mapping>
+ <function-name>concat</function-name>
+ <function-sql>(?1 || ?2)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>substring</function-name>
+ <function-sql>substr(?1, ?2, ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>lcase</function-name>
+ <function-sql>lower(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>length</function-name>
+ <function-sql>length(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>locate</function-name>
+ <function-sql>instr(?2, ?1, ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>abs</function-name>
+ <function-sql>abs(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>sqrt</function-name>
+ <function-sql>sqrt(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>ucase</function-name>
+ <function-sql>upper(?1)</function-sql>
+ </function-mapping>
+
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>NUMBER(1)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>NUMBER(3)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>NUMBER(5)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>NUMBER(10)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>NUMBER(19)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>NUMBER(38,7)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>NUMBER(38,15)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR2(255)</sql-type>
+ </mapping>
+ <mapping>
+ <!--
+ | Note that you lose granularity here
+ | Use a numeric type and store milliseconds if you really need it
+ -->
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <!--
+ | Note that you lose granularity here
+ | Use a numeric type and store milliseconds if you really need it
+ -->
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>LONGVARBINARY</jdbc-type>
+ <sql-type>LONG RAW</sql-type>
+ <!--
+ | Change this from LONG RAW to RAW(n) if you know your
+ | serialized object will be <= n bytes and n <= 2000
+ | Oracle only permits one LONG type per table
+ -->
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>Sybase</name>
+ <row-locking-template/>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BIT</sql-type>
+ </mapping>
+ <!-- Current Sybase JDBC drivers (jConnect 5.2) don't support
+ byte or short. Unfortunately they'll be serialized.
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>TINYINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ -->
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>NUMERIC(38,0)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>REAL</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE PRECISION</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(255)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>SMALLDATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>IMAGE</sql-type>
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>PostgreSQL</name>
+ <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>TRUE</true-mapping>
+ <false-mapping>FALSE</false-mapping>
+
+ <function-mapping>
+ <function-name>concat</function-name>
+ <function-sql>(?1 || ?2)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>substring</function-name>
+ <function-sql>substring(?1 FROM ?2 FOR ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>lcase</function-name>
+ <function-sql>lower(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>length</function-name>
+ <function-sql>length(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>locate</function-name>
+ <function-sql>(CASE position(?1 in substring(?2 from ?3)) WHEN 0 THEN 0 ELSE position(?1 in substring(?2 from ?3)) + ?3 - 1 END)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>abs</function-name>
+ <function-sql>abs(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>sqrt</function-name>
+ <function-sql>sqrt(CAST(?1 AS double precision))</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>ucase</function-name>
+ <function-sql>upper(?1)</function-sql>
+ </function-mapping>
+
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>BOOLEAN</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>INT2</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>INT2</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INT4</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>INT8</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT(7)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>FLOAT8</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR(1)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>TEXT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>NUMERIC</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>VARBINARY</jdbc-type>
+ <sql-type>BYTEA</sql-type>
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>PostgreSQL 7.2</name>
+ <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>TRUE</true-mapping>
+ <false-mapping>FALSE</false-mapping>
+
+ <function-mapping>
+ <function-name>concat</function-name>
+ <function-sql>(?1 || ?2)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>substring</function-name>
+ <function-sql>substring(?1 FROM ?2 FOR ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>lcase</function-name>
+ <function-sql>lower(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>length</function-name>
+ <function-sql>length(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>locate</function-name>
+ <function-sql>(CASE position(?1 in substring(?2 from ?3)) WHEN 0 THEN 0 ELSE position(?1 in substring(?2 from ?3)) + ?3 - 1 END)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>abs</function-name>
+ <function-sql>abs(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>sqrt</function-name>
+ <function-sql>sqrt(CAST(?1 AS double precision))</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>ucase</function-name>
+ <function-sql>upper(?1)</function-sql>
+ </function-mapping>
+
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>BOOLEAN</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>INT2</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>INT2</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INT4</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>INT8</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT(7)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>FLOAT8</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR(1)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>TEXT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>NUMERIC</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>VARBINARY</jdbc-type>
+ <sql-type>BYTEA</sql-type>
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>Hypersonic SQL</name>
+ <row-locking-template/>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template/>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>(1=1)</true-mapping>
+ <false-mapping>(1=0)</false-mapping>
+
+ <function-mapping>
+ <function-name>concat</function-name>
+ <function-sql>(?1 || ?2)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>substring</function-name>
+ <function-sql>SUBSTRING(?1, ?2, ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>lcase</function-name>
+ <function-sql>lcase(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>length</function-name>
+ <function-sql>LENGTH(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>locate</function-name>
+ <function-sql>LOCATE(?1, ?2, ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>abs</function-name>
+ <function-sql>ABS(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>sqrt</function-name>
+ <function-sql>SQRT(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>ucase</function-name>
+ <function-sql>ucase(?1)</function-sql>
+ </function-mapping>
+
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BIT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <!-- hsqldb only supports directly serializable objects for sql type OBJECT -->
+ <jdbc-type>VARBINARY</jdbc-type>
+ <sql-type>VARBINARY</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>REAL</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>BIGINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>DECIMAL</jdbc-type>
+ <sql-type>DECIMAL</sql-type>
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>PointBase</name>
+ <row-locking-template/>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BINARY</jdbc-type>
+ <sql-type>BOOLEAN</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>BLOB</jdbc-type>
+ <sql-type>BLOB</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>SOLID</name>
+ <row-locking-template/>
+ <pk-constraint-template>PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>TINYINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>BLOB</jdbc-type>
+ <sql-type>BLOB</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BIT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>BIGINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>mySQL</name>
+ <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD INDEX ind_?3 (?3), ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>false</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <function-mapping>
+ <function-name>concat</function-name>
+ <function-sql>concat(?1, ?2)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>substring</function-name>
+ <function-sql>substring(?1 FROM ?2 FOR ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>lcase</function-name>
+ <function-sql>lower(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>length</function-name>
+ <function-sql>length(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>locate</function-name>
+ <function-sql>locate(?1, ?2, ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>abs</function-name>
+ <function-sql>abs(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>sqrt</function-name>
+ <function-sql>sqrt(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>ucase</function-name>
+ <function-sql>upper(?1)</function-sql>
+ </function-mapping>
+
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>TINYINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>BLOB</jdbc-type>
+ <sql-type>LONGBLOB</sql-type>
+ <!--
+ | Change this from LONGBLOB to BLOB if you know your
+ | serialized object will be <= 2^16 bytes
+ -->
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ <!--
+ | This type is problematical because mysql does not have any
+ | date/time types that store milliseconds. You should avoid it.
+ -->
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>TINYINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>BIGINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(250) BINARY</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ <!--
+ | Note that you lose granularity here
+ | Use a numeric type and store milliseconds if you really need it
+ -->
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>MS SQLSERVER</name>
+ <row-locking-template>SELECT ?1 FROM ?2 with (rowlock) WHERE ?3</row-locking-template>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <function-mapping>
+ <function-name>concat</function-name>
+ <function-sql>(?1 + ?2)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>substring</function-name>
+ <function-sql>substring(?1, ?2, ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>lcase</function-name>
+ <function-sql>lower(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>length</function-name>
+ <function-sql>len(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>locate</function-name>
+ <function-sql>charindex(?1, ?2, ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>abs</function-name>
+ <function-sql>abs(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>sqrt</function-name>
+ <function-sql>sqrt(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>ucase</function-name>
+ <function-sql>upper(?1)</function-sql>
+ </function-mapping>
+
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>DECIMAL</jdbc-type>
+ <sql-type>DECIMAL(20)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>IMAGE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>TINYINT</sql-type>
+ </mapping>
+ <mapping>
+ <!--
+ | Note that you lose granularity here
+ | Use a numeric type and store milliseconds if you really need it
+ -->
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BIT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>MS SQLSERVER2000</name>
+ <row-locking-template>SELECT ?1 FROM ?2 with (rowlock) WHERE ?3</row-locking-template>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <function-mapping>
+ <function-name>concat</function-name>
+ <function-sql>(?1 + ?2)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>substring</function-name>
+ <function-sql>substring(?1, ?2, ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>lcase</function-name>
+ <function-sql>lower(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>length</function-name>
+ <function-sql>len(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>locate</function-name>
+ <function-sql>charindex(?1, ?2, ?3)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>abs</function-name>
+ <function-sql>abs(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>sqrt</function-name>
+ <function-sql>sqrt(?1)</function-sql>
+ </function-mapping>
+ <function-mapping>
+ <function-name>ucase</function-name>
+ <function-sql>upper(?1)</function-sql>
+ </function-mapping>
+
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>BIGINT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>IMAGE</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>TINYINT</sql-type>
+ </mapping>
+
+ <mapping>
+ <!--
+ | Note that you lose granularity here
+ | Use a numeric type and store milliseconds if you really need it
+ -->
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATETIME</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BIT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>REAL</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>DB2/400</name>
+ <row-locking-template/>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR(1)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+ <!-- Apparent DB2/400 doesn't handle Byte type either
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR(1) FOR BIT DATA</sql-type>
+ </mapping>
+ -->
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR(5)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>VARCHAR(4096) FOR BIT DATA</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>SapDB</name>
+ <row-locking-template>SELECT ?1 FROM ?2 WHERE ?3 FOR UPDATE</row-locking-template>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(256)</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>LONG BYTE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>CHAR BYTE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BOOLEAN</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>FLOAT</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE PRECISION</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>DECIMAL</jdbc-type>
+ <sql-type>DECIMAL(20)</sql-type>
+ </mapping>
+ </type-mapping>
+
+ <type-mapping>
+ <name>Cloudscape</name>
+ <row-locking-template/>
+ <pk-constraint-template>CONSTRAINT ?1 PRIMARY KEY (?2)</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT ?2 FOREIGN KEY (?3) REFERENCES ?4 (?5)</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>LONGVARCHAR</jdbc-type>
+ <sql-type>LONG VARCHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>BOOLEAN</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>TINYINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>LONGINT</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>REAL</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE PRECISION</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>LONGVARCHAR</jdbc-type>
+ <sql-type>LONG VARCHAR</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>TIMESTAMP</sql-type>
+ </mapping>
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>LONG VARBINARY</sql-type>
+ </mapping>
+ </type-mapping>
+
+
+ <type-mapping>
+ <name>InformixDB</name>
+ <row-locking-template>select ?1 from ?2 where ?3 for update</row-locking-template>
+ <pk-constraint-template>PRIMARY KEY (?2) CONSTRAINT ?1</pk-constraint-template>
+ <fk-constraint-template>ALTER TABLE ?1 ADD CONSTRAINT FOREIGN KEY (?3) REFERENCES ?4 (?5) CONSTRAINT ?2</fk-constraint-template>
+ <alias-header-prefix>t</alias-header-prefix>
+ <alias-header-suffix>_</alias-header-suffix>
+ <alias-max-length>32</alias-max-length>
+ <subquery-supported>true</subquery-supported>
+ <true-mapping>1</true-mapping>
+ <false-mapping>0</false-mapping>
+
+ <mapping>
+ <java-type>java.lang.Character</java-type>
+ <jdbc-type>CHAR</jdbc-type>
+ <sql-type>CHAR(1)</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.String</java-type>
+ <jdbc-type>VARCHAR</jdbc-type>
+ <sql-type>VARCHAR(255,0)</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.math.BigDecimal</java-type>
+ <jdbc-type>NUMERIC</jdbc-type>
+ <sql-type>DECIMAL</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Boolean</java-type>
+ <jdbc-type>BIT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Integer</java-type>
+ <jdbc-type>INTEGER</jdbc-type>
+ <sql-type>INTEGER</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Long</java-type>
+ <jdbc-type>BIGINT</jdbc-type>
+ <sql-type>NUMERIC(18,0)</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Float</java-type>
+ <jdbc-type>REAL</jdbc-type>
+ <sql-type>FLOAT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Double</java-type>
+ <jdbc-type>DOUBLE</jdbc-type>
+ <sql-type>DOUBLE PRECISION</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Byte</java-type>
+ <jdbc-type>TINYINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Short</java-type>
+ <jdbc-type>SMALLINT</jdbc-type>
+ <sql-type>SMALLINT</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.util.Date</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATETIME YEAR TO FRACTION(3)</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.sql.Date</java-type>
+ <jdbc-type>DATE</jdbc-type>
+ <sql-type>DATE</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.sql.Time</java-type>
+ <jdbc-type>TIME</jdbc-type>
+ <sql-type>TIME</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.sql.Timestamp</java-type>
+ <jdbc-type>TIMESTAMP</jdbc-type>
+ <sql-type>DATETIME YEAR TO FRACTION(3)</sql-type>
+ </mapping>
+
+ <mapping>
+ <java-type>java.lang.Object</java-type>
+ <jdbc-type>JAVA_OBJECT</jdbc-type>
+ <sql-type>BYTE</sql-type>
+ </mapping>
+ </type-mapping>
+
+ </type-mappings>
+</jbosscmp-jdbc>
diff --git a/3.0.4/config/jboss/deploy/jbossweb.sar/META-INF/jboss-service.xml b/3.0.4/config/jboss/deploy/jbossweb.sar/META-INF/jboss-service.xml
new file mode 100644
index 0000000..61ad66c
--- /dev/null
+++ b/3.0.4/config/jboss/deploy/jbossweb.sar/META-INF/jboss-service.xml
@@ -0,0 +1,227 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<server>
+
+ <!-- ==================================================================== -->
+ <!-- Web Container -->
+ <!-- ==================================================================== -->
+
+ <!--
+ | Be sure to check that the configuration values are valid for your
+ | environment.
+ -->
+
+ <mbean code="org.jboss.jetty.JettyService" name="jboss.web:service=WebServer">
+
+ <!-- ================================================================= -->
+ <!-- Your webdefault.xml file - The default settings for every webapp -->
+ <!-- deployed by Jetty. Make systemwide changes here to your webapps -->
+ <!-- configurations. -->
+ <!-- ================================================================= -->
+
+ <attribute name="WebDefaultResource">webdefault.xml</attribute>
+
+ <!-- ================================================================== -->
+ <!-- If true, .war files are unpacked to a temporary directory. This -->
+ <!-- is useful with JSPs. -->
+ <!-- ================================================================== -->
+
+ <attribute name="UnpackWars">true</attribute>
+
+ <!-- ================================================================== -->
+ <!-- If true, Jetty first delegates loading a class to the webapp's -->
+ <!-- parent class loader (a la Java 2). If false, Jetty follows the -->
+ <!-- Servlet 2.3 specification, and tries the webapp's own loader -->
+ <!-- first (for "non-system" classes) -->
+ <!-- ================================================================== -->
+
+ <attribute name="Java2ClassLoadingCompliance">true</attribute>
+
+ <!-- ================================================================= -->
+ <!-- If you require JAAS authentication, configure the name of the -->
+ <!-- attribute in which you expect to find the JAAS active subject: -->
+ <!-- -->
+ <!-- Commenting out this configuration will disable JAAS support -->
+ <!-- ================================================================= -->
+
+ <attribute name="SubjectAttributeName">j_subject</attribute>
+
+ <!-- ================================================================= -->
+ <!-- Configuring Jetty. The XML fragment contained in the -->
+ <!-- name="ConfigurationElement" attribute is a Jetty-style -->
+ <!-- configuration specification. It is used to configure Jetty with -->
+ <!-- a listener on port 8080, and a HTTP request log location. -->
+ <!-- The placement here of other Jetty XML configuration statements -->
+ <!-- for deploying webapps etc is not encouraged: if you REALLY NEED -->
+ <!-- something extra, place it in WEB-INF/jetty-web.xml files -->
+ <!-- ================================================================= -->
+
+ <attribute name="ConfigurationElement">
+ <Configure class="org.mortbay.jetty.Server">
+
+ <!-- =============================================================== -->
+ <!-- Configure the Request Listeners -->
+ <!-- =============================================================== -->
+
+
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- Add and configure a HTTP listener to port 80 -->
+ <!-- The default port can be changed using: java -Djetty.port=80 -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <Call name="addListener">
+ <Arg>
+ <New class="org.mortbay.http.SocketListener">
+ <Set name="Port"><SystemProperty name="jetty.port" default="80"/></Set>
+ <Set name="MinThreads">5</Set>
+ <Set name="MaxThreads">100</Set>
+ <Set name="MaxIdleTimeMs">30000</Set>
+ <Set name="LowResourcePersistTimeMs">5000</Set>
+ </New>
+ </Arg>
+ </Call>
+
+
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- Add a HTTPS SSL listener on port 8843 -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- UNCOMMENT TO ACTIVATE
+ <Call name="addListener">
+ <Arg>
+ <New class="org.mortbay.http.SunJsseListener">
+ <Set name="Port">8443</Set>
+ <Set name="MinThreads">5</Set>
+ <Set name="MaxThreads">100</Set>
+ <Set name="MaxIdleTimeMs">30000</Set>
+ <Set name="LowResourcePersistTimeMs">2000</Set>
+ <Set name="Keystore"><SystemProperty name="jetty.home" default="."/>/etc/demokeystore</Set>
+ <Set name="Password">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set>
+ <Set name="KeyPassword">OBF:1u2u1wml1z7s1z7a1wnl1u2g</Set>
+ </New>
+ </Arg>
+ </Call>
+ -->
+
+
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- Add a AJP13 listener on port 8009 -->
+ <!-- This protocol can be used with mod_jk in apache, IIS etc. -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <Call name="addListener">
+ <Arg>
+ <New class="org.mortbay.http.ajp.AJP13Listener">
+ <Set name="Port">8009</Set>
+ <Set name="MinThreads">5</Set>
+ <Set name="MaxThreads">255</Set>
+ <Set name="MaxIdleTimeMs">30000</Set>
+ <Set name="confidentialPort">443</Set>
+ </New>
+ </Arg>
+ </Call>
+
+ <!-- Private assets are exposed by copying them to the
+ specifyed directory and building a URI to the
+ specified virtual folder. -->
+
+ <Call name="addContext">
+ <Arg>/private/*</Arg>
+ <Set name="ResourceBase">../server/tapestry/tmp/private</Set>
+
+ <Call name="addHandler">
+ <Arg><New class="org.mortbay.http.handler.ResourceHandler"/></Arg>
+ </Call>
+
+ <Call name="addHandler">
+ <Arg><New class="org.mortbay.http.handler.NotFoundHandler"/></Arg>
+ </Call>
+ </Call>
+
+
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- Add and configure a NIO HTTP listener to port 8888 -->
+ <!-- This listener should be used to replace the standard HTTP -->
+ <!-- listener when deployed on LARGE systems using jdk 1.4 -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+ <!-- UNCOMMENT TO ACTIVATE
+ <Call name="addListener">
+ <Arg>
+ <New class="org.mortbay.http.SocketChannelListener">
+ <Set name="Port"><SystemProperty name="jetty.port" default="8888"/></Set>
+ <Set name="MinThreads">5</Set>
+ <Set name="MaxThreads">500</Set>
+ <Set name="MaxIdleTimeMs">30000</Set>
+ </New>
+ </Arg>
+ </Call>
+ -->
+ <!-- =============================================================== -->
+ <!-- Configure the Request Log -->
+ <!-- =============================================================== -->
+ <Set name="RequestLog">
+ <New class="org.mortbay.http.NCSARequestLog">
+ <Arg><SystemProperty name="jboss.server.home.dir"/><SystemProperty name="jetty.log" default="/log"/>/yyyy_mm_dd.request.log
+ </Arg>
+ <Set name="retainDays">90</Set>
+ <Set name="append">true</Set>
+ <Set name="extended">true</Set>
+ <Set name="LogTimeZone">GMT</Set>
+ </New>
+ </Set>
+
+ <!-- ======================================================= -->
+ <!-- New Distributed Session Manager -->
+ <!-- ======================================================= -->
+
+ <!--
+ These can be set on a per webapp basis in WEB-INF/jetty-web.xml
+ -->
+
+ <Set name="DistributableSessionManagerPrototype">
+ <New class="org.mortbay.j2ee.session.Manager">
+ <Set name="scavengerPeriod">600</Set>
+ <!-- NYI
+ <Set name="workerName">node1</Set>
+ -->
+ <Set name="interceptorStack">
+ <Array type="org.mortbay.j2ee.session.StateInterceptor">
+<!--
+ <Item><New class="org.mortbay.j2ee.session.DebugInterceptor"/></Item>
+-->
+ <Item><New class="org.mortbay.j2ee.session.ValidatingInterceptor"/></Item>
+ <Item><New class="org.mortbay.j2ee.session.TypeCheckingInterceptor"/></Item>
+ <Item><New class="org.mortbay.j2ee.session.BindingInterceptor"/></Item>
+ <Item><New class="org.mortbay.j2ee.session.PublishingInterceptor"/></Item>
+ <Item><New class="org.mortbay.j2ee.session.SubscribingInterceptor"/></Item>
+ <Item><New class="org.mortbay.j2ee.session.SynchronizingInterceptor"/></Item>
+ </Array>
+ </Set>
+ <!-- Put this back in for distributable support under 'all' configuration
+ <Set name="store">
+ <New class="org.mortbay.j2ee.session.JGStore">
+ <Set name="actualMaxInactiveInterval">604800</Set>
+ <Set name="scavengerPeriod">3600</Set>
+ <Set name="scavengerExtraTime">900</Set>
+ <Set name="protocolStack">UDP(mcast_addr=228.8.8.8;mcast_port=45566;ip_ttl=32;ucast_recv_buf_size=16000;ucast_send_buf_size=16000;mcast_send_buf_size=32000;mcast_recv_buf_size=64000;loopback=true):PING(timeout=2000;num_initial_members=3):MERGE2(min_interval=5000;max_interval=10000):FD_SOCK:VERIFY_SUSPECT(timeout=1500):pbcast.STABLE(desired_avg_gossip=20000):pbcast.NAKACK(gc_lag=50;retransmit_timeout=300,600,1200,2400,4800;max_xmit_size=8192):UNICAST(timeout=2000):FRAG(frag_size=8192;down_thread=false;up_thread=false):pbcast.GMS(join_timeout=5000;join_retry_timeout=2000;shun=false;print_local_addr=true):pbcast.STATE_TRANSFER</Set>
+ <Set name="subClusterName">DefaultSubCluster</Set>
+ <Set name="retrievalTimeOut">20000</Set>
+ <Set name="distributionTimeOut">5000</Set>
+ <Set name="distributionMode">GET_ALL</Set>
+ </New>
+ </Set>
+ -->
+ </New>
+ </Set>
+
+ <!-- For testing the Distributable SessionManager with e.g. Watchdog -->
+ <!--
+ <Set name="forceDistributable">true</Set>
+ -->
+
+ </Configure>
+ </attribute>
+
+ </mbean>
+
+ <!-- ==================================================================== -->
+ <!-- ==================================================================== -->
+
+</server>
diff --git a/3.0.4/config/jboss/deploy/mckoi-service.xml b/3.0.4/config/jboss/deploy/mckoi-service.xml
new file mode 100644
index 0000000..52797b2
--- /dev/null
+++ b/3.0.4/config/jboss/deploy/mckoi-service.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- $Id$ -->
+
+<!-- ===================================================================== -->
+<!-- -->
+<!-- McKoi Database 1.00 configuration -->
+<!-- -->
+<!-- ===================================================================== -->
+
+<!-- This is basically a cut-and-paste of the Solid example service, modified
+ for McKoi DB. This required McKoi release 1.00, which includes
+ the MBean implementation that allow it to operate within JBoss
+ (previously, a seperate MBean JAR file was needed). -->
+
+
+<server>
+
+ <!-- The current working directory is the JBoss/bin directory, so this
+ relative path works. -->
+
+ <mbean code="net.sf.tapestry.contrib.mckoi.McKoiDB" name="jboss:service=McKoiDB">
+ <attribute name="ConfigPath">../server/tapestry/db/tapestry.conf</attribute>
+ </mbean>
+
+
+ <mbean
+ code="org.jboss.resource.connectionmanager.LocalTxConnectionManager"
+ name="jboss.jca:service=LocalTxCM,name=McKoiDB">
+
+ <depends>jboss:service=McKoiDB</depends>
+
+ <depends optional-attribute-name="ManagedConnectionFactoryName">
+
+ <!--embedded mbean-->
+ <mbean
+ code="org.jboss.resource.connectionmanager.RARDeployment"
+ name="jboss.jca:service=LocalTxDS,name=McKoiDB">
+
+ <attribute name="JndiName">McKoiDB</attribute>
+
+ <!--NOTE: Solid wants the username/password in the URL, it will
+ ignore the specific arguments.-->
+ <attribute name="ManagedConnectionFactoryProperties">
+ <properties>
+ <config-property name="ConnectionURL" type="java.lang.String">jdbc:mckoi://localhost/</config-property>
+ <config-property name="DriverClass" type="java.lang.String">com.mckoi.JDBCDriver</config-property>
+ <config-property name="UserName" type="java.lang.String">admin</config-property>
+ <config-property name="Password" type="java.lang.String">secret</config-property>
+ </properties>
+
+ <!--These properties are ignored by the Solid driver.
+ <config-property name="UserName" type="java.lang.String"></config-property>
+ <config-property name="Password" type="java.lang.String"></config-property>
+ -->
+ </attribute>
+ <!--hack-->
+ <depends optional-attribute-name="OldRarDeployment">jboss.jca:service=RARDeployment,name=JBoss LocalTransaction JDBC Wrapper</depends>
+ </mbean>
+ </depends>
+
+ <depends optional-attribute-name="ManagedConnectionPool">
+ <!--embedded mbean-->
+ <mbean code="org.jboss.resource.connectionmanager.JBossManagedConnectionPool"
+ name="jboss.jca:service=LocalTxPool,name=McKoiDB">
+
+ <attribute name="MinSize">0</attribute>
+ <attribute name="MaxSize">50</attribute>
+ <attribute name="BlockingTimeoutMillis">5000</attribute>
+ <attribute name="IdleTimeoutMinutes">15</attribute>
+ <!--criteria indicates if Subject (from security domain) or app supplied
+ parameters (such as from getConnection(user, pw)) are used to distinguish
+ connections in the pool. Choices are
+ ByContainerAndApplication (use both),
+ ByContainer (use Subject),
+ ByApplication (use app supplied params only),
+ ByNothing (all connections are equivalent, usually if adapter supports
+ reauthentication)-->
+ <!-- Since at present only a single user specified in the URL is supported,
+ ByNothing is mosst appropriate. If a URL construction scheme is implemented,
+ this could be one of the other values -->
+ <attribute name="Criteria">ByNothing</attribute>
+ </mbean>
+
+ </depends>
+ <depends optional-attribute-name="CachedConnectionManager">jboss.jca:service=CachedConnectionManager</depends>
+ <!-- Since the username/password needs to be in the url, there is no way at
+ present for a generic wrapper to supply user/pw to the driver. A custom
+ wrapper could be used to consruct the url dynamically from a base and the
+ user/pw. In case someone does that, I'm leaving the container-managed-security
+ attribute in. -->
+ <!-- <attribute name="SecurityDomainJndiName">SolidDbRealm</attribute>-->
+
+ <depends optional-attribute-name="JaasSecurityManagerService">jboss.security:service=JaasSecurityManager</depends>
+
+
+ <attribute name="TransactionManager">java:/TransactionManager</attribute>
+ <!--make the rar deploy! hack till better deployment-->
+ <depends>jboss.jca:service=RARDeployer</depends>
+ </mbean>
+
+</server>
+
+
diff --git a/3.0.4/config/jboss/tapestry-db.zip b/3.0.4/config/jboss/tapestry-db.zip
new file mode 100644
index 0000000..d2a4f2a
--- /dev/null
+++ b/3.0.4/config/jboss/tapestry-db.zip
Binary files differ
diff --git a/3.0.4/config/jetty-workbench.xml b/3.0.4/config/jetty-workbench.xml
new file mode 100644
index 0000000..7b75ceb
--- /dev/null
+++ b/3.0.4/config/jetty-workbench.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!-- $Id$ -->
+<!DOCTYPE Configure PUBLIC
+ "-//Mort Bay Consulting//DTD Configure 1.2//EN"
+ "http://jetty.mortbay.org/configure_1_2.dtd">
+<!--
+ This configuration file is used to allow the Tutorial to be run directly from
+ the main distribution directory (i.e., without having to build the frameworks).
+ -->
+<Configure class="org.mortbay.jetty.Server">
+ <Call name="addListener">
+ <Arg>
+ <New class="org.mortbay.http.SocketListener">
+ <Set name="Port">8080</Set>
+ <Set name="MinThreads">1</Set>
+ <Set name="MaxThreads">10</Set>
+ <Set name="MaxIdleTimeMs">50000</Set>
+ </New>
+ </Arg>
+ </Call>
+
+ <Call name="addWebApplication">
+ <Arg>/workbench</Arg>
+ <Arg>lib/examples/workbench.war</Arg>
+ <Set name="DefaultsDescriptor">config/webdefault.xml</Set>
+ </Call>
+
+ <Call name="addContext">
+ <Arg>/private/*</Arg>
+ <Set name="ResourceBase">private</Set>
+
+ <Call name="addHandler">
+ <Arg><New class="org.mortbay.http.handler.ResourceHandler"/></Arg>
+ </Call>
+
+ <Call name="addHandler">
+ <Arg><New class="org.mortbay.http.handler.NotFoundHandler"/></Arg>
+ </Call>
+ </Call>
+
+ <Call name="addContext">
+ <Arg>/</Arg>
+ <Set name="realmName">Jetty Demo Realm</Set>
+
+ <Call name="addServlet">
+ <Arg>Admin</Arg>
+ <Arg>/</Arg>
+ <Arg>org.mortbay.servlet.AdminServlet</Arg>
+ </Call>
+
+ <Call name="setAttribute">
+ <Arg>org.mortbay.http.HttpServer</Arg>
+ <Arg><Call name="getHttpServer"/></Arg>
+ </Call>
+ </Call>
+
+</Configure>
diff --git a/3.0.4/config/log4j.properties b/3.0.4/config/log4j.properties
new file mode 100644
index 0000000..ee019a8
--- /dev/null
+++ b/3.0.4/config/log4j.properties
@@ -0,0 +1,12 @@
+# $Id$
+# Set root category priority to INFO and its only appender to A1.
+log4j.rootCategory=WARN, A1
+
+# A1 is set to be a ConsoleAppender.
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+
+# A1 uses PatternLayout.
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%r %c{1} [%p] %m%n
+
+log4j.category.org.apache.commons.digester.Digester=FATAL
\ No newline at end of file
diff --git a/3.0.4/config/webdefault.xml b/3.0.4/config/webdefault.xml
new file mode 100644
index 0000000..2f1fe3c
--- /dev/null
+++ b/3.0.4/config/webdefault.xml
@@ -0,0 +1,116 @@
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
+<!-- $Id$ -->
+
+<web-app>
+ <description>
+ Default web.xml file.
+ This file is applied to a Web application before it's own WEB_INF/web.xml file
+ </description>
+
+
+ <!-- ==================================================================== -->
+ <!-- JSP Servlet -->
+ <!-- This is the jasper JSP servlet from the jakarta project -->
+ <!-- The following initParameters are supported: -->
+ <!-- -->
+ <!-- classpath What class path should I use while compiling -->
+ <!-- generated servlets? [Created dynamically -->
+ <!-- based on the current web application] -->
+ <!-- -->
+ <!-- classdebuginfo Should the class file be compiled with -->
+ <!-- debugging information? [false] -->
+ <!-- -->
+ <!-- ieClassId The class-id value to be sent to Internet -->
+ <!-- Explorer when using <jsp:plugin> tags. -->
+ <!-- [clsid:8AD9C840-044E-11D1-B3E9-00805F499D93] -->
+ <!-- -->
+ <!-- jspCompilerPlugin The fully qualified class name of the JSP -->
+ <!-- compiler plug-in to be used. See below for -->
+ <!-- more information. -->
+ <!-- [Use internal JDK compiler] -->
+ <!-- -->
+ <!-- keepgenerated Should we keep the generated Java source code -->
+ <!-- for each page instead of deleting it? [true] -->
+ <!-- -->
+ <!-- largefile Should we store the static content of JSP -->
+ <!-- pages in external data files, to reduce the -->
+ <!-- size of the generated servlets? [false] -->
+ <!-- -->
+ <!-- logVerbosityLevel The level of detailed messages to be produced -->
+ <!-- by this servlet. Increasing levels cause the -->
+ <!-- generation of more messages. Valid values are -->
+ <!-- FATAL, ERROR, WARNING, INFORMATION, and DEBUG. -->
+ <!-- [WARNING] -->
+ <!-- -->
+ <!-- mappedfile Should we generate static content with one -->
+ <!-- print statement per input line, to ease -->
+ <!-- debugging? [false] -->
+ <!-- -->
+ <!-- scratchdir What scratch directory should we use when -->
+ <!-- compiling JSP pages? [default work directory -->
+ <!-- for the current web application] -->
+ <!-- -->
+ <!-- If you wish to use Jikes to compile JSP pages: -->
+ <!-- * Set the "classpath" initialization parameter appropriately -->
+ <!-- for this web application. -->
+ <!-- * Set the "jspCompilerPlugin" initialization parameter to -->
+ <!-- "org.apache.jasper.compiler.JikesJavaCompiler". -->
+ <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+
+ <servlet>
+ <servlet-name>jsp</servlet-name>
+ <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
+ <load-on-startup>0</load-on-startup>
+ </servlet>
+
+ <servlet>
+ <servlet-name>Default</servlet-name>
+ <servlet-class>org.mortbay.jetty.servlet.Default</servlet-class>
+ <init-param>
+ <param-name>acceptRanges</param-name>
+ <param-value>true</param-value>
+ </init-param>
+ <init-param>
+ <param-name>dirAllowed</param-name>
+ <param-value>true</param-value>
+ </init-param>
+ <init-param>
+ <param-name>putAllowed</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ <init-param>
+ <param-name>delAllowed</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ <init-param>
+ <param-name>redirectWelcome</param-name>
+ <param-value>true</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+
+ <!-- ==================================================================== -->
+ <servlet-mapping>
+ <servlet-name>Default</servlet-name>
+ <url-pattern>/</url-pattern>
+ </servlet-mapping>
+
+ <servlet-mapping>
+ <servlet-name>jsp</servlet-name>
+ <url-pattern>*.jsp</url-pattern>
+ </servlet-mapping>
+
+ <!-- ==================================================================== -->
+ <session-config>
+ <session-timeout>60</session-timeout>
+ </session-config>
+
+ <!-- ==================================================================== -->
+ <welcome-file-list>
+ <welcome-file>index.html</welcome-file>
+ <welcome-file>index.htm</welcome-file>
+ </welcome-file-list>
+
+</web-app>
+
diff --git a/3.0.4/contrib/.cvsignore b/3.0.4/contrib/.cvsignore
new file mode 100644
index 0000000..602053d
--- /dev/null
+++ b/3.0.4/contrib/.cvsignore
@@ -0,0 +1,3 @@
+classes
+*.log
+target
diff --git a/3.0.4/contrib/build.xml b/3.0.4/contrib/build.xml
new file mode 100644
index 0000000..35337d7
--- /dev/null
+++ b/3.0.4/contrib/build.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<!-- $Id$ -->
+<project name="Tapestry Contrib Framework" default="install">
+ <property name="root.dir" value=".."/>
+ <property file="${root.dir}/config/Version.properties"/>
+ <property file="${root.dir}/config/build.properties"/>
+ <property file="${root.dir}/config/common.properties"/>
+ <path id="jetty.classpath">
+ <fileset dir="${jetty.dir}">
+ <include name="**/javax.*.jar"/>
+ </fileset>
+ </path>
+ <path id="project.classpath">
+ <fileset dir="${root.lib.dir}">
+ <include name="${framework.jar}"/>
+ <include name="${ext.dir}/*.jar"/>
+ <include name="${j2ee.dir}/*.jar"/>
+ </fileset>
+ </path>
+ <target name="init">
+ <mkdir dir="${classes.dir}"/>
+ </target>
+ <target name="clean">
+ <delete dir="${classes.dir}"/>
+ </target>
+
+ <target name="compile" depends="init"
+ description="Compile all classes in the framework.">
+ <javac srcdir="${src.dir}" destdir="${classes.dir}" debug="on"
+ target="1.1" source="1.3">
+ <classpath refid="project.classpath"/>
+ </javac>
+ </target>
+
+ <target name="install" depends="compile"
+ description="Compile all classes and build the installed JAR including all package resources."
+ >
+ <jar jarfile="${root.lib.dir}/${contrib.jar}">
+ <fileset dir="${classes.dir}"/>
+ <fileset dir="${src.dir}">
+ <exclude name="**/*.java"/>
+ <exclude name="**/package.html"/>
+ </fileset>
+ </jar>
+ </target>
+</project>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/Contrib.library b/3.0.4/contrib/src/org/apache/tapestry/contrib/Contrib.library
new file mode 100644
index 0000000..fb5b813
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/Contrib.library
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE library-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<library-specification>
+
+ <component-type type="InspectorButton" specification-path="inspector/InspectorButton.jwc"/>
+ <page name="Inspector" specification-path="inspector/Inspector.page"/>
+
+ <library id="inspector" specification-path="inspector/Inspector.library"/>
+
+ <component-type type="Choose" specification-path="components/Choose.jwc"/>
+ <component-type type="When" specification-path="components/When.jwc"/>
+ <component-type type="Otherwise" specification-path="components/Otherwise.jwc"/>
+
+ <component-type type="Palette" specification-path="palette/Palette.jwc"/>
+ <component-type type="MultiplePropertySelection" specification-path="form/MultiplePropertySelection.jwc"/>
+ <component-type type="DateField" specification-path="valid/DateField.jwc"/>
+ <component-type type="MaskEdit" specification-path="form/MaskEdit.jwc"/>
+ <component-type type="NumericField" specification-path="valid/NumericField.jwc"/>
+ <component-type type="ValidatingTextField" specification-path="valid/ValidatingTextField.jwc"/>
+ <component-type type="FormConditional" specification-path="form/FormConditional.jwc"/>
+
+ <component-type type="InheritInformalAny" specification-path="informal/InheritInformalAny.jwc"/>
+
+ <component-type type="Table" specification-path="table/components/Table.jwc"/>
+ <component-type type="TableColumns" specification-path="table/components/TableColumns.jwc"/>
+ <component-type type="TablePages" specification-path="table/components/TablePages.jwc"/>
+ <component-type type="TableRows" specification-path="table/components/TableRows.jwc"/>
+ <component-type type="TableValues" specification-path="table/components/TableValues.jwc"/>
+ <component-type type="TableView" specification-path="table/components/TableView.jwc"/>
+ <component-type type="FormTable" specification-path="table/components/FormTable.jwc"/>
+ <component-type type="TableFormRows" specification-path="table/components/TableFormRows.jwc"/>
+ <component-type type="TableFormPages" specification-path="table/components/TableFormPages.jwc"/>
+
+ <page name="SimpleTableColumnPage" specification-path="table/components/inserted/SimpleTableColumnPage.page"/>
+ <component-type type="SimpleTableColumnComponent" specification-path="table/components/inserted/SimpleTableColumnComponent.jwc"/>
+ <component-type type="SimpleTableColumnFormComponent" specification-path="table/components/inserted/SimpleTableColumnFormComponent.jwc"/>
+
+ <component-type type="PopupLink" specification-path="popup/PopupLink.jwc"/>
+
+ <component-type type="Tree"
+ specification-path="/org/apache/tapestry/contrib/tree/components/Tree.jwc"/>
+ <component-type type="TreeDataView"
+ specification-path="/org/apache/tapestry/contrib/tree/components/TreeDataView.jwc"/>
+ <component-type type="TreeNodeView"
+ specification-path="/org/apache/tapestry/contrib/tree/components/TreeNodeView.jwc"/>
+ <component-type type="TreeView"
+ specification-path="/org/apache/tapestry/contrib/tree/components/TreeView.jwc"/>
+ <component-type type="TreeTableDataView"
+ specification-path="/org/apache/tapestry/contrib/tree/components/table/TreeTableDataView.jwc"/>
+ <component-type type="TreeTable"
+ specification-path="/org/apache/tapestry/contrib/tree/components/table/TreeTable.jwc"/>
+ <component-type type="TreeTableNodeViewDelegator"
+ specification-path="/org/apache/tapestry/contrib/tree/components/table/TreeTableNodeViewDelegator.jwc"/>
+ <page name="TreeNodeViewPage" specification-path="/org/apache/tapestry/contrib/tree/components/TreeNodeViewPage.page"/>
+
+ <page name="TreeTableNodeViewPage" specification-path="/org/apache/tapestry/contrib/tree/components/table/TreeTableNodeViewPage.page"/>
+</library-specification>
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Choose.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Choose.java
new file mode 100644
index 0000000..20c41f4
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Choose.java
@@ -0,0 +1,62 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.components;
+
+import org.apache.tapestry.IRender;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.components.Conditional;
+
+/**
+ * This component is a container for {@link When} or Otherwise components;
+ * it provides the context for mutually exclusive conditional evaluation.
+ *
+ * [<a href="../../../../../../ComponentReference/contrib.Choose.html">Component Reference</a>]
+ *
+ * @author David Solis
+ * @version $Id$
+ *
+ **/
+public abstract class Choose extends Conditional {
+
+
+ public void addBody(IRender element)
+ {
+ super.addBody(element);
+ if (element instanceof When)
+ ((When) element).setChoose(this);
+ }
+
+ protected void cleanupAfterRender(IRequestCycle cycle)
+ {
+ setConditionMet(false);
+ super.cleanupAfterRender(cycle);
+ }
+
+ protected boolean evaluateCondition()
+ {
+ return getCondition();
+ }
+
+ public boolean getInvert()
+ {
+ // This component doesn't require invert parameter.
+ return false;
+ }
+
+ public abstract boolean getCondition();
+
+ public abstract boolean isConditionMet();
+ public abstract void setConditionMet(boolean value);
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Choose.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Choose.jwc
new file mode 100644
index 0000000..e3a522c
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Choose.jwc
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.components.Choose">
+
+ <description>
+ Provides the context for mutually exclusive conditional evaluation.
+ </description>
+
+ <parameter name="condition" type="boolean" direction="in" default-value="true">
+ <description>
+ The condition to evaluate.
+ </description>
+ </parameter>
+
+ <parameter name="element" type="java.lang.String" direction="in">
+ <description>
+ The element to emulate.
+ </description>
+ </parameter>
+
+ <reserved-parameter name="invert"/>
+
+ <property-specification name="conditionMet" type="boolean" initial-value="false"/>
+
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Otherwise.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Otherwise.jwc
new file mode 100644
index 0000000..3beb4f9
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/Otherwise.jwc
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.components.When">
+ <description>
+ Otherwise is just a When component that always tries to render its body and/or emulate an element
+ and its attributes (if element is specified) .
+ </description>
+
+ <parameter name="element" type="java.lang.String" direction="in">
+ <description>
+ The element to emulate.
+ </description>
+ </parameter>
+
+ <reserved-parameter name="condition"/>
+
+ <reserved-parameter name="invert"/>
+
+ <property-specification name="condition" type="boolean" initial-value="true"/>
+
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/components/When.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/When.java
new file mode 100644
index 0000000..9bcc3fa
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/When.java
@@ -0,0 +1,91 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.components;
+
+import org.apache.tapestry.ApplicationRuntimeException;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.components.Conditional;
+
+/**
+ * Represents an alternative whithin a {@link Choose} component.
+ * The default alternative is described by the Otherwise component.
+ *
+ * [<a href="../../../../../../ComponentReference/contrib.When.html">Component Reference</a>]
+ *
+ * @author David Solis
+ * @version $Id$
+ *
+ **/
+public abstract class When extends Conditional
+{
+ /** Parent of this component. */
+
+ private Choose _choose;
+
+ /**
+ * Renders its wrapped components only if the condition is true and its parent {@link Choose}
+ * allows it. In addition, if element is specified, can emulate that HTML element.
+ *
+ **/
+
+ protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
+ {
+ Choose choose = getChoose();
+
+ if (choose == null)
+ throw new ApplicationRuntimeException(
+ Tapestry.getMessage("When.must-be-contained-by-choose"),
+ this,
+ null,
+ null);
+
+ if (!choose.isConditionMet() && getCondition())
+ {
+ choose.setConditionMet(true);
+ super.renderComponent(writer, cycle);
+ }
+ }
+
+ protected boolean evaluateCondition()
+ {
+ return true;
+ }
+
+ public boolean getInvert()
+ {
+ // This component doesn't require invert parameter.
+ return false;
+ }
+
+ /**
+ * @return Choose
+ */
+ public Choose getChoose()
+ {
+ return _choose;
+ }
+
+ /**
+ * Sets the choose.
+ * @param value The choose to set
+ */
+ public void setChoose(Choose value)
+ {
+ _choose = value;
+ }
+
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/components/When.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/When.jwc
new file mode 100644
index 0000000..be9b7a8
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/When.jwc
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.components.When">
+ <description>
+ If this is the first When component to evaluate to true within Choose then emulates an element
+ and its attributes (if element is specified) and/or includes a block of content.
+ </description>
+
+ <parameter name="condition" type="boolean" direction="in">
+ <description>
+ The condition to evaluate.
+ </description>
+ </parameter>
+
+ <parameter name="element" type="java.lang.String" direction="in">
+ <description>
+ The element to emulate.
+ </description>
+ </parameter>
+
+ <reserved-parameter name="invert"/>
+
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/components/package.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/package.html
new file mode 100644
index 0000000..14e9648
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/components/package.html
@@ -0,0 +1,14 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- $Id$ -->
+<html>
+<head>
+<title>Tapestry: Web Application Framework</title>
+</head>
+<body>
+
+<p>Contribution of foundational components.
+
+@author David Solis <a href="mailto:dsolis@apache.org">dsolis@apache.org</a>
+
+</body>
+</html>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XCreateException.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XCreateException.java
new file mode 100644
index 0000000..1e8bb86
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XCreateException.java
@@ -0,0 +1,54 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.ejb;
+
+import javax.ejb.CreateException;
+
+/**
+ * Extended version of {@link CreateException} that includes a root cause.
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public class XCreateException extends CreateException
+{
+ private Throwable rootCause;
+
+ public XCreateException(String message)
+ {
+ super(message);
+ }
+
+ public XCreateException(String message, Throwable rootCause)
+ {
+ super(message);
+
+ this.rootCause = rootCause;
+ }
+
+ public XCreateException(Throwable rootCause)
+ {
+ super(rootCause.getMessage());
+
+ this.rootCause = rootCause;
+ }
+
+ public Throwable getRootCause()
+ {
+ return rootCause;
+ }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XEJBException.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XEJBException.java
new file mode 100644
index 0000000..bd92f4c
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XEJBException.java
@@ -0,0 +1,57 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.ejb;
+
+import javax.ejb.EJBException;
+
+/**
+ * Extended version of {@link EJBException} that includes a root cause.
+ * {@link EJBException} doesn't have quite the right constructor for this ...
+ * it has an equivalent to the rootCause property, (causedByException), but
+ * doesn't have a constructor that allows us to set a custom message.
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public class XEJBException extends EJBException
+{
+ private Throwable rootCause;
+
+ public XEJBException(String message)
+ {
+ super(message);
+ }
+
+ public XEJBException(String message, Throwable rootCause)
+ {
+ super(message);
+
+ this.rootCause = rootCause;
+ }
+
+ public XEJBException(Throwable rootCause)
+ {
+ super(rootCause.getMessage());
+
+ this.rootCause = rootCause;
+ }
+
+ public Throwable getRootCause()
+ {
+ return rootCause;
+ }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XFinderException.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XFinderException.java
new file mode 100644
index 0000000..a340ee8
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XFinderException.java
@@ -0,0 +1,54 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.ejb;
+
+import javax.ejb.FinderException;
+
+/**
+ * Extended version of {@link FinderException} that includes a root cause.
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public class XFinderException extends FinderException
+{
+ private Throwable rootCause;
+
+ public XFinderException(String message)
+ {
+ super(message);
+ }
+
+ public XFinderException(String message, Throwable rootCause)
+ {
+ super(message);
+
+ this.rootCause = rootCause;
+ }
+
+ public XFinderException(Throwable rootCause)
+ {
+ super(rootCause.getMessage());
+
+ this.rootCause = rootCause;
+ }
+
+ public Throwable getRootCause()
+ {
+ return rootCause;
+ }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XRemoveException.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XRemoveException.java
new file mode 100644
index 0000000..92b0132
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/XRemoveException.java
@@ -0,0 +1,54 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.ejb;
+
+import javax.ejb.RemoveException;
+
+/**
+ * Extended version of {@link RemoveException} that includes a root cause.
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public class XRemoveException extends RemoveException
+{
+ private Throwable rootCause;
+
+ public XRemoveException(String message)
+ {
+ super(message);
+ }
+
+ public XRemoveException(String message, Throwable rootCause)
+ {
+ super(message);
+
+ this.rootCause = rootCause;
+ }
+
+ public XRemoveException(Throwable rootCause)
+ {
+ super(rootCause.getMessage());
+
+ this.rootCause = rootCause;
+ }
+
+ public Throwable getRootCause()
+ {
+ return rootCause;
+ }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/package.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/package.html
new file mode 100644
index 0000000..1e0fbfb
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/ejb/package.html
@@ -0,0 +1,16 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- $Id$ -->
+<html>
+<head>
+<title>Tapestry: Web Application Framework</title>
+</head>
+<body>
+
+<p>Subclasses of the EJB exceptions that take an optional, additional, root cause Throwable
+to identify the underlying reason for the exception. This is less necessary in JDK 1.4, which
+support root cause for all exceptions.
+
+@author Howard Lewis Ship <a href="mailto:hlship@apache.org">hlship@apache.org</a>
+
+</body>
+</html>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/CheckBoxMultiplePropertySelectionRenderer.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/CheckBoxMultiplePropertySelectionRenderer.java
new file mode 100644
index 0000000..3661094
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/CheckBoxMultiplePropertySelectionRenderer.java
@@ -0,0 +1,103 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.form;
+
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.form.IPropertySelectionModel;
+
+/**
+ * Implementation of {@link IMultiplePropertySelectionRenderer} that
+ * produces a table of checkbox (<input type=checkbox>) elements.
+ *
+ * @version $Id$
+ * @author Sanjay Munjal
+ *
+ **/
+
+public class CheckBoxMultiplePropertySelectionRenderer
+ implements IMultiplePropertySelectionRenderer
+{
+
+ /**
+ * Writes the <table> element.
+ *
+ **/
+
+ public void beginRender(
+ MultiplePropertySelection component,
+ IMarkupWriter writer,
+ IRequestCycle cycle)
+ {
+ writer.begin("table");
+ writer.attribute("border", 0);
+ writer.attribute("cellpadding", 0);
+ writer.attribute("cellspacing", 2);
+ }
+
+ /**
+ * Closes the <table> element.
+ *
+ **/
+
+ public void endRender(
+ MultiplePropertySelection component,
+ IMarkupWriter writer,
+ IRequestCycle cycle)
+ {
+ writer.end(); // <table>
+ }
+
+ /**
+ * Writes a row of the table. The table contains two cells; the first is the checkbox,
+ * the second is the label for the checkbox.
+ *
+ **/
+
+ public void renderOption(
+ MultiplePropertySelection component,
+ IMarkupWriter writer,
+ IRequestCycle cycle,
+ IPropertySelectionModel model,
+ Object option,
+ int index,
+ boolean selected)
+ {
+ writer.begin("tr");
+ writer.begin("td");
+
+ writer.beginEmpty("input");
+ writer.attribute("type", "checkbox");
+ writer.attribute("name", component.getName());
+ writer.attribute("value", model.getValue(index));
+
+ if (component.isDisabled())
+ writer.attribute("disabled", "disabled");
+
+ if (selected)
+ writer.attribute("checked", "checked");
+
+ writer.end(); // <td>
+
+ writer.println();
+
+ writer.begin("td");
+ writer.print(model.getLabel(index));
+ writer.end(); // <td>
+ writer.end(); // <tr>
+
+ writer.println();
+ }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/FormConditional.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/FormConditional.java
new file mode 100644
index 0000000..c76fad0
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/FormConditional.java
@@ -0,0 +1,168 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.form;
+
+import java.io.IOException;
+
+import org.apache.tapestry.ApplicationRuntimeException;
+import org.apache.tapestry.IActionListener;
+import org.apache.tapestry.IBinding;
+import org.apache.tapestry.IForm;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.form.AbstractFormComponent;
+import org.apache.tapestry.request.RequestContext;
+import org.apache.tapestry.util.io.DataSqueezer;
+
+/**
+ * A conditional element on a page which will render its wrapped elements
+ * zero or one times.
+ *
+ * This component is a variant of {@link org.apache.tapestry.components.Conditional},
+ * but is designed for operation in a form. The component parameters are stored in
+ * hidden fields during rendering and are taken from those fields during the rewind,
+ * thus no StaleLink exceptions occur.
+ *
+ * [<a href="../../../../../ComponentReference/contrib.FormConditional.html">Component Reference</a>]
+ *
+ * @author Mindbridge
+ * @version $Id$
+ * @since 3.0
+ *
+ **/
+
+public abstract class FormConditional extends AbstractFormComponent
+{
+
+ protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
+ {
+ IForm form = getForm(cycle);
+
+ boolean cycleRewinding = cycle.isRewinding();
+
+ // If the cycle is rewinding, but not this particular form,
+ // then do nothing (don't even render the body).
+
+ if (cycleRewinding && !form.isRewinding())
+ return;
+
+ String name = form.getElementId(this);
+
+ boolean condition = getCondition(cycle, form, name);
+
+ // call listener
+ IActionListener listener = getListener();
+ if (listener != null)
+ listener.actionTriggered(this, cycle);
+
+ // render the component body only if the condition is true
+ if (condition) {
+ String element = getElement();
+
+ boolean render = !cycleRewinding && Tapestry.isNonBlank(element);
+
+ if (render)
+ {
+ writer.begin(element);
+ renderInformalParameters(writer, cycle);
+ }
+
+ renderBody(writer, cycle);
+
+ if (render)
+ writer.end(element);
+ }
+ }
+
+ private boolean getCondition(IRequestCycle cycle, IForm form, String name)
+ {
+ boolean condition;
+
+ if (!cycle.isRewinding())
+ {
+ condition = getCondition();
+ writeValue(form, name, condition);
+ }
+ else
+ {
+ RequestContext context = cycle.getRequestContext();
+ String submittedConditions[] = context.getParameters(name);
+ condition = convertValue(submittedConditions[0]);
+ }
+
+ IBinding conditionValueBinding = getConditionValueBinding();
+ if (conditionValueBinding != null)
+ conditionValueBinding.setBoolean(condition);
+
+ return condition;
+ }
+
+ private void writeValue(IForm form, String name, boolean value)
+ {
+ String externalValue;
+
+ Object booleanValue = new Boolean(value);
+ try
+ {
+ externalValue = getDataSqueezer().squeeze(booleanValue);
+ }
+ catch (IOException ex)
+ {
+ throw new ApplicationRuntimeException(
+ Tapestry.format("FormConditional.unable-to-convert-value", booleanValue),
+ this,
+ null,
+ ex);
+ }
+
+ form.addHiddenValue(name, externalValue);
+ }
+
+ private boolean convertValue(String value)
+ {
+ try
+ {
+ Object booleanValue = getDataSqueezer().unsqueeze(value);
+ return Tapestry.evaluateBoolean(booleanValue);
+ }
+ catch (IOException ex)
+ {
+ throw new ApplicationRuntimeException(
+ Tapestry.format("FormConditional.unable-to-convert-string", value),
+ this,
+ null,
+ ex);
+ }
+ }
+
+ private DataSqueezer getDataSqueezer()
+ {
+ return getPage().getEngine().getDataSqueezer();
+ }
+
+ public boolean isDisabled()
+ {
+ return false;
+ }
+
+ public abstract boolean getCondition();
+ public abstract String getElement();
+
+ public abstract IBinding getConditionValueBinding();
+
+ public abstract IActionListener getListener();
+
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/FormConditional.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/FormConditional.jwc
new file mode 100644
index 0000000..c2ba3d3
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/FormConditional.jwc
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.form.FormConditional">
+ <description>
+ Conditionally emulates an element and its attributes (if element is specified) and/or includes a block of content if a condition is met.
+ </description>
+
+ <parameter name="condition" type="boolean" direction="in" required="yes">
+ <description>
+ The condition to evaluate.
+ </description>
+ </parameter>
+
+ <parameter name="element" type="java.lang.String" direction="in" required="no">
+ <description>
+ The element to emulate.
+ </description>
+ </parameter>
+
+ <parameter name="listener" type="org.apache.tapestry.IActionListener" direction="in"/>
+
+ <parameter name="conditionValue" type="boolean">
+ <description>
+ The value of the condition. During render this is obtained from
+ the condition parameter. During rewind it is the submitted condition.
+ </description>
+ </parameter>
+
+ <reserved-parameter name="invert"/>
+
+ <property-specification name="name" type="java.lang.String"/>
+ <property-specification name="form" type="org.apache.tapestry.IForm"/>
+
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/IMultiplePropertySelectionRenderer.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/IMultiplePropertySelectionRenderer.java
new file mode 100644
index 0000000..a70af59
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/IMultiplePropertySelectionRenderer.java
@@ -0,0 +1,65 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.form;
+
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.form.IPropertySelectionModel;
+
+/**
+ * Defines an object that works with a {@link MultiplePropertySelection} component
+ * to render the individual elements obtained from the {@link IPropertySelectionModel model}.
+ *
+ * @version $Id$
+ * @author Sanjay Munjal
+ *
+ **/
+
+public interface IMultiplePropertySelectionRenderer
+{
+ /**
+ * Begins the rendering of the {@link MultiplePropertySelection}.
+ *
+ **/
+
+ public void beginRender(
+ MultiplePropertySelection component,
+ IMarkupWriter writer,
+ IRequestCycle cycle);
+
+ /**
+ * Invoked for each element obtained from the {@link IPropertySelectionModel model}.
+ *
+ **/
+
+ public void renderOption(
+ MultiplePropertySelection component,
+ IMarkupWriter writer,
+ IRequestCycle cycle,
+ IPropertySelectionModel model,
+ Object option,
+ int index,
+ boolean selected);
+
+ /**
+ * Ends the rendering of the {@link MultiplePropertySelection}.
+ *
+ **/
+
+ public void endRender(
+ MultiplePropertySelection component,
+ IMarkupWriter writer,
+ IRequestCycle cycle);
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.html
new file mode 100644
index 0000000..3e4b0a5
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.html
@@ -0,0 +1,5 @@
+<input jwcid="maskEdit" type="text"/>
+<input jwcid="maskValue" type="hidden"/>
+<span jwcid="maskEditScript"/>
+
+
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.java
new file mode 100644
index 0000000..7d596b4
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.java
@@ -0,0 +1,113 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.form;
+
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IBinding;
+
+/**
+ * Provides a mask edit HTML <input type="text"> form element.
+ * <p>
+ * Mask edit field validates the text the user enters against a
+ * mask that encodes the valid forms the text can take. The mask can
+ * also format text that is displayed to the user.
+ * <p>
+ * <table border="1" cellpadding="2">
+ * <tr>
+ * <th>Mask character</th><th>Meaning in mask</th>
+ * </tr>
+ * <tr>
+ * <td> l</td><td> Mixed case letter character [a..z, A..Z]</td>
+ * </tr>
+ * <tr>
+ * <td> L</td><td> Upper case letter character [A..Z]</td>
+ * </tr>
+ * <tr>
+ * <td> a</td><td> Mixed case alpha numeric character [a..z, A..Z, 0..1]</td>
+ * </tr>
+ * <tr>
+ * <td> A</td><td> Upper case alpha numeric character [A..Z, 0..9]</td>
+ * </tr>
+ * <tr>
+ * <td> #</td><td> Numeric character [0..9]</td>
+ * </tr>
+ * <tr>
+ * <td> _</td><td> Reserved character for display, do not use.</td>
+ * </tr>
+ * <tr>
+ * <td> others</td><td> Non editable character for display.</td>
+ * </tr>
+ * </table>
+ * <p>
+ * This component requires JavaScript to be enabled in the client browser.
+ * <p>
+ * [<a href="../../../../../ComponentReference/MaskEdit.html">Component Reference</a>]
+ *
+ * @author Malcolm Edgar
+ * @version $Id$
+ * @since 2.3
+ *
+ **/
+
+public class MaskEdit extends BaseComponent
+{
+ private String _mask;
+ private IBinding _valueBinding;
+ private boolean _disabled;
+
+ public String getMask()
+ {
+ return _mask;
+ }
+
+ public void setMask(String mask)
+ {
+ _mask = mask;
+ }
+
+ public String getValue()
+ {
+ if (_valueBinding != null) {
+ return _valueBinding.getString();
+ } else {
+ return null;
+ }
+ }
+
+ public void setValue(String value)
+ {
+ _valueBinding.setString(value);
+ }
+
+ public IBinding getValueBinding()
+ {
+ return _valueBinding;
+ }
+
+ public void setValueBinding(IBinding valueBinding)
+ {
+ _valueBinding = valueBinding;
+ }
+
+ public boolean isDisabled()
+ {
+ return _disabled;
+ }
+
+ public void setDisabled(boolean disabled)
+ {
+ _disabled = disabled;
+ }
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.js b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.js
new file mode 100644
index 0000000..9db04c8
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.js
@@ -0,0 +1,420 @@
+/**
+ * JavaScript Mask Edit control
+ * Paul Geerts
+ * Oct 2002
+ *
+ * Note: This probably only works for English
+ * Other languages have been deprecated and will be removed in the
+ * next version of Speech (TM)
+ **/
+
+var dontDoIt; // hack for Moz because it won't cancel events properly
+var isTab; // another Moz hack
+
+
+// Init the mask edit field by creating a lookalike DIV
+// and hiding the real one
+function initMask(field, maskField) {
+
+ if (field.disabled == true) {
+ return;
+ }
+
+ var mask = maskField.value;
+ var val = field.value;
+
+ if (!val) { // if there's no val, init it with empty mask
+ val = displayMask(mask);
+ field.value = displayMask(mask);
+ }
+ // create a div and add a bunch of spans
+ // and edits to it.
+ div = document.createElement("div");
+ div.style.backgroundColor = "white";
+ for (var i = 0 ; i < mask.length ; i++) {
+ var ds = document.createElement("SPAN");
+ var v = val.substr(i,1);
+ var m = mask.substr(i,1);
+ if (v==" ") {
+ v=" ";
+ }
+ ds.innerHTML = v;
+ ds.index = i;
+ ds.mask = m;
+ ds.div = div;
+ // if we can edit this char
+ // make a little tiny edit field
+ if (isEditChar(m)) {
+ var es = document.createElement("INPUT");
+ es.style.width = "1px";
+ es.style.border="0px";
+ es.index = i;
+ es.field = field;
+ es.mask = m;
+ es.display = ds;
+ ds.editField = es;
+ es.div = div;
+ div.appendChild(es); // set up some events
+ if (navigator.appName == "Microsoft Internet Explorer") {
+ addEvent("keypress", es, changeBitIE);
+ } else {
+ addEvent("keypress", es, changeBitNS);
+ }
+ addEvent("keydown", es, specialKey); // keydown handles stuff like home, end etc
+ addEvent("click", ds, click);
+ }
+
+ div.appendChild(ds);
+
+ }
+
+ // the final edit field on the end
+ var es =document.createElement("INPUT");
+ es.style.width = "1px";
+ es.style.border="0px";
+ es.div = div;
+ div.appendChild(es);
+ if (navigator.appName == "Microsoft Internet Explorer") {
+ addEvent("keypress", es, changeBitIE);
+ } else {
+ addEvent("keypress", es, changeBitNS);
+ }
+ addEvent("keydown", es, specialKey);
+
+ div.noWrap = true; // force single line display
+
+ formatDiv(div, field); // format the DIV to look like an edit box
+ field.style.display = 'none';
+ field.parentNode.insertBefore(div, field);
+ addEvent("click", div, divClick);
+}
+
+function formatDiv(div, field) {
+ // make it look like an IE edit
+ if (navigator.appName == "Microsoft Internet Explorer") {
+ div.style.fontFamily="courier";
+ div.style.fontSize="10pt";
+ div.style.width = field.offsetWidth;
+ div.style.height = field.offsetHeight;
+ if (navigator.appVersion.match(/6.0/)) { // IE 6 is different
+ div.style.border = "1px solid #7F9DB9";
+ } else {
+ div.style.borderLeft = "2px solid #606060";
+ div.style.borderTop = "2px solid #606060";
+ div.style.borderRight = "1px solid #aaaaaa";
+ div.style.borderBottom = "1px solid #aaaaaa";
+ }
+
+ } else {
+ // Mozilla edit look-a-like
+ div.style.fontFamily="courier";
+ div.style.fontSize="10pt";
+ div.style.border="2px inset #cccccc";
+ if (field.size) {
+ div.style.widh = 13 * field.size;
+ } else {
+ div.style.width = "130px";
+ }
+ }
+}
+
+
+function isEditChar(c) { // is this char a meaningful mask char
+ switch (c) {
+ case "_":
+ case "#":
+ case "a":
+ case "A":
+ case "l":
+ case "L":
+ return true;
+ default:
+ return false;
+ }
+ return false;
+}
+
+function displayMaskChar(c) { // display mask chars as _
+ if (isEditChar(c)) { // otherwise just show normal char
+ return "_";
+ } else {
+ return c;
+ }
+}
+
+function displayMask(mask) { // display entire mask using about subroutine
+ var d = "";
+ for (var i = 0 ; i < mask.length ; i++) {
+ d+=displayMaskChar(mask.substr(i,1));
+ }
+ return d;
+}
+
+function divClick(e) { // when the main DIV is clicked, focus the end of the edit
+ var d = getEventObject(e);
+ if (d && d.lastChild) {
+ try {
+ d.lastChild.focus();
+ } catch (e) {
+ // nuffin
+ }
+ }
+}
+
+function specialKey(e) { // deal with special keys like backspace, delete etc
+ var s = getEventObject(e);
+ var code = e.keyCode;
+ dontDoIt = true; // Moz needs these, as I can't seem to cancel events properly
+ isTab = false; // Moz can't handle tabs well either
+ switch (code) {
+ case 8: // backspace
+ var b = getPrevEdit(s);
+ if (b) {
+ b.display.innerHTML = displayMaskChar(b.mask);
+ var i = b.index;
+ b.field.value = b.field.value.substr(0, i) +
+ displayMaskChar(b.mask) + b.field.value.substr(i+1, b.field.value.length - i);
+ b.focus();
+ }
+ cancelEvent(e);
+ return false;
+ case 46: // delete
+ if (s.display) {
+ s.display.innerHTML = displayMaskChar(s.mask);
+ var i = s.index;
+ s.field.value = s.field.value.substr(0, i) + displayMaskChar(s.mask) +
+ s.field.value.substr(i+1, s.field.value.length - i);
+ }
+ cancelEvent(e);
+ return false;
+ break;
+ case 37: // left
+ var p = getPrevEdit(s);
+ if (p) {
+ p.focus();
+ }
+ cancelEvent(e);
+ return false;
+ case 39: // right
+ var n = getNextEdit(s);
+ if (n) {
+ n.focus();
+ }
+ cancelEvent(e);
+ return false;
+ case 36: // home
+ s.div.firstChild.focus();
+ cancelEvent(e);
+ return false;
+ case 35: // end
+ s.div.lastChild.focus();
+ cancelEvent(e);
+ return false;
+ case 9: // tab
+ if (navigator.appName == "Microsoft Internet Explorer") {
+ if (!e.shiftKey) {
+ s.div.lastChild.focus();
+ } else {
+ s.div.firstChild.focus();
+ }
+ return;
+ } else { // is mozilla/netscape
+ isTab = true; // best i can do really
+ }
+ break;
+ }
+
+ dontDoIt = false;
+}
+
+function moveForward(s) { // focus next edit
+ var b = getNextEdit(s);
+ if (b) {
+ b.focus();
+ }
+}
+
+function moveBackward(s) { // focus previous edit
+ var b = getPrevEdit(s);
+ if (b) {
+ b.focus();
+ }
+}
+
+function isInsertOK(code, s) { // check if you're good to insert a char
+ var mchar = s.mask;
+ switch (mchar) {
+ case "_":
+ return true;
+ break;
+ case "#":
+ return checkDigit(code);
+ break;
+ case "a":
+ return checkAlphaNumeric(code);
+ break;
+ case "A":
+ return checkUpCaseAlphaNumeric(code);
+ break;
+ case "l":
+ return checkAlpha(code);
+ break;
+ case "L":
+ return checkUpCaseAlpha(code);
+ break;
+ }
+ return false;
+}
+
+// functions to check the key code, good ol ASCII
+// fairly straightforward
+
+function checkDigit(code) {
+ if ((code>=48) && (code<=57)) {
+ return code;
+ } else {
+ return null;
+ }
+}
+
+function checkAlpha(code) {
+ if (((code>=65) && (code<=90)) || ((code>=97) && (code<=122))) {
+ return code;
+ } else {
+ return null;
+ }
+}
+
+function checkUpCaseAlpha(code) {
+ if ((code>=65) && (code<=90)) {
+ return code;
+ } else if ((code>=97) && (code<=122)) {
+ return code - 32;
+ } else {
+ return null;
+ }
+}
+
+function checkAlphaNumeric(code) {
+ if (((code>=65) && (code<=90)) || ((code>=97) && (code<=122)) || ((code>=48) && (code<=57))) {
+ return code;
+ } else {
+ return null;
+ }
+}
+
+function checkUpCaseAlphaNumeric(code) {
+ if ((code>=65) && (code<=90)) {
+ return code;
+ } else if ((code>=97) && (code<=122)) {
+ return code - 32;
+ } else if ((code>=48) && (code<=57)) {
+ return code;
+ } else {
+ return null;
+ }
+}
+
+
+function changeBitNS(e) { // handle key events in NS
+ var es = getEventObject(e);
+ if (!isTab) {
+ if (es.display) {
+ if (!dontDoIt) {
+ var code = e.charCode;
+ if (code = isInsertOK(code, es)) {
+ var c = String.fromCharCode(code);
+ es.display.innerHTML = c
+ var i = es.index;
+ es.field.value = es.field.value.substr(0, i) + c + es.field.value.substr(i+1, es.field.value.length - i);
+ moveForward(es);
+ }
+ }
+ es.value = "";
+ cancelEvent(e);
+ }
+ return false;
+ }
+}
+
+function changeBitIE(e) { // handle key events in IE
+ var es = getEventObject(e);
+ if (es.display) {
+ var code = e.keyCode;
+ if (code = isInsertOK(code, es)) {
+ var c = String.fromCharCode(code);
+ es.display.innerHTML = c;
+ var i = es.index;
+ es.field.value = es.field.value.substr(0, i) + c + es.field.value.substr(i+1, es.field.value.length - i);
+ moveForward(es);
+ es.value = "";
+ }
+ }
+ cancelEvent(e);
+ return false;
+}
+
+function click(e) { // clicking on a display span focuses the edit
+ var s = getEventObject(e);
+ s.editField.focus();
+ cancelEvent(e);
+ return false;
+}
+
+function getPrevEdit(s) { // get previous input field
+ var b = s.previousSibling;
+ while (b && (b.tagName!="INPUT")) {
+ b = b.previousSibling;
+ }
+ return b;
+}
+
+function getNextEdit(s) { // get previous next field
+ var b = s.nextSibling;
+ while (b && (b.tagName!="INPUT")) {
+ b = b.nextSibling;
+ }
+ return b;
+}
+
+function cancelEvent(e) { // kill event propagation
+ e.cancelBubble = true;
+ e.cancel = true;
+ if (navigator.appName != "Microsoft Internet Explorer") {
+ e.stopPropagation(); // doesn't seem to work for key events
+ e.preventDefault();
+ }
+}
+
+
+function getEventObject(e) { // utility function to retrieve object from event
+ if (navigator.appName == "Microsoft Internet Explorer") {
+ return e.srcElement;
+ } else { // is mozilla/netscape
+ // need to crawl up the tree to get the first "real" element
+ // i.e. a tag, not raw text
+ var o = e.target;
+ while (!o.tagName) {
+ o = o.parentNode;
+ }
+ return o;
+ }
+}
+
+function addEvent(name, obj, funct) { // utility function to add event handlers
+
+ if (navigator.appName == "Microsoft Internet Explorer") {
+ obj.attachEvent("on"+name, funct);
+ } else { // is mozilla/netscape
+ obj.addEventListener(name, funct, false);
+ }
+}
+
+function deleteEvent(name, obj, funct) { // utility function to delete event handlers
+
+ if (navigator.appName == "Microsoft Internet Explorer") {
+ obj.detachEvent("on"+name, funct);
+ } else { // is mozilla/netscape
+ obj.removeEventListener(name, funct, false);
+ }
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.jwc
new file mode 100644
index 0000000..a796fcb
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.jwc
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.form.MaskEdit" allow-informal-parameters="no">
+
+ <parameter name="mask" direction="in" type="java.lang.String" required="yes"/>
+ <parameter name="value" direction="custom" type="java.lang.String" required="yes"/>
+ <parameter name="disabled" direction="in" type="boolean" required="no"/>
+
+ <component id="maskEdit" type="TextField">
+ <binding name="value" expression="value"/>
+ <binding name="maxlength" expression="mask.length()"/>
+ <binding name="size" expression="mask.length()"/>
+ <binding name="disabled" expression="disabled"/>
+ </component>
+
+ <component id="maskValue" type="Hidden">
+ <binding name="value" expression="mask"/>
+ <binding name="encode" expression="false"/>
+ </component>
+
+ <component id="maskEditScript" type="Script">
+ <binding name="maskEdit" expression="components.maskEdit"/>
+ <binding name="maskValue" expression="components.maskValue"/>
+ <binding name="script" expression='"MaskEdit.script"'/>
+ </component>
+
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.script b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.script
new file mode 100644
index 0000000..e6c7756
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MaskEdit.script
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- $Id$ -->
+<!DOCTYPE script PUBLIC
+ "-//Howard Lewis Ship//Tapestry Script 1.2//EN"
+ "http://tapestry.sf.net/dtd/Script_1_2.dtd">
+
+<script>
+
+<include-script resource-path="/org/apache/tapestry/contrib/form/MaskEdit.js"/>
+
+<input-symbol key="maskEdit" class="org.apache.tapestry.form.TextField" required="yes"/>
+<input-symbol key="maskValue" class="org.apache.tapestry.form.Hidden" required="yes"/>
+
+<let key="formName">
+ ${maskEdit.form.name}
+</let>
+
+<let key="functionName">
+ ${maskEdit.name}_init
+</let>
+
+
+<body>
+function ${functionName}() {
+ initMask(document.${formName}.${maskEdit.name},
+ document.${formName}.${maskValue.name});
+}
+</body>
+
+<initialization>
+ ${functionName}();
+</initialization>
+
+</script>
+
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MultiplePropertySelection.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MultiplePropertySelection.java
new file mode 100644
index 0000000..3a412d3
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MultiplePropertySelection.java
@@ -0,0 +1,216 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.form;
+
+import java.util.List;
+
+import org.apache.tapestry.IBinding;
+import org.apache.tapestry.IForm;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.form.AbstractFormComponent;
+import org.apache.tapestry.form.IPropertySelectionModel;
+
+/**
+ * A component which uses <input type=checkbox> to
+ * set a property of some object. Typically, the values for the object
+ * are defined using an {@link org.apache.commons.lang.enum.Enum}. A MultiplePropertySelection is dependent on
+ * an {link IPropertySelectionModel} to provide the list of possible values.
+ *
+ * <p>Often, this is used to select one or more {@link org.apache.commons.lang.enum.Enum} to assign to a property; the
+ * {@link org.apache.tapestry.form.EnumPropertySelectionModel} class simplifies this.
+ *
+ * <p>The {@link org.apache.tapestry.contrib.palette.Palette} component
+ * is more powerful, but requires client-side JavaScript and
+ * is not fully cross-browser compatible.
+ *
+ * <p>
+ *
+ * <table border=1>
+ * <tr>
+ * <td>Parameter</td>
+ * <td>Type</td>
+ * <td>Direction</td>
+ * <td>Required</td>
+ * <td>Default</td>
+ * <td>Description</td>
+ * </tr>
+ *
+ * <tr>
+ * <td>selectedList</td>
+ * <td>java.util.List</td>
+ * <td>in-out</td>
+ * <td>yes</td>
+ * <td> </td>
+ * <td>The property to set. During rendering, this property is read, and sets
+ * the default value of the options in the select.
+ * When the form is submitted, list is cleared, then has each
+ * selected option added to it. </td> </tr>
+ *
+ * <tr>
+ * <td>renderer</td>
+ * <td>{@link IMultiplePropertySelectionRenderer}</td>
+ * <td>in</td>
+ * <td>no</td>
+ * <td>shared instance of {@link CheckBoxMultiplePropertySelectionRenderer}</td>
+ * <td>Defines the object used to render this component. The default
+ * renders a table of checkboxes.</td></tr>
+ *
+ * <tr>
+ * <td>model</td>
+ * <td>{@link IPropertySelectionModel}</td>
+ * <td>in</td>
+ * <td>yes</td>
+ * <td> </td>
+ * <td>The model provides a list of possible labels, and matches those labels
+ * against possible values that can be assigned back to the property.</td> </tr>
+ *
+ * <tr>
+ * <td>disabled</td>
+ * <td>boolean</td>
+ * <td>in</td>
+ * <td>no</td>
+ * <td>false</td>
+ * <td>Controls whether the <select> is active or not. A disabled PropertySelection
+ * does not update its value parameter.
+ *
+ * <p>Corresponds to the <code>disabled</code> HTML attribute.</td>
+ * </tr>
+ *
+ * </table>
+ *
+ * <p>Informal parameters are not allowed.
+ *
+ *
+ * @version $Id$
+ * @author Sanjay Munjal
+ *
+ **/
+
+public abstract class MultiplePropertySelection extends AbstractFormComponent
+{
+
+ /**
+ * A shared instance of {@link CheckBoxMultiplePropertySelectionRenderer}.
+ *
+ **/
+
+ public static final IMultiplePropertySelectionRenderer DEFAULT_CHECKBOX_RENDERER =
+ new CheckBoxMultiplePropertySelectionRenderer();
+
+ public abstract IBinding getSelectedListBinding();
+
+ protected void finishLoad()
+ {
+ setRenderer(DEFAULT_CHECKBOX_RENDERER);
+ }
+
+ /**
+ * Returns true if the component is disabled (this is relevant to the
+ * renderer).
+ *
+ **/
+
+ public abstract boolean isDisabled();
+
+ /**
+ * Renders the component, much of which is the responsiblity
+ * of the {@link IMultiplePropertySelectionRenderer renderer}. The possible options,
+ * their labels, and the values to be encoded in the form are provided
+ * by the {@link IPropertySelectionModel model}.
+ *
+ **/
+
+ protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
+ {
+ IForm form = getForm(cycle);
+
+ boolean rewinding = form.isRewinding();
+
+ String name = form.getElementId(this);
+
+ List selectedList = (List) getSelectedListBinding().getObject("selectedList", List.class);
+
+ if (selectedList == null)
+ throw Tapestry.createRequiredParameterException(this, "selectedList");
+
+ IPropertySelectionModel model = getModel();
+
+ if (model == null)
+ throw Tapestry.createRequiredParameterException(this, "model");
+
+ // Handle the form processing first.
+ if (rewinding)
+ {
+ // If disabled, ignore anything that comes up from the client.
+
+ if (isDisabled())
+ return;
+
+ // get all the values
+ String[] optionValues = cycle.getRequestContext().getParameters(name);
+
+ // Clear the list
+
+ selectedList.clear();
+
+ // Nothing was selected
+ if (optionValues != null)
+ {
+
+ // Go through the array and translate and put back in the list
+ for (int i = 0; i < optionValues.length; i++)
+ {
+ // Translate the new value
+ Object selectedValue = model.translateValue(optionValues[i]);
+
+ // Add this element in the list back
+ selectedList.add(selectedValue);
+ }
+ }
+
+ return;
+ }
+
+ IMultiplePropertySelectionRenderer renderer = getRenderer();
+
+ // Start rendering
+ renderer.beginRender(this, writer, cycle);
+
+ int count = model.getOptionCount();
+
+ for (int i = 0; i < count; i++)
+ {
+ Object option = model.getOption(i);
+
+ // Try to find the option in the list and if yes, then it is checked.
+ boolean optionSelected = selectedList.contains(option);
+
+ renderer.renderOption(this, writer, cycle, model, option, i, optionSelected);
+ }
+
+ // A PropertySelection doesn't allow a body, so no need to worry about
+ // wrapped components.
+ renderer.endRender(this, writer, cycle);
+ }
+
+ public abstract IPropertySelectionModel getModel();
+
+ public abstract IMultiplePropertySelectionRenderer getRenderer();
+
+ public abstract void setRenderer(IMultiplePropertySelectionRenderer renderer);
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MultiplePropertySelection.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MultiplePropertySelection.jwc
new file mode 100644
index 0000000..ae91cb2
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/form/MultiplePropertySelection.jwc
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.form.MultiplePropertySelection"
+ allow-body="no" allow-informal-parameters="no">
+
+ <parameter name="model"
+ type="org.apache.tapestry.form.IPropertySelectionModel" required="yes" direction="in"/>
+
+ <parameter name="selectedList" type="java.util.List" required="yes"/>
+
+ <parameter name="disabled" type="boolean" direction="in"/>
+
+ <parameter name="renderer"
+ type="org.apache.tapestry.contrib.form.IMultiplePropertySelectionRenderer"
+ direction="in"/>
+
+ <property-specification name="name" type="java.lang.String"/>
+ <property-specification name="form" type="org.apache.tapestry.IForm"/>
+
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/informal/InheritInformalAny.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/informal/InheritInformalAny.java
new file mode 100644
index 0000000..f50d4b9
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/informal/InheritInformalAny.java
@@ -0,0 +1,117 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.informal;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.tapestry.AbstractComponent;
+import org.apache.tapestry.IAsset;
+import org.apache.tapestry.IBinding;
+import org.apache.tapestry.IComponent;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.spec.IComponentSpecification;
+
+/**
+ *
+ * A version of the Any component that inherits the informal attributes of its parent.
+ * This component has been deprecated in favour of the 'inherit-informal-parameters'
+ * tag that indicates that a particular component must inherit the informal parameters
+ * of its parent. This tag is available in the page or component specification file.
+ *
+ * @deprecated
+ * @version $Id$
+ * @author mindbridge
+ * @since 2.2
+ *
+ **/
+
+public class InheritInformalAny extends AbstractComponent
+{
+ // Bindings
+ private IBinding m_objElementBinding;
+
+ public IBinding getElementBinding()
+ {
+ return m_objElementBinding;
+ }
+
+ public void setElementBinding(IBinding objElementBinding)
+ {
+ m_objElementBinding = objElementBinding;
+ }
+
+ protected void generateParentAttributes(IMarkupWriter writer, IRequestCycle cycle)
+ {
+ String attribute;
+
+ IComponent objParent = getContainer();
+ if (objParent == null)
+ return;
+
+ IComponentSpecification specification = objParent.getSpecification();
+ Map bindings = objParent.getBindings();
+ if (bindings == null)
+ return;
+
+ Iterator i = bindings.entrySet().iterator();
+
+ while (i.hasNext())
+ {
+ Map.Entry entry = (Map.Entry) i.next();
+ String name = (String) entry.getKey();
+
+ // Skip over formal parameters stored in the bindings
+ // Map. We're just interested in informal parameters.
+
+ if (specification.getParameter(name) != null)
+ continue;
+
+ IBinding binding = (IBinding) entry.getValue();
+
+ Object value = binding.getObject();
+ if (value == null)
+ continue;
+
+ if (value instanceof IAsset)
+ {
+ IAsset asset = (IAsset) value;
+
+ // Get the URL of the asset and insert that.
+ attribute = asset.buildURL(cycle);
+ }
+ else
+ attribute = value.toString();
+
+ writer.attribute(name, attribute);
+ }
+
+ }
+
+ public void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
+ {
+ String strElement = m_objElementBinding.getObject().toString();
+
+ writer.begin(strElement);
+ generateParentAttributes(writer, cycle);
+ renderInformalParameters(writer, cycle);
+
+ renderBody(writer, cycle);
+
+ writer.end();
+ }
+
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/informal/InheritInformalAny.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/informal/InheritInformalAny.jwc
new file mode 100644
index 0000000..e9d9eb1
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/informal/InheritInformalAny.jwc
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.informal.InheritInformalAny" allow-body="yes" allow-informal-parameters="yes">
+ <parameter name="element" type="java.lang.String" required="yes" direction="custom"/>
+</component-specification>
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_HRp4.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_HRp4.gif
new file mode 100644
index 0000000..42ff5ec
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_HRp4.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_Hp3.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_Hp3.gif
new file mode 100644
index 0000000..5f2860d
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_Hp3.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_NBanner.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_NBanner.gif
new file mode 100644
index 0000000..0105a1b
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_NBanner.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_NRp2.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_NRp2.gif
new file mode 100644
index 0000000..8590996
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_NRp2.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_Np1.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_Np1.gif
new file mode 100644
index 0000000..78ee58c
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Engine_Np1.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.css b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.css
new file mode 100644
index 0000000..c8852b0
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.css
@@ -0,0 +1,201 @@
+H1 {
+ font-size: 12pt;
+ font-weight: bold;
+
+}
+
+H2 {}
+
+H3 {}
+
+A {
+ color:#ffffff;
+}
+
+A:Visited {}
+
+A:Active {}
+
+A:Hover {}
+
+SPAN.error
+{
+ color: Red;
+ font-weight: bold;
+ background-color : "#330066"
+}
+
+BODY {
+ font-family: "Trebuchet MS", sans-serif;
+ background-color: #839cd1;
+}
+
+
+TABLE.inspector-data TR.odd TD {
+ text-align : left;
+ color : Black;
+ background-color : Silver;
+}
+
+
+TABLE.inspector-data TR.even TH
+{
+ text-align : right;
+ font-weight: bold;
+}
+
+TABLE.inspector-data TR.odd TH
+{
+ text-align: right;
+ color : Black;
+ background-color : Silver;
+ font-weight: bold;
+}
+
+TABLE.inspector-data TR.even TD {
+ text-align : left;
+}
+
+TABLE.inspector-data,
+TABLE.selector
+{
+ font-size: 9pt;
+}
+
+TABLE.selector TD.page-link
+{
+ font-style: italic;
+}
+
+TABLE.selector TD
+{
+ verticle-align: center;
+}
+
+TABLE.inspector-data TR.heading TH,
+TABLE.template TH
+{
+ text-align: center;
+ color : White;
+ background-color : "#330066";
+ font-weight: bold;
+}
+
+TABLE.template TD
+{
+ background-color: Silver;
+ font-size: small;
+}
+
+SPAN.message
+{
+ color : Silver
+ font-size: large;
+}
+
+SPAN.jwc-tag
+{
+ font-weight: bold;
+}
+
+SPAN.jwc-id, SPAN.localized-string
+{
+ font-style: italic;
+}
+
+
+
+TABLE.request-context-border {
+ border-width : 1;
+ border-color : Black;
+ font-size: 9pt;
+}
+
+SPAN.request-context-object {
+ font-weight : bold;
+ text-align : left;
+ font-size: 12pt;
+}
+
+TR.request-context-section TH {
+ text-align : center;
+ color : White;
+ background-color : Blue;
+}
+
+TR.request-context-header TH {
+ text-align : center;
+ color : White;
+ background-color : Blue;
+}
+
+TABLE.request-context-object TR.odd TD {
+ text-align : left;
+ color : Black;
+ background-color : Silver;
+}
+
+TABLE.request-context-object TR.odd TH {
+ color : Black;
+ background-color : Silver;
+ text-align : right;
+}
+
+TABLE.request-context-object TR.even TD {
+ text-align : left;
+}
+
+TABLE.request-context-object TR.even TH {
+ text-align : right;
+}
+
+TABLE.request-context-object {
+ width : 100%;
+ font-size: 9pt;
+}
+
+TABLE.request-context-object TR {
+ vertical-align : text-top;
+}
+
+TABLE.exception-display TR.even {
+ top : auto;
+}
+
+TABLE.exception-displaY TD
+{
+ width: 100%;
+}
+
+TABLE.exception-display TR.even TH {
+ text-align : right;
+ font-weight : bold;
+}
+
+TABLE.exception-display TR.odd TD {
+ text-align : left;
+ background-color : Silver;
+}
+
+TABLE.exception-display TR.odd TH {
+ text-align : right;
+ font-weight : bold;
+ background-color : Silver;
+}
+
+TABLE.exception-display TR.even TD {
+ text-align : left;
+}
+
+TABLE.exception-display TR.stack-trace {
+ font-size : small;
+ font-family : sans-serif;
+ text-align : left;
+}
+
+UL
+{
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-left: 20px;
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.html
new file mode 100644
index 0000000..42d16d6
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.html
@@ -0,0 +1,31 @@
+<!-- $Id$ -->
+<span jwcid="@Shell" title="ognl:inspectorTitle" stylesheet="ognl:assets.stylesheet">
+<body jwcid="@Body">
+
+<span jwcid="@inspector:Selector">
+
+<span jwcid="@inspector:ViewTabs">
+
+<span jwcid="@RenderBlock" block="ognl:blockForView"/>
+
+</span>
+</span>
+
+<span jwcid="specificationBlock@Block">
+<span jwcid="@inspector:ShowSpecification"/>
+</span>
+
+<span jwcid="templateBlock@Block">
+<span jwcid="@inspector:ShowTemplate"/>
+</span>
+
+<span jwcid="propertiesBlock@Block">
+<span jwcid="@inspector:ShowProperties"/>
+</span>
+
+<span jwcid="engineBlock@Block">
+<span jwcid="@inspector:ShowEngine"/>
+</span>
+
+</body>
+</span>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.java
new file mode 100644
index 0000000..631e893
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.java
@@ -0,0 +1,145 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tapestry.IComponent;
+import org.apache.tapestry.IPage;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.components.Block;
+import org.apache.tapestry.html.BasePage;
+
+/**
+ * The Tapestry Inspector page.
+ *
+ * @author Howard Lewis Ship
+ * @version $Id$
+ **/
+
+public abstract class Inspector extends BasePage
+{
+ private Map _blocks = new HashMap();
+
+ protected void finishLoad()
+ {
+ _blocks.put(View.TEMPLATE, getComponent("templateBlock"));
+ _blocks.put(View.SPECIFICATION, getComponent("specificationBlock"));
+ _blocks.put(View.ENGINE, getComponent("engineBlock"));
+ _blocks.put(View.PROPERTIES, getComponent("propertiesBlock"));
+ }
+
+ public abstract View getView();
+
+ public abstract void setView(View value);
+
+ public abstract String getInspectedPageName();
+
+ public abstract void setInspectedPageName(String value);
+
+ public abstract String getInspectedIdPath();
+
+ public abstract void setInspectedIdPath(String value);
+
+ /**
+ * Invoked to change the component being inspected within the current
+ * page.
+ *
+ * @since 1.0.6
+ **/
+
+ public void selectComponent(String idPath)
+ {
+ setInspectedIdPath(idPath);
+ }
+
+ /**
+ * Method invoked by the {@link InspectorButton} component,
+ * to begin inspecting a page.
+ *
+ **/
+
+ public void inspect(String pageName, IRequestCycle cycle)
+ {
+ setInspectedPageName(pageName);
+ selectComponent((String) null);
+
+ cycle.activate(this);
+ }
+
+ /**
+ * Listener for the component selection, which allows a particular component.
+ *
+ * <p>The context is a single string,
+ * the id path of the component to be selected (or null to inspect
+ * the page itself). This invokes
+ * {@link #selectComponent(String)}.
+ *
+ **/
+
+ public void selectComponent(IRequestCycle cycle)
+ {
+ Object[] parameters = cycle.getServiceParameters();
+
+ String newIdPath;
+
+ // The up button may generate a null context.
+
+ if (parameters == null)
+ newIdPath = null;
+ else
+ newIdPath = (String) parameters[0];
+
+ selectComponent(newIdPath);
+ }
+
+ /**
+ * Returns the {@link IPage} currently inspected by the Inspector, as determined
+ * from the inspectedPageName property.
+ *
+ **/
+
+ public IPage getInspectedPage()
+ {
+ return getRequestCycle().getPage(getInspectedPageName());
+ }
+
+ /**
+ * Returns the {@link IComponent} current inspected; this is determined
+ * from the inspectedPageName and inspectedIdPath properties.
+ *
+ **/
+
+ public IComponent getInspectedComponent()
+ {
+ return getInspectedPage().getNestedComponent(getInspectedIdPath());
+ }
+
+ public String getInspectorTitle()
+ {
+ return "Tapestry Inspector: " + getEngine().getSpecification().getName();
+ }
+
+ /**
+ * Returns the {@link Block} for the currently selected view.
+ *
+ **/
+
+ public Block getBlockForView()
+ {
+ return (Block) _blocks.get(getView());
+ }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.library b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.library
new file mode 100644
index 0000000..17e172a
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.library
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- Inspector.library,v 1.1 2002/08/24 16:07:50 hship Exp -->
+<!DOCTYPE library-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<library-specification/>
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.page b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.page
new file mode 100644
index 0000000..03b88a4
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Inspector.page
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE page-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<page-specification class="org.apache.tapestry.contrib.inspector.Inspector">
+
+ <property-specification name="view" type="org.apache.tapestry.contrib.inspector.View"
+ persistent="yes"
+ initial-value="@org.apache.tapestry.contrib.inspector.View@SPECIFICATION"/>
+ <property-specification name="inspectedPageName" type="java.lang.String" persistent="yes"/>
+ <property-specification name="inspectedIdPath" type="java.lang.String" persistent="yes"/>
+
+ <private-asset name="stylesheet" resource-path="Inspector.css"/>
+
+</page-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.html
new file mode 100644
index 0000000..aa38e55
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.html
@@ -0,0 +1,10 @@
+<!-- $Id$ -->
+
+<span jwcid="$content$">
+
+<div id="tapestryInspector" style="position:absolute; border-color:black; border-width:2px; border-style:solid; padding:3px; background-color:#839cd1;">
+<a jwcid="link"><img jwcid="rollover"/></a>
+</div>
+
+</span>
+
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.java
new file mode 100644
index 0000000..9fd512d
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.java
@@ -0,0 +1,133 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tapestry.ApplicationRuntimeException;
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IDirect;
+import org.apache.tapestry.IEngine;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.IResourceLocation;
+import org.apache.tapestry.IScript;
+import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.engine.IEngineService;
+import org.apache.tapestry.engine.ILink;
+import org.apache.tapestry.engine.IScriptSource;
+import org.apache.tapestry.html.Body;
+
+/**
+ * Component that can be placed into application pages that will launch
+ * the inspector in a new window.
+ *
+ * [<a href="../../../../../../ComponentReference/InspectorButton.html">Component Reference</a>]
+ *
+ * <p>Because the InspectorButton component is implemented using a {@link org.apache.tapestry.html.Rollover},
+ * the containing page must use a {@link Body} component instead of
+ * a <body> tag.
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public class InspectorButton extends BaseComponent implements IDirect
+{
+ private boolean _disabled = false;
+
+ /**
+ * Gets the listener for the link component.
+ *
+ * @since 1.0.5
+ **/
+
+ public void trigger(IRequestCycle cycle)
+ {
+ String name = getNamespace().constructQualifiedName("Inspector");
+
+ Inspector inspector = (Inspector) cycle.getPage(name);
+
+ inspector.inspect(getPage().getPageName(), cycle);
+ }
+
+ /**
+ * Renders the script, then invokes the normal implementation.
+ *
+ * @since 1.0.5
+ **/
+
+ protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
+ {
+ if (_disabled || cycle.isRewinding())
+ return;
+
+ IEngine engine = getPage().getEngine();
+ IScriptSource source = engine.getScriptSource();
+
+ IResourceLocation scriptLocation =
+ getSpecification().getSpecificationLocation().getRelativeLocation(
+ "InspectorButton.script");
+
+ IScript script = source.getScript(scriptLocation);
+
+ Map symbols = new HashMap();
+
+ IEngineService service = engine.getService(Tapestry.DIRECT_SERVICE);
+ ILink link = service.getLink(cycle, this, null);
+
+ symbols.put("URL", link.getURL());
+
+ Body body = Body.get(cycle);
+
+ if (body == null)
+ throw new ApplicationRuntimeException(
+ Tapestry.getMessage("InspectorButton.must-be-contained-by-body"),
+ this,
+ null,
+ null);
+
+ script.execute(cycle, body, symbols);
+
+ // Now, go render the rest from the template.
+
+ super.renderComponent(writer, cycle);
+ }
+
+ public boolean isDisabled()
+ {
+ return _disabled;
+ }
+
+ public void setDisabled(boolean disabled)
+ {
+ _disabled = disabled;
+ }
+
+ /**
+ * Always returns false.
+ *
+ * @since 2.3
+ *
+ **/
+
+ public boolean isStateful()
+ {
+ return false;
+ }
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.jwc
new file mode 100644
index 0000000..cccf00d
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.jwc
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.inspector.InspectorButton"
+ allow-body="no"
+ allow-informal-parameters="no">
+
+ <description>
+<![CDATA[
+Includes the Inspector button on the page (which dynamically positions itself in the
+lower right corner). Clicking the button raises the Tapestry Inspector in a pop-up
+window.
+]]>
+ </description>
+
+ <parameter name="disabled" type="boolean" direction="in"/>
+
+ <component id="link" type="GenericLink">
+ <static-binding name="href">javascript:ti_raiseInspector();</static-binding>
+ </component>
+
+ <component id="rollover" type="Rollover">
+ <binding name="image" expression="assets.logo"/>
+ <binding name="focus" expression="assets.inspector"/>
+ </component>
+
+ <private-asset name="logo" resource-path="tapestry-logo.gif"/>
+ <private-asset name="inspector" resource-path="inspector-rollover.gif"/>
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.script b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.script
new file mode 100644
index 0000000..a0e1f31
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/InspectorButton.script
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- $Id$ -->
+<!DOCTYPE script PUBLIC
+ "-//Howard Lewis Ship//Tapestry Script 1.2//EN"
+ "http://tapestry.sf.net/dtd/Script_1_2.dtd">
+<!--
+
+Adds scripting support for the ShowInspector component.
+
+Prefixes all variables and functions with "ti_" (for Tapestry Inspector).
+
+Expects that the Inspector is inside a <div> named "tapestryInspector".
+
+Input symbols:
+ URL - The complete URL needed for to raise the Inspector
+
+-->
+<script>
+
+<include-script resource-path="/org/apache/tapestry/html/PracticalBrowserSniffer.js"/>
+
+<input-symbol key="URL" class="java.lang.String" required="yes"/>
+
+<body>
+var ti = new Object();
+
+ti.oldX = 0;
+ti.oldY = 0;
+
+function ti_positionInspector()
+{
+ var object;
+ var width;
+ var height;
+
+ if (navigator.family == "nn4")
+ {
+ object = document.tapestryInspector;
+ width = innerWidth + pageXOffset; <!-- Doesn't properly account for scrollbars! -->
+ height = innerHeight + pageYOffset;
+ }
+ else
+ {
+ object = document.getElementById("tapestryInspector");
+
+ if (navigator.OS == "mac")
+ {
+ width = document.body.offsetWidth;
+ height = document.body.offsetWidth;
+ }
+ else if (navigator.family == "gecko")
+ {
+ width = innerWidth + pageXOffset;
+ height = innerHeight + pageYOffset;
+ }
+ else
+ {
+ // IE 5, 6? on PC
+ width = document.body.clientWidth + document.body.scrollLeft;
+ height = document.body.clientHeight + document.body.scrollTop;
+ }
+ }
+
+ // The width/height of the animation, plus
+ // a couple of pixels of border.
+
+ var indent = 65;
+
+ var x = width - indent;
+ var y = height - indent;
+
+ if (navigator.family == "nn4")
+ {
+ if (x != ti.oldX || y != ti.oldY)
+ {
+ object.moveTo(x, y);
+ object.visibility = "visible";
+ }
+ }
+ else
+ {
+ if (x != ti.oldX)
+ {
+ object.style.left = x + "px";
+ ti.oldX = x;
+ }
+ if (y != ti.oldY)
+ {
+ object.style.top = y + "px";
+ ti.oldY = y;
+ }
+
+ object.style.visibility = "visible";
+ }
+
+
+
+ // Reposition it every quarter second.
+
+ window.setTimeout("ti_positionInspector()", 250);
+}
+
+function ti_raiseInspector()
+{
+ var newWindow = window.open(
+ "${URL}",
+ "TapestryInspector",
+ "titlebar,resizable,scrollbars,width=700,height=600");
+
+ newWindow.focus();
+}
+</body>
+
+<initialization>
+ti_positionInspector();
+</initialization>
+
+</script>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_HRp4.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_HRp4.gif
new file mode 100644
index 0000000..e2fe821
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_HRp4.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_Hp3.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_Hp3.gif
new file mode 100644
index 0000000..8aa25cb
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_Hp3.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_NBanner.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_NBanner.gif
new file mode 100644
index 0000000..5fa7f5b
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_NBanner.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_NRp2.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_NRp2.gif
new file mode 100644
index 0000000..12b13a1
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_NRp2.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_Np1.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_Np1.gif
new file mode 100644
index 0000000..917436a
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Properties_Np1.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_NRp2.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_NRp2.gif
new file mode 100644
index 0000000..371cba0
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_NRp2.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_Np1.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_Np1.gif
new file mode 100644
index 0000000..eb87bf4
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_Np1.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_Np1_disabled.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_Np1_disabled.gif
new file mode 100644
index 0000000..0cfdd51
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Reset_Np1_disabled.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Restart_NRp2.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Restart_NRp2.gif
new file mode 100644
index 0000000..8fed715
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Restart_NRp2.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Restart_Np1.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Restart_Np1.gif
new file mode 100644
index 0000000..dda92b0
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Restart_Np1.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.html
new file mode 100644
index 0000000..15ecbf7
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.html
@@ -0,0 +1,23 @@
+<!-- $Id$ -->
+
+<table class="selector">
+ <tr valign=center>
+ <td>
+ <form jwcid="form">
+ <select jwcid="selectPage"/>
+ </form>
+ </td>
+ <td class="page-link">
+ <a jwcid="page">page</a>
+ </td>
+<span jwcid="e">
+ <td>>></td>
+ <td>
+ <a jwcid="component"><span jwcid="insertId"/></a>
+ </td>
+</span>
+ </tr>
+</table>
+
+<span jwcid="renderBody"/>
+
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.java
new file mode 100644
index 0000000..158025d
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.java
@@ -0,0 +1,150 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IComponent;
+import org.apache.tapestry.INamespace;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.engine.ISpecificationSource;
+import org.apache.tapestry.form.IPropertySelectionModel;
+import org.apache.tapestry.form.StringPropertySelectionModel;
+
+/**
+ * Component of the {@link Inspector} page used to select the page and "crumb trail"
+ * of the inspected component.
+ *
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public class Selector extends BaseComponent
+{
+ /**
+ * When the form is submitted,
+ * the inspectedPageName of the {@link Inspector} page will be updated,
+ * but we need to reset the inspectedIdPath as well.
+ *
+ **/
+
+ public void formSubmit(IRequestCycle cycle)
+ {
+ Inspector inspector = (Inspector) getPage();
+
+ inspector.selectComponent((String) null);
+ }
+
+ /**
+ * Returns an {IPropertySelectionModel} used to select the name of the page
+ * to inspect. The page names are sorted.
+ *
+ **/
+
+ public IPropertySelectionModel getPageModel()
+ {
+ return new StringPropertySelectionModel(getPageNames());
+ }
+
+ /**
+ * The crumb trail is all the components from the inspected component up to
+ * (but not including) the page.
+ *
+ **/
+
+ public List getCrumbTrail()
+ {
+ List result = null;
+
+ Inspector inspector = (Inspector) getPage();
+ IComponent component = inspector.getInspectedComponent();
+ IComponent container = null;
+
+ while (true)
+ {
+ container = component.getContainer();
+ if (container == null)
+ break;
+
+ if (result == null)
+ result = new ArrayList();
+
+ result.add(component);
+
+ component = container;
+ }
+
+ if (result == null)
+ return null;
+
+ // Reverse the list, such that the inspected component is last, and the
+ // top-most container is first.
+
+ Collections.reverse(result);
+
+ return result;
+ }
+
+ private String[] getPageNames()
+ {
+ Set names = new HashSet();
+
+ ISpecificationSource source = getPage().getEngine().getSpecificationSource();
+
+ addPageNames(names, source.getFrameworkNamespace());
+ addPageNames(names, source.getApplicationNamespace());
+
+ List l = new ArrayList(names);
+ Collections.sort(l);
+
+ return (String[]) l.toArray(new String[l.size()]);
+ }
+
+ private void addPageNames(Set names, INamespace namespace)
+ {
+ String idPrefix = namespace.getExtendedId();
+
+ List pageNames = namespace.getPageNames();
+ int count = pageNames.size();
+
+ for (int i = 0; i < count; i++)
+ {
+ String name = (String) pageNames.get(i);
+
+ if (idPrefix == null)
+ names.add(name);
+ else
+ names.add(idPrefix + ":" + name);
+ }
+
+ List ids = namespace.getChildIds();
+ count = ids.size();
+
+ for (int i = 0; i < count; i++)
+ {
+ String id = (String) ids.get(i);
+
+ addPageNames(names, namespace.getChildNamespace(id));
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.jwc
new file mode 100644
index 0000000..dee4b40
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Selector.jwc
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.inspector.Selector">
+
+ <component id="form" type="Form">
+ <binding name="listener" expression="listeners.formSubmit"/>
+ </component>
+
+ <component id="selectPage" type="PropertySelection">
+ <binding name="value" expression="page.inspectedPageName"/>
+ <binding name="model" expression="pageModel"/>
+ <binding name="submitOnChange" expression="true"/>
+ </component>
+
+ <component id="page" type="DirectLink">
+ <binding name="listener" expression="page.listeners.selectComponent"/>
+ </component>
+
+ <component id="e" type="Foreach">
+ <binding name="source" expression="crumbTrail"/>
+ </component>
+
+ <component id="component" type="DirectLink">
+ <binding name="parameters" expression="components.e.value.idPath"/>
+ <binding name="listener" expression="page.listeners.selectComponent"/>
+ </component>
+
+ <component id="insertId" type="Insert">
+ <binding name="value" expression="components.e.value.id"/>
+ </component>
+
+ <component id="renderBody" type="RenderBody"/>
+
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowDescription.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowDescription.html
new file mode 100644
index 0000000..917e59c
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowDescription.html
@@ -0,0 +1,5 @@
+<!-- $Id$ -->
+
+<span jwcid="$content$">
+<span jwcid="ifDescription"><img jwcid="descriptionImage"/></span>
+</span>
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowDescription.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowDescription.jwc
new file mode 100644
index 0000000..28466ca
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowDescription.jwc
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.BaseComponent"
+ allow-body="no"
+ allow-informal-parameters="no">
+
+ <parameter name="description" required="yes"/>
+
+ <component id="ifDescription" type="Conditional">
+ <inherited-binding name="condition" parameter-name="description"/>
+ </component>
+
+ <component id="descriptionImage" type="Image">
+ <binding name="image" expression="assets.info"/>
+ <inherited-binding name="alt" parameter-name="description"/>
+ </component>
+
+ <private-asset name="info" resource-path="info.gif"/>
+
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.html
new file mode 100644
index 0000000..797c8ff
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.html
@@ -0,0 +1,90 @@
+<!-- $Id$ -->
+
+<table class="inspector-data">
+
+ <tr class="heading">
+ <th colspan=2>Engine/Application Properties</th>
+ </tr>
+
+ <tr class="heading">
+ <th>Name</th> <th>Property</th>
+ </tr>
+
+ <tr class="even">
+ <th>Tapestry Framework Version</th>
+ <td><span jwcid="insertFrameworkVersion"/></td>
+ </tr>
+
+ <tr class="odd">
+ <th>Application Name</th>
+ <td><span jwcid="insertApplicationName"/></td>
+ </tr>
+
+ <tr class="even">
+ <th>Context Path</th>
+ <td><span jwcid="insertContextPath"/></td>
+ </tr>
+
+ <tr class="odd">
+ <th>Servlet Path</th>
+ <td><span jwcid="insertServletPath"/></td>
+ </tr>
+
+ <tr class="even">
+ <th>Engine Class</th>
+ <td><span jwcid="insertEngineClass"/></td>
+ </tr>
+
+ <tr class="odd">
+ <th>Locale</th>
+ <td><span jwcid="insertLocale"/></td>
+ </tr>
+
+ <tr class="even">
+ <th>Visit</th>
+ <td>
+<span jwcid="ifNoVisit">
+<em>none</em>
+</span>
+
+<span jwcid="ifVisit">
+<span jwcid="insertVisit"/>
+</span>
+ </td>
+ </tr>
+
+</table>
+
+<h1>Operations</h1>
+
+<table class="inspector-data">
+
+ <tr class="even">
+ <td><a jwcid="restart" target="_new"><img jwcid="restartButton"/></a>
+ </td>
+ <td>Restart the application (in a new window).
+ </td>
+ </tr>
+
+ <tr class="even">
+ <td><a jwcid="reset"><img jwcid="resetButton"/></a>
+ </td>
+ <td>
+ Reset the application, discarding all cached specifications, assets
+ and templates.
+ </td>
+ </tr>
+</table>
+
+<h1>Serialized Engine</h1>
+
+<p>The serialized state of the application engine (the size of this is relevant
+for application servers which support clustering).
+
+<p><span jwcid="insertByteCount"/> bytes:
+<pre><span jwcid="insertSerializedEngine"/></pre>
+
+<h1>Request Context</h1>
+
+<span jwcid="insertRequest"/>
+
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.java
new file mode 100644
index 0000000..0b9dc71
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.java
@@ -0,0 +1,186 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import java.io.ByteArrayOutputStream;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+
+import org.apache.tapestry.ApplicationRuntimeException;
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRender;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.event.PageDetachListener;
+import org.apache.tapestry.event.PageEvent;
+import org.apache.tapestry.util.io.BinaryDumpOutputStream;
+
+/**
+ * Component of the {@link Inspector} page used to display
+ * the properties of the {@link org.apache.tapestry.IEngine} as well as a serialized view of it.
+ * Also, the {@link org.apache.tapestry.request.RequestContext} is dumped out.
+ *
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public class ShowEngine extends BaseComponent implements PageDetachListener
+{
+ private byte[] serializedEngine;
+
+ public void pageDetached(PageEvent event)
+ {
+ serializedEngine = null;
+ }
+
+ /**
+ * Workaround for OGNL limitation --- OGNL can't dereference
+ * past class instances.
+ *
+ * @since 2.2
+ *
+ **/
+
+ public String getEngineClassName()
+ {
+ return getPage().getEngine().getClass().getName();
+ }
+
+ private byte[] getSerializedEngine()
+ {
+ if (serializedEngine == null)
+ buildSerializedEngine();
+
+ return serializedEngine;
+ }
+
+ private void buildSerializedEngine()
+ {
+ ByteArrayOutputStream bos = null;
+ ObjectOutputStream oos = null;
+
+ try
+ {
+ bos = new ByteArrayOutputStream();
+ oos = new ObjectOutputStream(bos);
+
+ // Write the application object to the stream.
+
+ oos.writeObject(getPage().getEngine());
+
+ // Extract the application as an array of bytes.
+
+ serializedEngine = bos.toByteArray();
+ }
+ catch (IOException ex)
+ {
+ throw new ApplicationRuntimeException(
+ Tapestry.getMessage("ShowEngine.could-not-serialize"),
+ ex);
+ }
+ finally
+ {
+ close(oos);
+ close(bos);
+ }
+
+ // It would be nice to deserialize the application object now, but in
+ // practice, that fails due to class loader problems.
+ }
+
+ private void close(OutputStream stream)
+ {
+ if (stream == null)
+ return;
+
+ try
+ {
+ stream.close();
+ }
+ catch (IOException ex)
+ {
+ // Ignore.
+ }
+ }
+
+ public int getEngineByteCount()
+ {
+ return getSerializedEngine().length;
+ }
+
+ public IRender getEngineDumpDelegate()
+ {
+ return new IRender()
+ {
+ public void render(IMarkupWriter writer, IRequestCycle cycle)
+ {
+ dumpSerializedEngine(writer);
+ }
+ };
+ }
+
+ private void dumpSerializedEngine(IMarkupWriter responseWriter)
+ {
+ CharArrayWriter writer = null;
+ BinaryDumpOutputStream bos = null;
+
+ try
+ {
+ // Because IReponseWriter doesn't implement the
+ // java.io.Writer interface, we have to buffer this
+ // stuff then pack it in all at once. Kind of a waste!
+
+ writer = new CharArrayWriter();
+
+ bos = new BinaryDumpOutputStream(writer);
+ bos.setBytesPerLine(32);
+
+ bos.write(getSerializedEngine());
+ bos.close();
+
+ responseWriter.print(writer.toString());
+ }
+ catch (IOException ex)
+ {
+ // Ignore.
+ }
+ finally
+ {
+ if (bos != null)
+ {
+ try
+ {
+ bos.close();
+ }
+ catch (IOException ex)
+ {
+ // Ignore.
+ }
+ }
+
+ if (writer != null)
+ {
+ writer.reset();
+ writer.close();
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.jwc
new file mode 100644
index 0000000..b181816
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowEngine.jwc
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.inspector.ShowEngine" allow-body="no" allow-informal-parameters="no">
+
+ <component id="insertFrameworkVersion" type="Insert">
+ <binding name="value" expression="@org.apache.tapestry.Tapestry@VERSION"/>
+ </component>
+
+ <component id="insertApplicationName" type="Insert">
+ <binding name="value" expression="page.engine.specification.name"/>
+ </component>
+
+ <component id="insertContextPath" type="Insert">
+ <binding name="value" expression="page.engine.contextPath"/>
+ </component>
+
+ <component id="insertServletPath" type="Insert">
+ <binding name="value" expression="page.engine.servletPath"/>
+ </component>
+
+ <component id="insertEngineClass" type="Insert">
+ <binding name="value" expression="engineClassName"/>
+ </component>
+
+ <component id="insertLocale" type="Insert">
+ <binding name="value" expression="page.engine.locale.displayName"/>
+ </component>
+
+ <component id="ifNoVisit" type="Conditional">
+ <binding name="condition" expression="! page.engine.hasVisit"/>
+ </component>
+
+ <component id="insertVisit" type="Insert">
+ <binding name="value" expression="page.engine.visit"/>
+ </component>
+
+ <component id="ifVisit" type="Conditional">
+ <binding name="condition" expression="page.engine.hasVisit"/>
+ </component>
+
+ <component id="restart" type="ServiceLink">
+ <binding name="service" expression="@org.apache.tapestry.Tapestry@RESTART_SERVICE"/>
+ </component>
+
+ <component id="restartButton" type="Rollover">
+ <binding name="image" expression="assets.restart"/>
+ <binding name="focus" expression="assets.restartFocus"/>
+ </component>
+
+ <component id="reset" type="ServiceLink">
+ <binding name="service" expression="@org.apache.tapestry.Tapestry@RESET_SERVICE"/>
+ <binding name="disabled" expression="! page.engine.resetServiceEnabled"/>
+ </component>
+
+ <component id="resetButton" type="Rollover">
+ <binding name="image" expression="assets.reset"/>
+ <binding name="focus" expression="assets.resetFocus"/>
+ <binding name="disabled" expression="assets.resetDisabled"/>
+ </component>
+
+ <component id="insertByteCount" type="Insert">
+ <binding name="value" expression="engineByteCount"/>
+ </component>
+
+ <component id="insertSerializedEngine" type="Delegator">
+ <binding name="delegate" expression="engineDumpDelegate"/>
+ </component>
+
+ <component id="insertRequest" type="Delegator">
+ <binding name="delegate" expression="page.requestCycle.requestContext"/>
+ </component>
+
+ <private-asset name="reset" resource-path="Reset_Np1.gif"/>
+ <private-asset name="resetFocus" resource-path="Reset_NRp2.gif"/>
+ <private-asset name="resetDisabled" resource-path="Reset_Np1_disabled.gif"/>
+ <private-asset name="restart" resource-path="Restart_Np1.gif"/>
+ <private-asset name="restartFocus" resource-path="Restart_NRp2.gif"/>
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.html
new file mode 100644
index 0000000..1aa67d8
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.html
@@ -0,0 +1,35 @@
+<!-- $Id$ -->
+
+<span jwcid="ifNoProperties">
+<span class="message">Page contains no persistent properties.</span>
+</span>
+
+<span jwcid="ifHasProperties">
+<table class="inspector-data">
+ <tr class="heading">
+ <th>Component</th> <th>Property Name</th> <th>Value Class</th> <th>Value</th>
+ </tr>
+
+ <tr jwcid="e">
+ <td>
+ <a jwcid="selectComponent"><span jwcid="insertPath"/></a>
+ </td>
+ <td>
+ <span jwcid="insertPersistPropertyName"/>
+ </td>
+ <td>
+ <span jwcid="insertPersistValueClass"/>
+ </td>
+ <td>
+ <span jwcid="insertPersistValue"/>
+ </td>
+ </tr>
+
+</table>
+
+
+</span>
+
+
+
+
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.java
new file mode 100644
index 0000000..6b96c2c
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.java
@@ -0,0 +1,142 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IEngine;
+import org.apache.tapestry.IPage;
+import org.apache.tapestry.engine.IPageRecorder;
+import org.apache.tapestry.event.PageEvent;
+import org.apache.tapestry.event.PageRenderListener;
+import org.apache.tapestry.record.IPageChange;
+
+/**
+ * Component of the {@link Inspector} page used to display
+ * the persisent properties of the page.
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public class ShowProperties extends BaseComponent implements PageRenderListener
+{
+ private List _properties;
+ private IPageChange _change;
+ private IPage _inspectedPage;
+
+ /**
+ * Does nothing.
+ *
+ * @since 1.0.5
+ *
+ **/
+
+ public void pageBeginRender(PageEvent event)
+ {
+ }
+
+ /**
+ * @since 1.0.5
+ *
+ **/
+
+ public void pageEndRender(PageEvent event)
+ {
+ _properties = null;
+ _change = null;
+ _inspectedPage = null;
+ }
+
+ private void buildProperties()
+ {
+ Inspector inspector = (Inspector) getPage();
+
+ _inspectedPage = inspector.getInspectedPage();
+
+ IEngine engine = getPage().getEngine();
+ IPageRecorder recorder =
+ engine.getPageRecorder(_inspectedPage.getPageName(), inspector.getRequestCycle());
+
+ // No page recorder? No properties.
+
+ if (recorder == null)
+ {
+ _properties = Collections.EMPTY_LIST;
+ return;
+ }
+
+ if (recorder.getHasChanges())
+ _properties = new ArrayList(recorder.getChanges());
+ }
+
+ /**
+ * Returns a {@link List} of {@link IPageChange} objects.
+ *
+ * <p>Sort order is not defined.
+ *
+ **/
+
+ public List getProperties()
+ {
+ if (_properties == null)
+ buildProperties();
+
+ return _properties;
+ }
+
+ public void setChange(IPageChange value)
+ {
+ _change = value;
+ }
+
+ public IPageChange getChange()
+ {
+ return _change;
+ }
+
+ /**
+ * Returns the name of the value's class, if the value is non-null.
+ *
+ **/
+
+ public String getValueClassName()
+ {
+ Object value;
+
+ value = _change.getNewValue();
+
+ if (value == null)
+ return "<null>";
+
+ return convertClassToName(value.getClass());
+ }
+
+ private String convertClassToName(Class cl)
+ {
+ // TODO: This only handles one-dimensional arrays
+ // property.
+
+ if (cl.isArray())
+ return "array of " + cl.getComponentType().getName();
+
+ return cl.getName();
+ }
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.jwc
new file mode 100644
index 0000000..4bde6af
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowProperties.jwc
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.inspector.ShowProperties">
+
+ <bean name="persistPropertyClass" class="org.apache.tapestry.bean.EvenOdd"/>
+ <bean name="propertyClass" class="org.apache.tapestry.bean.EvenOdd"/>
+
+ <component id="ifNoProperties" type="Conditional">
+ <binding name="condition" expression="!properties"/>
+ </component>
+
+ <component id="ifHasProperties" type="Conditional">
+ <binding name="condition" expression="properties"/>
+ </component>
+
+ <component id="e" type="Foreach">
+ <binding name="source" expression="properties"/>
+ <binding name="value" expression="change"/>
+ <static-binding name="element">tr</static-binding>
+ <binding name="class" expression="beans.persistPropertyClass.next"/>
+ </component>
+
+ <component id="selectComponent" type="DirectLink">
+ <binding name="listener" expression="page.listeners.selectComponent"/>
+ <binding name="parameters" expression="change.componentPath"/>
+ <binding name="disabled" expression="change.componentPath == null"/>
+ </component>
+
+ <component id="insertPath" type="Insert">
+ <binding name="value" expression="change.componentPath"/>
+ </component>
+
+ <component id="insertPersistPropertyName" type="Insert">
+ <binding name="value" expression="change.propertyName"/>
+ </component>
+
+ <component id="insertPersistValueClass" type="Insert">
+ <binding name="value" expression="valueClassName"/>
+ </component>
+
+ <component id="insertPersistValue" type="Insert">
+ <binding name="value" expression="change.newValue"/>
+ </component>
+
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.html
new file mode 100644
index 0000000..74bdccf
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.html
@@ -0,0 +1,161 @@
+<!-- $Id$ -->
+
+<table>
+<tr valign=top>
+<td>
+
+<table class="inspector-data" width="100%">
+ <tr class="even">
+ <th>Specification Resource Location</th>
+ <td><span jwcid="@Insert" value="ognl:inspectedSpecification.specificationLocation"/>
+ <span jwcid="@ShowDescription" description="ognl:inspectedSpecification.description"/>
+ </td>
+ </tr>
+
+ <tr class="odd">
+ <th>Java class</th>
+ <td><span jwcid="@Insert" value="ognl:inspectedComponent.getClass().getName()"/></td>
+ </tr>
+
+<span jwcid="@Conditional" condition="ognl:! inspectedSpecification.pageSpecification">
+
+ <tr class="even">
+ <th>Allow informal parameters</th>
+ <td><span jwcid="@Insert" value="ognl:inspectedSpecification.allowInformalParameters"/></td>
+ </tr>
+
+ <tr class="odd">
+ <th>Allow body</th>
+ <td><span jwcid="@Insert" value="ognl:inspectedSpecification.allowBody"/></td>
+ </tr>
+
+</span>
+
+</table>
+
+<span jwcid="@Conditional" condition="ognl:formalParameterNames">
+
+<table class="inspector-data" width="100%">
+ <tr class="heading">
+ <th colspan=4>Formal Parameters</th>
+ </tr>
+ <tr class="heading">
+ <th>Name</th> <th>Required</th> <th>Java type</th> <th>Binding</th>
+ </tr>
+
+ <tr jwcid="e_formal">
+ <td><span jwcid="@Insert" value="ognl:parameterName"/>
+ <span jwcid="@ShowDescription" description="ognl:parameterSpecification.description"/>
+ </td>
+ <td><span jwcid="@Insert" value="ognl:parameterSpecification.required"/></td>
+ <td><span jwcid="@Insert" value="ognl:parameterSpecification.type"/></td>
+ <td><span jwcid="@Insert" value="ognl:binding"/></td>
+ </tr>
+
+</table>
+</span>
+
+<span jwcid="@Conditional" condition="ognl:informalParameterNames">
+
+<table class="inspector-data" width="100%">
+ <tr class="heading">
+ <th colspan=2>Informal Parameters</th>
+ </tr>
+ <tr class="heading">
+ <th>Name</th> <th>Binding</th>
+ </tr>
+
+ <tr jwcid="e_informal">
+ <td><span jwcid="@Insert" value="ognl:parameterName"/></td>
+ <td><span jwcid="@Insert" value="ognl:binding"/></td>
+ </tr>
+
+</table>
+</span>
+
+<span jwcid="@Conditional" condition="ognl:assetNames">
+
+<table class="inspector-data" width="100%">
+ <tr class="heading">
+ <th colspan=2>Assets</th>
+ </tr>
+ <tr class="heading">
+ <th>Name</th> <th>Asset</th>
+ </tr>
+
+ <tr jwcid="e_asset">
+ <td><span jwcid="@Insert" value="ognl:assetName"/></td>
+ <td><span jwcid="@Insert" value="ognl:asset"/></td>
+ </tr>
+
+
+</table>
+</span>
+
+<span jwcid="@Conditional" condition="ognl:sortedPropertyNames">
+
+<table class="inspector-data" width="100%">
+ <tr class="heading">
+ <th colspan=2>Properties</th>
+ </tr>
+ <tr class="heading">
+ <th>Name</th> <th>Property</th>
+ </tr>
+
+ <tr jwcid="e_property">
+ <th><span jwcid="@Insert" value="ognl:propertyName"/></th>
+ <td><span jwcid="@Insert" value="ognl:propertyValue"/></td>
+ </tr>
+
+</table>
+</span>
+
+<span jwcid="@Conditional" condition="ognl:beanNames">
+
+<table class="inspector-data" width="100%">
+ <tr class="heading">
+ <th colspan=3>Helper Beans</th>
+ </tr>
+
+ <tr class="heading">
+ <th>Name</th> <th>Class</th> <th>Lifecycle</th>
+ </tr>
+
+ <tr jwcid="e_bean">
+ <td><span jwcid="@Insert" value="ognl:beanName"/></td>
+ <td><span jwcid="@Insert" value="ognl:beanSpecification.className"/></td>
+ <td><span jwcid="@Insert" value="ognl:beanSpecification.lifecycle.name"/></td>
+ </tr>
+
+</table>
+</span>
+
+</td>
+
+<td>
+<span jwcid="@Conditional" condition="ognl:sortedComponents">
+
+<table border="0" class="inspector-data">
+
+ <tr class="heading">
+ <th colspan=2>Embedded Components</th>
+ </tr>
+ <tr class="heading">
+ <th>Id</th> <th>Type</th>
+ </tr>
+
+ <tr jwcid="e_components">
+ <td>
+ <a jwcid="selectComponent"><span jwcid="@Insert" value="ognl:component.id"/></a>
+ </td>
+ <td>
+ <span jwcid="@Insert" value="ognl:componentType"/>
+ </td>
+ </tr>
+
+</table>
+</span>
+
+</td>
+</tr>
+</table>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.java
new file mode 100644
index 0000000..098a6fa
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.java
@@ -0,0 +1,366 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IAsset;
+import org.apache.tapestry.IBinding;
+import org.apache.tapestry.IComponent;
+import org.apache.tapestry.event.PageEvent;
+import org.apache.tapestry.event.PageRenderListener;
+import org.apache.tapestry.spec.IBeanSpecification;
+import org.apache.tapestry.spec.IComponentSpecification;
+import org.apache.tapestry.spec.IContainedComponent;
+import org.apache.tapestry.spec.IParameterSpecification;
+
+/**
+ * Component of the {@link Inspector} page used to display
+ * the specification, parameters and bindings and assets of the inspected component.
+ *
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public class ShowSpecification extends BaseComponent implements PageRenderListener
+{
+ private IComponent _inspectedComponent;
+ private IComponentSpecification _inspectedSpecification;
+ private String _parameterName;
+ private String _assetName;
+ private List _sortedComponents;
+ private IComponent _component;
+ private List _assetNames;
+ private List _formalParameterNames;
+ private List _informalParameterNames;
+ private List _sortedPropertyNames;
+ private String _propertyName;
+ private List _beanNames;
+ private String _beanName;
+ private IBeanSpecification _beanSpecification;
+
+ private static class ComponentComparitor implements Comparator
+ {
+ public int compare(Object left, Object right)
+ {
+ IComponent leftComponent;
+ String leftId;
+ IComponent rightComponent;
+ String rightId;
+
+ if (left == right)
+ return 0;
+
+ leftComponent = (IComponent) left;
+ rightComponent = (IComponent) right;
+
+ leftId = leftComponent.getId();
+ rightId = rightComponent.getId();
+
+ return leftId.compareTo(rightId);
+ }
+ }
+
+ /**
+ * Clears all cached information about the component and such after
+ * each render (including the rewind phase render used to process
+ * the tab view).
+ *
+ * @since 1.0.5
+ *
+ **/
+
+ public void pageEndRender(PageEvent event)
+ {
+ _inspectedComponent = null;
+ _inspectedSpecification = null;
+ _parameterName = null;
+ _assetName = null;
+ _sortedComponents = null;
+ _component = null;
+ _assetNames = null;
+ _formalParameterNames = null;
+ _informalParameterNames = null;
+ _sortedPropertyNames = null;
+ _propertyName = null;
+ _beanNames = null;
+ _beanName = null;
+ _beanSpecification = null;
+ }
+
+ /**
+ * Gets the inspected component and specification from the {@link Inspector} page.
+ *
+ * @since 1.0.5
+ **/
+
+ public void pageBeginRender(PageEvent event)
+ {
+ Inspector inspector = (Inspector) getPage();
+
+ _inspectedComponent = inspector.getInspectedComponent();
+ _inspectedSpecification = _inspectedComponent.getSpecification();
+ }
+
+ public IComponent getInspectedComponent()
+ {
+ return _inspectedComponent;
+ }
+
+ public IComponentSpecification getInspectedSpecification()
+ {
+ return _inspectedSpecification;
+ }
+
+ /**
+ * Returns a sorted list of formal parameter names.
+ *
+ **/
+
+ public List getFormalParameterNames()
+ {
+ if (_formalParameterNames == null)
+ _formalParameterNames = sort(_inspectedSpecification.getParameterNames());
+
+ return _formalParameterNames;
+ }
+
+ /**
+ * Returns a sorted list of informal parameter names. This is
+ * the list of all bindings, with the list of parameter names removed,
+ * sorted.
+ *
+ **/
+
+ public List getInformalParameterNames()
+ {
+ if (_informalParameterNames != null)
+ return _informalParameterNames;
+
+ Collection names = _inspectedComponent.getBindingNames();
+ if (names != null && names.size() > 0)
+ {
+ _informalParameterNames = new ArrayList(names);
+
+ // Remove the names of any formal parameters. This leaves
+ // just the names of informal parameters (informal parameters
+ // are any parameters/bindings that don't match a formal parameter
+ // name).
+
+ names = _inspectedSpecification.getParameterNames();
+ if (names != null)
+ _informalParameterNames.removeAll(names);
+
+ Collections.sort(_informalParameterNames);
+ }
+
+ return _informalParameterNames;
+ }
+
+ public String getParameterName()
+ {
+ return _parameterName;
+ }
+
+ public void setParameterName(String value)
+ {
+ _parameterName = value;
+ }
+
+ /**
+ * Returns the {@link org.apache.tapestry.spec.ParameterSpecification} corresponding to
+ * the value of the parameterName property.
+ *
+ **/
+
+ public IParameterSpecification getParameterSpecification()
+ {
+ return _inspectedSpecification.getParameter(_parameterName);
+ }
+
+ /**
+ * Returns the {@link IBinding} corresponding to the value of
+ * the parameterName property.
+ *
+ **/
+
+ public IBinding getBinding()
+ {
+ return _inspectedComponent.getBinding(_parameterName);
+ }
+
+ public void setAssetName(String value)
+ {
+ _assetName = value;
+ }
+
+ public String getAssetName()
+ {
+ return _assetName;
+ }
+
+ /**
+ * Returns the {@link IAsset} corresponding to the value
+ * of the assetName property.
+ *
+ **/
+
+ public IAsset getAsset()
+ {
+ return (IAsset) _inspectedComponent.getAssets().get(_assetName);
+ }
+
+ /**
+ * Returns a sorted list of asset names, or null if the
+ * component contains no assets.
+ *
+ **/
+
+ public List getAssetNames()
+ {
+ if (_assetNames == null)
+ _assetNames = sort(_inspectedComponent.getAssets().keySet());
+
+ return _assetNames;
+ }
+
+ public List getSortedComponents()
+ {
+ if (_sortedComponents != null)
+ return _sortedComponents;
+
+ Inspector inspector = (Inspector) getPage();
+ IComponent inspectedComponent = inspector.getInspectedComponent();
+
+ // Get a Map of the components and simply return null if there
+ // are none.
+
+ Map components = inspectedComponent.getComponents();
+
+ _sortedComponents = new ArrayList(components.values());
+
+ Collections.sort(_sortedComponents, new ComponentComparitor());
+
+ return _sortedComponents;
+ }
+
+ public void setComponent(IComponent value)
+ {
+ _component = value;
+ }
+
+ public IComponent getComponent()
+ {
+ return _component;
+ }
+
+ /**
+ * Returns the type of the component, as specified in the container's
+ * specification (i.e., the component alias if known).
+ *
+ **/
+
+ public String getComponentType()
+ {
+ IComponent container = _component.getContainer();
+
+ IComponentSpecification containerSpecification = container.getSpecification();
+
+ String id = _component.getId();
+ IContainedComponent contained = containerSpecification.getComponent(id);
+
+ // Temporary: An implicit component will not be in the containing
+ // component's specification as a ContainedComponent.
+
+ if (contained == null)
+ return null;
+
+ return contained.getType();
+ }
+
+ /**
+ * Returns a list of the properties for the component
+ * (from its specification), or null if the component
+ * has no properties.
+ *
+ **/
+
+ public List getSortedPropertyNames()
+ {
+ if (_sortedPropertyNames == null)
+ _sortedPropertyNames = sort(_inspectedSpecification.getPropertyNames());
+
+ return _sortedPropertyNames;
+ }
+
+ public void setPropertyName(String value)
+ {
+ _propertyName = value;
+ }
+
+ public String getPropertyName()
+ {
+ return _propertyName;
+ }
+
+ public String getPropertyValue()
+ {
+ return _inspectedSpecification.getProperty(_propertyName);
+ }
+
+ public List getBeanNames()
+ {
+ if (_beanNames == null)
+ _beanNames = sort(_inspectedSpecification.getBeanNames());
+
+ return _beanNames;
+ }
+
+ public void setBeanName(String value)
+ {
+ _beanName = value;
+ _beanSpecification = _inspectedSpecification.getBeanSpecification(_beanName);
+ }
+
+ public String getBeanName()
+ {
+ return _beanName;
+ }
+
+ public IBeanSpecification getBeanSpecification()
+ {
+ return _beanSpecification;
+ }
+
+ private List sort(Collection c)
+ {
+ if (c == null || c.size() == 0)
+ return null;
+
+ List result = new ArrayList(c);
+
+ Collections.sort(result);
+
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.jwc
new file mode 100644
index 0000000..fa9c420
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowSpecification.jwc
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd" >
+
+<component-specification class="org.apache.tapestry.contrib.inspector.ShowSpecification">
+
+ <bean name="formalClass" class="org.apache.tapestry.bean.EvenOdd"/>
+ <bean name="informalClass" class="org.apache.tapestry.bean.EvenOdd"/>
+ <bean name="assetClass" class="org.apache.tapestry.bean.EvenOdd"/>
+ <bean name="propertyClass" class="org.apache.tapestry.bean.EvenOdd"/>
+ <bean name="componentClass" class="org.apache.tapestry.bean.EvenOdd"/>
+ <bean name="beanClass" class="org.apache.tapestry.bean.EvenOdd"/>
+
+ <component id="e_formal" type="Foreach">
+ <binding name="source" expression="formalParameterNames"/>
+ <binding name="value" expression="parameterName"/>
+ <static-binding name="element">tr</static-binding>
+ <binding name="class" expression="beans.formalClass.next"/>
+ </component>
+
+
+ <component id="e_informal" type="Foreach">
+ <binding name="source" expression="informalParameterNames"/>
+ <binding name="value" expression="parameterName"/>
+ <static-binding name="element">tr</static-binding>
+ <binding name="class" expression="beans.informalClass.next"/>
+ </component>
+
+ <component id="e_asset" type="Foreach">
+ <binding name="source" expression="assetNames"/>
+ <binding name="value" expression="assetName"/>
+ <static-binding name="element">tr</static-binding>
+ <binding name="class" expression="beans.assetClass.next"/>
+ </component>
+
+ <component id="e_components" type="Foreach">
+ <binding name="source" expression="sortedComponents"/>
+ <binding name="value" expression="component"/>
+ <static-binding name="element">tr</static-binding>
+ <binding name="class" expression="beans.componentClass.next"/>
+ </component>
+
+ <component id="selectComponent" type="DirectLink">
+ <binding name="listener" expression="page.listeners.selectComponent"/>
+ <binding name="parameters" expression="component.idPath"/>
+ </component>
+
+ <component id="e_property" type="Foreach">
+ <binding name="source" expression="sortedPropertyNames"/>
+ <binding name="value" expression="propertyName"/>
+ <static-binding name="element">tr</static-binding>
+ <binding name="class" expression="beans.propertyClass.next"/>
+ </component>
+
+ <component id="e_bean" type="Foreach">
+ <binding name="source" expression="beanNames"/>
+ <binding name="value" expression="beanName"/>
+ <static-binding name="element">tr</static-binding>
+ <binding name="class" expression="beans.beanClass.next"/>
+ </component>
+
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.html
new file mode 100644
index 0000000..2673368
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.html
@@ -0,0 +1,15 @@
+<!-- $Id$ -->
+
+<span jwcid="ifNoTemplate">
+<span class="message">Component does not have a template.
+</span>
+</span>
+
+<span jwcid="ifTemplate">
+<table class="template">
+ <tr>
+ <td><span jwcid="insertTemplate"/></td>
+ </tr>
+</table>
+
+</span>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.java
new file mode 100644
index 0000000..65a8c13
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.java
@@ -0,0 +1,333 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IComponent;
+import org.apache.tapestry.IDirect;
+import org.apache.tapestry.IMarkupWriter;
+import org.apache.tapestry.IRender;
+import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.Tapestry;
+import org.apache.tapestry.engine.IEngineService;
+import org.apache.tapestry.engine.ILink;
+import org.apache.tapestry.engine.ITemplateSource;
+import org.apache.tapestry.parse.CloseToken;
+import org.apache.tapestry.parse.ComponentTemplate;
+import org.apache.tapestry.parse.LocalizationToken;
+import org.apache.tapestry.parse.OpenToken;
+import org.apache.tapestry.parse.TemplateAttribute;
+import org.apache.tapestry.parse.TemplateToken;
+import org.apache.tapestry.parse.TextToken;
+import org.apache.tapestry.parse.TokenType;
+
+/**
+ * Component of the {@link Inspector} page used to display
+ * the ids and types of all embedded components.
+ *
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public class ShowTemplate extends BaseComponent implements IDirect
+{
+
+ public boolean getHasTemplate()
+ {
+ Inspector inspector;
+
+ inspector = (Inspector) getPage();
+
+ // Components that inherit from BaseComponent have templates,
+ // others do not.
+
+ return inspector.getInspectedComponent() instanceof BaseComponent;
+ }
+
+ public IRender getTemplateDelegate()
+ {
+ return new IRender()
+ {
+ public void render(IMarkupWriter writer, IRequestCycle cycle)
+ {
+ writeTemplate(writer, cycle);
+ }
+ };
+ }
+
+ /**
+ * Writes the HTML template for the component. When <jwc> tags are
+ * written, the id is made a link (that selects the named component). We
+ * use some magic to accomplish this, creating links as if we were a
+ * {@link DirectLink} component, and attributing those links
+ * to the captive {@link DirectLink} component embedded here.
+ *
+ **/
+
+ private void writeTemplate(IMarkupWriter writer, IRequestCycle cycle)
+ {
+ IComponent inspectedComponent = getInspectedComponent();
+ ComponentTemplate template = null;
+ ITemplateSource source = getPage().getEngine().getTemplateSource();
+
+ try
+ {
+ template = source.getTemplate(cycle, inspectedComponent);
+ }
+ catch (Exception ex)
+ {
+ return;
+ }
+
+ writer.begin("pre");
+
+ int count = template.getTokenCount();
+
+ for (int i = 0; i < count; i++)
+ {
+ TemplateToken token = template.getToken(i);
+ TokenType type = token.getType();
+
+ if (type == TokenType.TEXT)
+ {
+ write(writer, (TextToken) token);
+ continue;
+ }
+
+ if (type == TokenType.CLOSE)
+ {
+ write(writer, (CloseToken) token);
+
+ continue;
+ }
+
+ if (token.getType() == TokenType.LOCALIZATION)
+ {
+
+ write(writer, (LocalizationToken) token);
+ continue;
+ }
+
+ if (token.getType() == TokenType.OPEN)
+ {
+ boolean nextIsClose =
+ (i + 1 < count) && (template.getToken(i + 1).getType() == TokenType.CLOSE);
+
+ write(writer, nextIsClose, (OpenToken) token);
+
+ if (nextIsClose)
+ i++;
+
+ continue;
+ }
+
+ // That's all the types known at this time.
+ }
+
+ writer.end(); // <pre>
+ }
+
+ /** @since 3.0 **/
+
+ private IComponent getInspectedComponent()
+ {
+ Inspector page = (Inspector) getPage();
+
+ return page.getInspectedComponent();
+ }
+
+ /** @since 3.0 **/
+
+ private void write(IMarkupWriter writer, TextToken token)
+ {
+ int start = token.getStartIndex();
+ int end = token.getEndIndex();
+
+ // Print the section of the template ... print() will
+ // escape and invalid characters as HTML entities. Also,
+ // we show the full stretch of text, not the trimmed version.
+
+ writer.print(token.getTemplateData(), start, end - start + 1);
+ }
+
+ /** @since 3.0 **/
+
+ private void write(IMarkupWriter writer, CloseToken token)
+ {
+ writer.begin("span");
+ writer.attribute("class", "jwc-tag");
+
+ writer.print("</");
+ writer.print(token.getTag());
+ writer.print(">");
+
+ writer.end(); // <span>
+ }
+
+ /** @since 3.0 **/
+
+ private void write(IMarkupWriter writer, LocalizationToken token)
+ {
+ IComponent component = getInspectedComponent();
+
+ writer.begin("span");
+ writer.attribute("class", "jwc-tag");
+
+ writer.print("<span key=\"");
+ writer.print(token.getKey());
+ writer.print('"');
+
+ Map attributes = token.getAttributes();
+ if (attributes != null && !attributes.isEmpty())
+ {
+ Iterator it = attributes.entrySet().iterator();
+ while (it.hasNext())
+ {
+ Map.Entry entry = (Map.Entry) it.next();
+ String attributeName = (String) entry.getKey();
+ String attributeValue = (String) entry.getValue();
+
+ writer.print(' ');
+ writer.print(attributeName);
+ writer.print("=\"");
+ writer.print(attributeValue);
+ writer.print('"');
+
+ }
+ }
+
+ writer.print('>');
+ writer.begin("span");
+ writer.attribute("class", "localized-string");
+
+ writer.print(component.getMessages().getMessage(token.getKey()));
+ writer.end(); // <span>
+
+ writer.print("</span>");
+
+ writer.end(); // <span>
+ }
+
+ /** @since 3.0 **/
+
+ private void write(IMarkupWriter writer, boolean nextIsClose, OpenToken token)
+ {
+ IComponent component = getInspectedComponent();
+ IEngineService service = getPage().getEngine().getService(Tapestry.DIRECT_SERVICE);
+ String[] context = new String[1];
+
+ // Each id references a component embedded in the inspected component.
+ // Get that component.
+
+ String id = token.getId();
+ IComponent embedded = component.getComponent(id);
+ context[0] = embedded.getIdPath();
+
+ // Build a URL to select that component, as if by the captive
+ // component itself (it's a Direct).
+
+ ILink link = service.getLink(getPage().getRequestCycle(), this, context);
+
+ writer.begin("span");
+ writer.attribute("class", "jwc-tag");
+
+ writer.print("<");
+ writer.print(token.getTag());
+
+ writer.print(" jwcid=\"");
+
+ writer.begin("span");
+ writer.attribute("class", "jwc-id");
+
+ writer.begin("a");
+ writer.attribute("href", link.getURL());
+ writer.print(id);
+
+ writer.end(); // <a>
+ writer.end(); // <span>
+ writer.print('"');
+
+ Map attributes = token.getAttributesMap();
+
+ if (attributes != null)
+ {
+ Iterator ii = attributes.entrySet().iterator();
+
+ while (ii.hasNext())
+ {
+ Map.Entry e = (Map.Entry) ii.next();
+
+ TemplateAttribute attribute = (TemplateAttribute)e.getValue();
+
+ writer.print(' ');
+ writer.print(e.getKey().toString());
+ writer.print("=\"");
+
+ // TODO: Fix this to output something appropriate for each type
+ // of attribute (literal, expression, string).
+
+ writer.print(attribute.getValue());
+ writer.print('"');
+ }
+ }
+
+ // Collapse an open & close down to a single tag.
+
+ if (nextIsClose)
+ writer.print('/');
+
+ writer.print('>');
+ writer.end(); // <span>
+ }
+
+ /**
+ * Invoked when a component id is clicked.
+ *
+ **/
+
+ public void trigger(IRequestCycle cycle)
+ {
+ Inspector inspector = (Inspector) getPage();
+
+ Object[] parameters = cycle.getServiceParameters();
+
+ inspector.selectComponent((String) parameters[0]);
+
+ IComponent newComponent = inspector.getInspectedComponent();
+
+ // If the component is not a BaseComponent then it won't have
+ // a template, so switch to the specification view.
+
+ if (!(newComponent instanceof BaseComponent))
+ inspector.setView(View.SPECIFICATION);
+ }
+
+ /**
+ * Always returns true.
+ *
+ * @since 2.3
+ *
+ **/
+
+ public boolean isStateful()
+ {
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.jwc
new file mode 100644
index 0000000..266a467
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ShowTemplate.jwc
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.inspector.ShowTemplate">
+ <component id="ifNoTemplate" type="Conditional">
+ <binding name="condition" expression="! hasTemplate"/>
+ </component>
+
+ <component id="ifTemplate" type="Conditional">
+ <binding name="condition" expression="hasTemplate"/>
+ </component>
+
+ <component id="insertTemplate" type="Delegator">
+ <binding name="delegate" expression="templateDelegate"/>
+ </component>
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_HRp4.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_HRp4.gif
new file mode 100644
index 0000000..7b695d0
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_HRp4.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_Hp3.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_Hp3.gif
new file mode 100644
index 0000000..33062cb
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_Hp3.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_NBanner.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_NBanner.gif
new file mode 100644
index 0000000..896f81b
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_NBanner.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_NRp2.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_NRp2.gif
new file mode 100644
index 0000000..6700d10
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_NRp2.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_Np1.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_Np1.gif
new file mode 100644
index 0000000..5f8b7db
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Specification_Np1.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_HRp4.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_HRp4.gif
new file mode 100644
index 0000000..16e1792
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_HRp4.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_Hp3.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_Hp3.gif
new file mode 100644
index 0000000..2bc30ee
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_Hp3.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_NBanner.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_NBanner.gif
new file mode 100644
index 0000000..e250138
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_NBanner.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_NRp2.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_NRp2.gif
new file mode 100644
index 0000000..b7e2175
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_NRp2.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_Np1.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_Np1.gif
new file mode 100644
index 0000000..a83fb37
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/Template_Np1.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/View.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/View.java
new file mode 100644
index 0000000..6aac890
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/View.java
@@ -0,0 +1,68 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import org.apache.commons.lang.enum.Enum;
+
+/**
+ * Identifies different views for the inspector.
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public class View extends Enum
+{
+ /**
+ * View that displays the basic specification information, plus
+ * formal and informal parameters (and related bindings), and
+ * assets.
+ *
+ **/
+
+ public static final View SPECIFICATION = new View("SPECIFICATION");
+
+ /**
+ * View that displays the HTML template for the component, if one
+ * exists.
+ *
+ **/
+
+ public static final View TEMPLATE = new View("TEMPLATE");
+
+ /**
+ * View that shows the persistent properties of the page containing
+ * the inspected component.
+ *
+ **/
+
+ public static final View PROPERTIES = new View("PROPERTIES");
+
+ /**
+ * View that shows information about the
+ * {@link org.apache.tapestry.IEngine}.
+ *
+ **/
+
+ public static final View ENGINE = new View("ENGINE");
+
+
+ private View(String name)
+ {
+ super(name);
+ }
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.html
new file mode 100644
index 0000000..6d3a970
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.html
@@ -0,0 +1,20 @@
+<!-- $Id$ -->
+
+<table border=0 cellpadding=0 cellspacing=2>
+ <tr>
+ <td>
+<span jwcid="@Foreach" source="ognl:views" value="ognl:view">
+ <a jwcid="select@ActionLink" listener="ognl:listeners.selectTab"><img
+ jwcid="@Rollover" image="ognl:viewImage" focus="ognl:focusImage"
+ width="120" height="19"/></a>
+</span>
+ </td>
+ </tr>
+ <tr>
+ <td><img jwcid="@Image" image="ognl:bannerImage"/></td>
+ </tr>
+ <tr>
+ <td><span jwcid="@RenderBody"/></td>
+ </tr>
+</table>
+
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.java
new file mode 100644
index 0000000..3251d35
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.java
@@ -0,0 +1,92 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.inspector;
+
+import org.apache.tapestry.BaseComponent;
+import org.apache.tapestry.IAsset;
+import org.apache.tapestry.IRequestCycle;
+
+/**
+ * Component of the {@link Inspector} page used to select the view.
+ *
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public abstract class ViewTabs extends BaseComponent
+{
+ private static View[] _views =
+ {
+ View.SPECIFICATION,
+ View.TEMPLATE,
+ View.PROPERTIES,
+ View.ENGINE };
+
+ public View[] getViews()
+ {
+ return _views;
+ }
+
+ public abstract void setView(View value);
+
+ public abstract View getView();
+
+ private IAsset getImageForView(boolean focus)
+ {
+ Inspector inspector = (Inspector) getPage();
+ View view = getView();
+
+ boolean selected = (view == inspector.getView());
+
+ StringBuffer buffer = new StringBuffer(view.getName());
+
+ if (selected)
+ buffer.append("_selected");
+
+ if (focus)
+ buffer.append("_focus");
+
+ String key = buffer.toString();
+
+ return (IAsset) getAssets().get(key);
+ }
+
+ public IAsset getViewImage()
+ {
+ return getImageForView(false);
+ }
+
+ public IAsset getFocusImage()
+ {
+ return getImageForView(true);
+ }
+
+ public IAsset getBannerImage()
+ {
+ Inspector inspector = (Inspector) getPage();
+ View selectedView = inspector.getView();
+ String key = selectedView.getName() + "_banner";
+
+ return (IAsset) getAssets().get(key);
+ }
+
+ public void selectTab(IRequestCycle cycle)
+ {
+ Inspector inspector = (Inspector) getPage();
+ inspector.setView(getView());
+ }
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.jwc b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.jwc
new file mode 100644
index 0000000..1e03bad
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/ViewTabs.jwc
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2004 The Apache Software Foundation
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<!-- $Id$ -->
+<!DOCTYPE component-specification PUBLIC
+ "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
+ "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">
+
+<component-specification class="org.apache.tapestry.contrib.inspector.ViewTabs">
+
+ <property-specification name="view" type="org.apache.tapestry.contrib.inspector.View"/>
+
+ <private-asset name="SPECIFICATION" resource-path="Specification_Np1.gif"/>
+ <private-asset name="SPECIFICATION_selected" resource-path="Specification_Hp3.gif"/>
+ <private-asset name="SPECIFICATION_focus" resource-path="Specification_NRp2.gif"/>
+ <private-asset name="SPECIFICATION_selected_focus" resource-path="Specification_HRp4.gif"/>
+ <private-asset name="SPECIFICATION_banner" resource-path="Specification_NBanner.gif"/>
+ <private-asset name="TEMPLATE" resource-path="Template_Np1.gif"/>
+ <private-asset name="TEMPLATE_selected" resource-path="Template_Hp3.gif"/>
+ <private-asset name="TEMPLATE_focus" resource-path="Template_NRp2.gif"/>
+ <private-asset name="TEMPLATE_selected_focus" resource-path="Template_HRp4.gif"/>
+ <private-asset name="TEMPLATE_banner" resource-path="Template_NBanner.gif"/>
+ <private-asset name="PROPERTIES" resource-path="Properties_Np1.gif"/>
+ <private-asset name="PROPERTIES_selected" resource-path="Properties_Hp3.gif"/>
+ <private-asset name="PROPERTIES_focus" resource-path="Properties_NRp2.gif"/>
+ <private-asset name="PROPERTIES_selected_focus" resource-path="Properties_HRp4.gif"/>
+ <private-asset name="PROPERTIES_banner" resource-path="Properties_NBanner.gif"/>
+ <private-asset name="ENGINE" resource-path="Engine_Np1.gif"/>
+ <private-asset name="ENGINE_selected" resource-path="Engine_Hp3.gif"/>
+ <private-asset name="ENGINE_focus" resource-path="Engine_NRp2.gif"/>
+ <private-asset name="ENGINE_selected_focus" resource-path="Engine_HRp4.gif"/>
+ <private-asset name="ENGINE_banner" resource-path="Engine_NBanner.gif"/>
+</component-specification>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/info.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/info.gif
new file mode 100644
index 0000000..be3d1d1
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/info.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/inspector-rollover.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/inspector-rollover.gif
new file mode 100644
index 0000000..df0d3ef
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/inspector-rollover.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/package.html b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/package.html
new file mode 100644
index 0000000..7610fdb
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/package.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
+<!-- $Id$ -->
+<html>
+<head>
+<title>Tapestry: Web Application Framework</title>
+</head>
+<body>
+
+<p>Implementation of the Tapestry <em>Inspector</em>, a specialized page
+used to dynamically introspect the construction of an application while
+it runs. The {@link org.apache.tapestry.contrib.inspector.InspectorButton} component
+creates an icon on the page that raises the Inspector in a seperate window.
+
+@author Howard Lewis Ship <a href="mailto:hlship@apache.org">hlship@apache.org</a>
+
+</body>
+</html>
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/tapestry-logo.gif b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/tapestry-logo.gif
new file mode 100644
index 0000000..82ad636
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/inspector/tapestry-logo.gif
Binary files differ
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/BooleanParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/BooleanParameter.java
new file mode 100644
index 0000000..80fc31d
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/BooleanParameter.java
@@ -0,0 +1,57 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ * Wrapper around a boolean parameter.
+ *
+ *
+ * @author Howard Lewis Ship
+ * @version $Id$
+ * @since 2.3
+ *
+ **/
+
+public class BooleanParameter implements IParameter
+{
+ private boolean _value;
+
+ public static final BooleanParameter TRUE = new BooleanParameter(true);
+
+ public static final BooleanParameter FALSE = new BooleanParameter(false);
+
+ private BooleanParameter(boolean value)
+ {
+ _value = value;
+ }
+
+ public void set(PreparedStatement statement, int index) throws SQLException
+ {
+ statement.setBoolean(index, _value);
+ }
+
+ public String toString()
+ {
+ StringBuffer buffer = new StringBuffer("Boolean<");
+ buffer.append(_value);
+ buffer.append('>');
+
+ return buffer.toString();
+ }
+
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/DoubleParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/DoubleParameter.java
new file mode 100644
index 0000000..e9f6d65
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/DoubleParameter.java
@@ -0,0 +1,52 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ * A wrapper around a double parameter.
+ *
+ *
+ * @author Howard Lewis Ship
+ * @version $Id$
+ * @since 2.3
+ *
+ **/
+
+public class DoubleParameter implements IParameter
+{
+ private double _value;
+
+ public DoubleParameter(double value)
+ {
+ _value = value;
+ }
+
+ public void set(PreparedStatement statement, int index) throws SQLException
+ {
+ statement.setDouble(index, _value);
+ }
+
+ public String toString()
+ {
+ StringBuffer buffer = new StringBuffer("Double<");
+ buffer.append(_value);
+ buffer.append('>');
+
+ return buffer.toString();
+ }
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/FloatParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/FloatParameter.java
new file mode 100644
index 0000000..b2eb348
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/FloatParameter.java
@@ -0,0 +1,52 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ * A wrapper around a float parameter.
+ *
+ *
+ * @author Howard Lewis Ship
+ * @version $Id$
+ * @since 2.3
+ *
+ **/
+
+public class FloatParameter implements IParameter
+{
+ private float _value;
+
+ public FloatParameter(float value)
+ {
+ _value = value;
+ }
+
+ public void set(PreparedStatement statement, int index) throws SQLException
+ {
+ statement.setFloat(index, _value);
+ }
+
+ public String toString()
+ {
+ StringBuffer buffer = new StringBuffer("Float<");
+ buffer.append(_value);
+ buffer.append('>');
+
+ return buffer.toString();
+ }
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IParameter.java
new file mode 100644
index 0000000..2032a00
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IParameter.java
@@ -0,0 +1,41 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ * Represents a parameter within a dynamically generated SQL statement.
+ *
+ *
+ * @author Howard Lewis Ship
+ * @version $Id$
+ * @since 2.3
+ * @see org.apache.tapestry.contrib.jdbc.ParameterizedStatement
+ *
+ **/
+
+public interface IParameter
+{
+ /**
+ * Invokes the appropriate setXXX() method on the
+ * {@link java.sql.PreparedStatement}.
+ *
+ **/
+
+ public void set(PreparedStatement statement, int index)
+ throws SQLException;
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IStatement.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IStatement.java
new file mode 100644
index 0000000..c9f2544
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IStatement.java
@@ -0,0 +1,70 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+/**
+ * A wrapper around {@link java.sql.Statement} or
+ * {@link java.sql.PreparedStatement} which hides the differences
+ * between the two.
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ * @see org.apache.tapestry.contrib.jdbc.StatementAssembly#createStatement(Connection)
+ *
+ **/
+
+public interface IStatement
+{
+ /**
+ * Returns the SQL associated with this statement.
+ *
+ **/
+
+ public String getSQL();
+
+ /**
+ * Returns the underlying {@link java.sql.Statement}
+ * (or {@link java.sql.PreparedStatement}).
+ *
+ **/
+
+ public Statement getStatement();
+
+ /**
+ * Closes the underlying statement, and nulls the reference to it.
+ *
+ **/
+
+ public void close() throws SQLException;
+
+ /**
+ * Executes the statement as a query, returning a {@link ResultSet}.
+ *
+ **/
+
+ public ResultSet executeQuery() throws SQLException;
+
+ /**
+ * Executes the statement as an update, returning the number of rows
+ * affected.
+ *
+ **/
+
+ public int executeUpdate() throws SQLException;
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IntegerParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IntegerParameter.java
new file mode 100644
index 0000000..9148201
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/IntegerParameter.java
@@ -0,0 +1,52 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ * A wrapper around an integer parameter.
+ *
+ *
+ * @author Howard Lewis Ship
+ * @version $Id$
+ * @since 2.3
+ *
+ **/
+
+public class IntegerParameter implements IParameter
+{
+ private int _value;
+
+ public IntegerParameter(int value)
+ {
+ _value = value;
+ }
+
+ public void set(PreparedStatement statement, int index) throws SQLException
+ {
+ statement.setInt(index, _value);
+ }
+
+ public String toString()
+ {
+ StringBuffer buffer = new StringBuffer("Integer<");
+ buffer.append(_value);
+ buffer.append('>');
+
+ return buffer.toString();
+ }
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/LongParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/LongParameter.java
new file mode 100644
index 0000000..847e8a0
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/LongParameter.java
@@ -0,0 +1,52 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ * Wrapper around long parameter.
+ *
+ *
+ * @author Howard Lewis Ship
+ * @version $Id$
+ * @since 2.3
+ *
+ **/
+
+public class LongParameter implements IParameter
+{
+ private long _value;
+
+ public LongParameter(long value)
+ {
+ _value = value;
+ }
+
+ public void set(PreparedStatement statement, int index) throws SQLException
+ {
+ statement.setLong(index, _value);
+ }
+
+ public String toString()
+ {
+ StringBuffer buffer = new StringBuffer("Long<");
+ buffer.append(_value);
+ buffer.append('>');
+
+ return buffer.toString();
+ }
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ObjectParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ObjectParameter.java
new file mode 100644
index 0000000..25be80f
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ObjectParameter.java
@@ -0,0 +1,52 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ * An arbitrary object parameter.
+ *
+ *
+ * @author Howard Lewis Ship
+ * @version $Id$
+ * @since 2.3
+ *
+ **/
+
+public class ObjectParameter implements IParameter
+{
+ private Object _value;
+
+ public ObjectParameter(Object value)
+ {
+ _value = value;
+ }
+
+ public void set(PreparedStatement statement, int index) throws SQLException
+ {
+ statement.setObject(index, _value);
+ }
+
+ public String toString()
+ {
+ StringBuffer buffer = new StringBuffer("Object<");
+ buffer.append(_value);
+ buffer.append('>');
+
+ return buffer.toString();
+ }
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ParameterizedStatement.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ParameterizedStatement.java
new file mode 100644
index 0000000..3d37cca
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ParameterizedStatement.java
@@ -0,0 +1,152 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * A wrapper around {@link PreparedStatement}.
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public class ParameterizedStatement implements IStatement
+{
+ private static final Log LOG = LogFactory.getLog(ParameterizedStatement.class);
+
+ private String _SQL;
+ private PreparedStatement _statement;
+ private IParameter[] _parameters;
+
+ /**
+ * Create a new instance; the parameters list is copied.
+ *
+ * @param SQL the SQL to execute (see {@link Connection#prepareStatement(java.lang.String)})
+ * @param connection the JDBC connection to use
+ * @param parameters list of {@link IParameter}
+ *
+ **/
+
+ public ParameterizedStatement(String SQL, Connection connection, List parameters) throws SQLException
+ {
+ _SQL = SQL;
+
+ _statement = connection.prepareStatement(SQL);
+
+ _parameters = (IParameter[]) parameters.toArray(new IParameter[parameters.size()]);
+
+ for (int i = 0; i < _parameters.length; i++)
+ {
+ // JDBC numbers things from 1, not 0.
+
+ _parameters[i].set(_statement, i + 1);
+ }
+ }
+
+ /**
+ * Returns the SQL associated with this statement.
+ *
+ **/
+
+ public String getSQL()
+ {
+ return _SQL;
+ }
+
+ /**
+ * Returns the underlying or {@link PreparedStatement}.
+ *
+ **/
+
+ public Statement getStatement()
+ {
+ return _statement;
+ }
+
+ /**
+ * Closes the underlying statement, and nulls the reference to it.
+ *
+ **/
+
+ public void close() throws SQLException
+ {
+ _statement.close();
+
+ _statement = null;
+ _SQL = null;
+ }
+
+ /**
+ * Executes the statement as a query, returning a {@link ResultSet}.
+ *
+ **/
+
+ public ResultSet executeQuery() throws SQLException
+ {
+ if (LOG.isDebugEnabled())
+ LOG.debug("Executing query: " + this);
+
+ return _statement.executeQuery();
+ }
+
+ /**
+ * Executes the statement as an update, returning the number of rows
+ * affected.
+ *
+ **/
+
+ public int executeUpdate() throws SQLException
+ {
+ if (LOG.isDebugEnabled())
+ LOG.debug("Executing update: " + this);
+
+ return _statement.executeUpdate();
+ }
+
+ public String toString()
+ {
+ StringBuffer buffer = new StringBuffer("ParameterizedStatement@");
+ buffer.append(Integer.toHexString(hashCode()));
+ buffer.append("[SQL=\n<");
+ buffer.append(_SQL);
+ buffer.append("\n>");
+
+ for (int i = 0; i < _parameters.length; i++)
+ {
+ IParameter parameter = _parameters[i];
+
+ buffer.append(" ?");
+ buffer.append(i + 1);
+ buffer.append('=');
+
+ buffer.append(parameter);
+ }
+
+ buffer.append(']');
+
+ return buffer.toString();
+ }
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ShortParameter.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ShortParameter.java
new file mode 100644
index 0000000..31cfea7
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/ShortParameter.java
@@ -0,0 +1,53 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ * A wrapper around a short parameter.
+ *
+ *
+ * @author Howard Lewis Ship
+ * @version $Id$
+ * @since 2.3
+ *
+ **/
+
+public class ShortParameter implements IParameter
+{
+ private short _value;
+
+ public ShortParameter(short value)
+ {
+ _value = value;
+ }
+
+ public void set(PreparedStatement statement, int index) throws SQLException
+ {
+ statement.setShort(index, _value);
+ }
+
+ public String toString()
+ {
+ StringBuffer buffer = new StringBuffer("Short<");
+ buffer.append(_value);
+ buffer.append('>');
+
+ return buffer.toString();
+ }
+
+}
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/SimpleStatement.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/SimpleStatement.java
new file mode 100644
index 0000000..16df20f
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/SimpleStatement.java
@@ -0,0 +1,127 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * A wrapper around {@link Statement}.
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public class SimpleStatement implements IStatement
+{
+ private static final Log LOG = LogFactory.getLog(SimpleStatement.class);
+
+ private String _sql;
+ private Statement _statement;
+
+ public SimpleStatement(String SQL, Connection connection) throws SQLException
+ {
+ _sql = SQL;
+ _statement = connection.createStatement();
+ }
+
+ public SimpleStatement(String SQL, Connection connection, int resultSetType, int resultSetConcurrency)
+ throws SQLException
+ {
+ _sql = SQL;
+ _statement = connection.createStatement(resultSetType, resultSetConcurrency);
+ }
+
+ /**
+ * Returns the SQL associated with this statement.
+ *
+ **/
+
+ public String getSQL()
+ {
+ return _sql;
+ }
+
+ /**
+ * Returns the underlying {@link Statement}.
+ *
+ **/
+
+ public Statement getStatement()
+ {
+ return _statement;
+ }
+
+ /**
+ * Closes the underlying statement, and nulls the reference to it.
+ *
+ **/
+
+ public void close() throws SQLException
+ {
+ _statement.close();
+
+ _statement = null;
+ _sql = null;
+ }
+
+ /**
+ * Executes the statement as a query, returning a {@link ResultSet}.
+ *
+ **/
+
+ public ResultSet executeQuery() throws SQLException
+ {
+ if (LOG.isDebugEnabled())
+ LOG.debug("Executing query: " + this);
+
+ return _statement.executeQuery(_sql);
+ }
+
+ /**
+ * Executes the statement as an update, returning the number of rows
+ * affected.
+ *
+ **/
+
+ public int executeUpdate() throws SQLException
+ {
+ if (LOG.isDebugEnabled())
+ LOG.debug("Executing update: " + this);
+
+ return _statement.executeUpdate(_sql);
+ }
+
+ public String toString()
+ {
+ StringBuffer buffer;
+
+ buffer = new StringBuffer("SimpleStatement@");
+ buffer.append(Integer.toHexString(hashCode()));
+
+ buffer.append("[SQL=<\n");
+ buffer.append(_sql);
+ buffer.append("\n>]");
+
+ return buffer.toString();
+ }
+
+}
\ No newline at end of file
diff --git a/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/StatementAssembly.java b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/StatementAssembly.java
new file mode 100644
index 0000000..112e740
--- /dev/null
+++ b/3.0.4/contrib/src/org/apache/tapestry/contrib/jdbc/StatementAssembly.java
@@ -0,0 +1,480 @@
+// Copyright 2004 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.contrib.jdbc;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ * Class for creating and executing JDBC statements. Allows statements to be assembled
+ * incrementally (like a {@link StringBuffer}), but also tracks parameters, shielding
+ * the developer from the differences between constructing and
+ * using a JDBC
+ * {@link java.sql.Statement} and
+ * a JDBC {@link java.sql.PreparedStatement}. This class is somewhat skewed towards
+ * Oracle, which works more efficiently with prepared staments than
+ * simple SQL.
+ *
+ * <p>In addition, implements {@link #toString()} in a useful way (you can see the
+ * SQL and parameters), which is invaluable when debugging.
+ *
+ * <p>{@link #addParameter(int)} (and all overloaded versions of it for scalar types)
+ * adds a "?" to the statement and records the parameter value.
+ *
+ * <p>{@link #addParameter(Integer)} (and all overloaded version of it for wrapper
+ * types) does the same ... unless the value is null, in which case "NULL" is
+ * inserted into the statement.
+ *
+ * <p>{@link #addParameterList(int[], String)} (and all overloaded versions of it)
+ * simply invokes the appropriate {@link #addParameter(int)}, adding the
+ * separator in between parameters.
+ *
+ * @version $Id$
+ * @author Howard Lewis Ship
+ *
+ **/
+
+public class StatementAssembly
+{
+ private StringBuffer _buffer = new StringBuffer();
+
+ private static final String NULL = "NULL";
+
+ public static final String SEP = ", ";
+
+ /**
+ * List of {@link IParameter}
+ *
+ **/
+
+ private List _parameters;
+
+ private int _lineLength;
+ private int _maxLineLength = 80;
+ private int _indent = 5;
+