initial checkin from dm Server sample-formtags commit 2a9b6a3e9e78d2476200ee5aabd1b8c68ed3a6bc
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5f193ca
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+target
+integration-repo
+ivy-cache
diff --git a/build-formtags/build.xml b/build-formtags/build.xml
new file mode 100644
index 0000000..c2be132
--- /dev/null
+++ b/build-formtags/build.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="s2ap-formtags-sample" default="precommit">
+
+ <path id="bundles">
+ <pathelement location="${basedir}/../war/formtags-war" />
+ <pathelement location="${basedir}/../shared-libs/formtags-shared-libs"/>
+ <pathelement location="${basedir}/../shared-services/build-shared-services" />
+ <pathelement location="${basedir}/../par/org.springframework.showcase.formtags"/>
+ </path>
+
+ <property file="${basedir}/../build.properties"/>
+ <import file="${basedir}/package-top-level.xml"/>
+ <import file="${basedir}/publish-top-level.xml"/>
+ <import file="${basedir}/../virgo-build/multi-bundle/default.xml"/>
+
+ <target name="precommit" depends="clean, clean-integration, jar"/>
+
+</project>
diff --git a/build-formtags/package-bundle.xml b/build-formtags/package-bundle.xml
new file mode 100644
index 0000000..d5894de
--- /dev/null
+++ b/build-formtags/package-bundle.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="package-bundle">
+
+ <target name="package" depends="ivy.init">
+ <dist-jar/>
+ </target>
+
+</project>
diff --git a/build-formtags/package-top-level.xml b/build-formtags/package-top-level.xml
new file mode 100644
index 0000000..e2a5c45
--- /dev/null
+++ b/build-formtags/package-top-level.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="package-top-level">
+
+ <target name="package" description="Creates the release package for this project">
+ <delete dir="${package.output.dir}" quiet="true"/>
+ <mkdir dir="${package.output.dir}"/>
+ <delete file="${package.output.file}" quiet="true"/>
+ <mkdir dir="${artifacts.dir}"/>
+
+ <all-bundles target="package">
+ <property name="package.output.dir" value="${package.output.dir}"/>
+ </all-bundles>
+
+ <copy todir="${package.output.dir}/projects">
+ <fileset dir="${basedir}/..">
+ <exclude name="integration-repo/**" />
+ <exclude name="ivy-cache/**" />
+ <exclude name="**/target/**"/>
+ </fileset>
+ </copy>
+
+ <replaceregexp match="build.stamp.*\n" replace="" flags="g"
+ file="${package.output.dir}/projects/build.properties"/>
+
+ <replaceregexp match="release.type=.*" replace="release.type=integration" flags="g"
+ file="${package.output.dir}/projects/build.properties"/>
+
+ <copy todir="${package.output.dir}">
+ <fileset dir="${basedir}/resources" />
+ </copy>
+
+ <zip destfile="${package.output.file}">
+ <zipfileset dir="${package.dir}"/>
+ </zip>
+ </target>
+
+</project>
diff --git a/build-formtags/publish-top-level.xml b/build-formtags/publish-top-level.xml
new file mode 100644
index 0000000..2709349
--- /dev/null
+++ b/build-formtags/publish-top-level.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="publish-top-level">
+
+ <target name="publish" depends="publish-package" description="Publish package"/>
+
+</project>
diff --git a/build-formtags/resources/About.html b/build-formtags/resources/About.html
new file mode 100644
index 0000000..9e8bc96
--- /dev/null
+++ b/build-formtags/resources/About.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0047)http://www.eclipse.org/legal/epl/longabout.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>About</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>About This Content</H2>
+
+<P><<EM>insert current release date here, e.g., June 5, 2007</EM>></P>
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party ("Redistributor") and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <A href="http://www.eclipse.org/">http://www.eclipse.org</A>.</P>
+
+
+ <H3>Third Party Content</H3>
+ <P>The Content includes items that have been sourced from third parties as set out below. If you
+ did not receive this Content directly from the Eclipse Foundation, the following is provided
+ for informational purposes only, and you should look to the Redistributor's license for
+ terms and conditions of use.</P>
+ <P><EM>
+ <STRONG>Replace these sections with the relevant content, as described below. One section
+ will be required for each third-party component contained within the plug-in</STRONG><BR><BR>
+ <STRONG>Name of first package including version number</STRONG> <BR><BR>
+ Please include in this section information about the package including
+ where it was obtained from, outbound licensing
+ terms and notices that may apply, and anything else necessary to meet the obligations of
+ redistribution (and possibly modification, etc.) under the inbound license. If the source
+ code for the package is not available at eclipse.org, please include instructions on how to
+ get it regardless of whether you are obligated to do so by the license.
+ <BR><BR>
+ <STRONG>Name of second package including version number</STRONG><BR><BR>
+ Please include in this section information about the package including
+ where it was obtained from, outbound licensing
+ terms and notices that may apply, and anything else necessary to meet the obligations of
+ redistribution (and possibly modification, etc.) under the inbound license. If the source
+ code for the package is not available at eclipse.org, please include instructions on how to
+ get it regardless of whether you are obligated to do so by the license.
+ </EM></P>
+
+ <h4>
+ <a href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</a>
+ </h4>
+ <ul>
+ <li>Apache Commons IO
+ </li>
+ <li>Apache Commons Logging
+ </li>
+ <li>Apache Felix Configuration Admin
+ </li>
+ <li>Apache Felix Event Admin
+ </li>
+ <li>Apache Felix Log Service
+ </li>
+ <li>Apache Standard Taglibs
+ </li>
+ <li>Apache Tomcat
+ </li>
+ <li>Spring Dynamic Modules
+ </li>
+ <li>Spring Framework
+ </li>
+ </ul>
+ <h4>
+ <a href="http://www.sun.com/cddl/cddl.html">Common Development and Distribution License 1.0</a>
+ </h4>
+ <ul>
+ <li>javax.activation
+ </li>
+ <li>javax.annotation
+ </li>
+ <li>javax.ejb
+ </li>
+ <li>javax.el
+ </li>
+ <li>javax.jms
+ </li>
+ <li>javax.mail
+ </li>
+ <li>javax.persistence
+ </li>
+ <li>javax.servlet
+ </li>
+ <li>javax.servlet.jsp
+ </li>
+ <li>javax.servlet.jsp.jstl
+ </li>
+ <li>javax.transaction
+ </li>
+ <li>javax.xml.bind
+ </li>
+ <li>javax.xml.rpc
+ </li>
+ <li>javax.xml.soap
+ </li>
+ <li>javax.xml.stream
+ </li>
+ <li>javax.xml.ws
+ </li>
+ </ul>
+ <h4>
+ <a href="http://asm.objectweb.org/license.html">ASM License</a>
+ </h4>
+ <ul>
+ <li>ASM
+ </li>
+ </ul>
+ <h4>
+ <a href="http://www.slf4j.org/license.html">SLF4J License</a>
+ </h4>
+ <ul>
+ <li>SLF4J
+ </li>
+ </ul>
+
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/build-formtags/resources/README.TXT b/build-formtags/resources/README.TXT
new file mode 100644
index 0000000..ce5475a
--- /dev/null
+++ b/build-formtags/resources/README.TXT
@@ -0,0 +1,101 @@
+================================================================================
+== Virgo Server - Form Tags ==
+================================================================================
+
+@author Sam Brannen
+@author Christopher Frost
+
+--------------------------------------------------------------------------------
+
+OVERVIEW
+
+The Virgo Server - Form Tags distribution provides a set of web application
+projects which collectively demonstrate the supported packaging and deployment
+options available when migrating from a standard Java EE WAR to a PAR with a
+web bundle.
+
+For Web Application Archives (WAR), the Virgo Server provides support for the
+following three formats.
+
+ 1. Standard Java EE WAR
+ 2. Shared Libraries WAR
+ 3. Shared Services WAR
+
+Above and beyond WAR-based deployment formats, the Virgo Server introduces a
+deployment and packaging option for OSGi-compliant web applications, the web
+bundle format. Web modules have a structure similar to a Shared Services WAR
+and therefore build on the support for all three WAR deployment formats. In
+addition, web modules benefit from reduced configuration for Spring MVC based
+applications.
+
+If you want to take full advantage of all that the Virgo Server and OSGi have
+to offer, packaging and deploying your applications as a PAR or Plan is the
+recommend choice. A PAR is a standard JAR which contains all of the modules of
+your application (e.g., service, domain, and infrastructure bundles as well as
+a WAR or web bundle for web applications) in a single deployment unit. The last
+step in the migration therefore demonstrates how to package and deploy the Form
+Tags application as a service bundle and a web bundle within a PAR.
+
+For further details, please consult the Virgo Server's Programmer Guide. You will
+find links to the most current documentation here:
+
+http://www.eclipse.org/virgo
+
+--------------------------------------------------------------------------------
+
+CONTENTS
+
+The root of the distribution contains the following folders:
+
+ - dist: pre-built and pre-packaged artifacts which can be deployed directly
+ on the server.
+ - projects: the source code and build scripts for building and packaging each
+ of the sample projects from the command line.
+
+--------------------------------------------------------------------------------
+
+PRE-PACKAGED DISTRIBUTABLES
+
+If you would simply like to see the web applications in action, you can hot
+deploy each of them from the command line or via drag-and-drop semantics in your
+operating system's file system explorer (e.g., Windows Explorer or Mac Finder)
+by copying each file to the server's 'pickup' directory as outlined below.
+Alternatively, you can deploy the applications via the web-based admin console
+(e.g., http://localhost:8080/admin).
+
+Standard WAR
+ - Copy dist/formtags-war-2.0.1.RELEASE.war to the SERVER_HOME/pickup
+ directory.
+ - Open http://localhost:8080/formtags-war-1.0.0.RELEASE
+
+Shared Libraries WAR
+ - Copy dist/formtags-shared-libs-2.0.1.RELEASE.war to the SERVER_HOME/pickup
+ directory.
+ - Open http://localhost:8080/formtags-shared-libs-2.0.1.RELEASE
+
+Shared Services WAR
+ - Note that the 'service' bundle must be deployed prior to the WAR.
+ - Copy dist/formtags-shared-services-service-2.0.1.RELEASE.jar to the
+ SERVER_HOME/pickup directory.
+ - Copy dist/formtags-shared-services-war-2.0.1.RELEASE.war to the
+ SERVER_HOME/pickup directory.
+ - Open http://localhost:8080/formtags-shared-services-war-2.0.1.RELEASE
+
+PAR with a Web Bundle
+ - Copy dist/formtags-par-2.0.1.RELEASE.par to the SERVER_HOME/pickup
+ directory.
+ - Open http://localhost:8080/formtags-par
+
+--------------------------------------------------------------------------------
+
+MANUALLY BUILDING PROJECTS
+
+If you would like to manually build and package any of the sample projects,
+please consult the corresponding instructions at the following locations.
+
+- war/README.TXT
+- shared-libs/README.TXT
+- shared-services/README.TXT
+- par/README.TXT
+
+--------------------------------------------------------------------------------
diff --git a/build-formtags/resources/about_files/LICENSE-AspectJ.html b/build-formtags/resources/about_files/LICENSE-AspectJ.html
new file mode 100644
index 0000000..8f7d0a4
--- /dev/null
+++ b/build-formtags/resources/about_files/LICENSE-AspectJ.html
@@ -0,0 +1,91 @@
+<html>
+
+<head>
+<title>AspectJ License</title>
+
+
+</head>
+
+<BODY BGCOLOR="white">
+
+<h2 align="center"><b>AspectJ<sup><small>TM</small></sup>
+ Compiler and Core Tools License</b></h2>
+
+<p>This is a binary-only release. Source code
+is available from
+<a href="http://eclipse.org/aspectj">http://eclipse.org/aspectj</a></p>
+
+<p>The Eclipse Foundation makes available all content in this distribution ("Content").
+ Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
+ Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
+ at <a href="../../org/documents/epl-v10.php">http://www.eclipse.org/legal/epl-v10.html</a>.
+ For purposes of the EPL, "Program" will mean the Content.</p>
+
+ <p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+ being redistributed by another party ("Redistributor") and different terms and conditions may
+ apply to your use of any object code in the Content. Check the Redistributor's license
+ that was provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+ indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+ and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
+
+
+ <h3>Third Party Content</h3>
+ <p>The Content includes items that have been sourced from third parties as set out below. If you
+ did not receive this Content directly from the Eclipse Foundation, the following is provided
+ for informational purposes only, and you should look to the Redistributor?s license for
+ terms and conditions of use.</p>
+ <em>
+
+ <h4>BCEL v5.1</h4>
+ <p>This product contains software developed by the
+ Apache Software Foundation (<a href="http://www.apache.org/">http://www.apache.org</a>).</p>
+
+ <p>AspectJ includes a modified version of the Apache Jakarta Byte Code Engineering Library (BCEL) v5.1.
+ BCEL is available at <a href="http://jakarta.apache.org/bcel/">http://jakarta.apache.org/bcel/</a>. Source
+ code for the modified version of BCEL is available at Eclipse.org in the AspectJ source tree. This code
+ is made available under the Apache Software License v1.1</p>
+
+ <h4>ASM v2.2.1</h4>
+ <p>AspectJ includes a binary version of ASM v2.2.1 (<a href="http://asm.objectweb.org/index.html">http://asm.objectweb.org/</a>)
+ The source code for ASM is available from the ObjectWeb download site at
+ <a href="http://asm.objectweb.org/download/">http://asm.objectweb.org/download/</a>.
+ <p>The ASM license is available at <a href="http://asm.objectweb.org/license.html">http://asm.objectweb.org/license.html</a>.
+ The license is also reproduced here:
+ </p>
+
+<pre>Copyright (c) 2000-2005 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+</pre>
+
+</em>
+
+</body>
+
+</html>
diff --git a/build-formtags/resources/about_files/apache-v20.txt b/build-formtags/resources/about_files/apache-v20.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/build-formtags/resources/about_files/apache-v20.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/build-formtags/resources/about_files/asm.txt b/build-formtags/resources/about_files/asm.txt
new file mode 100644
index 0000000..75ad085
--- /dev/null
+++ b/build-formtags/resources/about_files/asm.txt
@@ -0,0 +1,29 @@
+Copyright (c) 2000-2005 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/build-formtags/resources/about_files/cddl-10.txt b/build-formtags/resources/about_files/cddl-10.txt
new file mode 100644
index 0000000..3bc759f
--- /dev/null
+++ b/build-formtags/resources/about_files/cddl-10.txt
@@ -0,0 +1,382 @@
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
+Thu, 2007-06-07 16:10 — nelson
+COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
+
+1. Definitions.
+
+1.1. "Contributor" means each individual or entity that
+creates or contributes to the creation of Modifications.
+
+1.2. "Contributor Version" means the combination of the
+Original Software, prior Modifications used by a
+Contributor (if any), and the Modifications made by that
+particular Contributor.
+
+1.3. "Covered Software" means (a) the Original Software, or
+(b) Modifications, or (c) the combination of files
+containing Original Software with files containing
+Modifications, in each case including portions thereof.
+
+1.4. "Executable" means the Covered Software in any form
+other than Source Code.
+
+1.5. "Initial Developer" means the individual or entity
+that first makes Original Software available under this
+License.
+
+1.6. "Larger Work" means a work which combines Covered
+Software or portions thereof with code not governed by the
+terms of this License.
+
+1.7. "License" means this document.
+
+1.8. "Licensable" means having the right to grant, to the
+maximum extent possible, whether at the time of the initial
+grant or subsequently acquired, any and all of the rights
+conveyed herein.
+
+1.9. "Modifications" means the Source Code and Executable
+form of any of the following:
+
+A. Any file that results from an addition to,
+deletion from or modification of the contents of a
+file containing Original Software or previous
+Modifications;
+
+B. Any new file that contains any part of the
+Original Software or previous Modification; or
+
+C. Any new file that is contributed or otherwise made
+available under the terms of this License.
+
+1.10. "Original Software" means the Source Code and
+Executable form of computer software code that is
+originally released under this License.
+
+1.11. "Patent Claims" means any patent claim(s), now owned
+or hereafter acquired, including without limitation,
+method, process, and apparatus claims, in any patent
+Licensable by grantor.
+
+1.12. "Source Code" means (a) the common form of computer
+software code in which modifications are made and (b)
+associated documentation included in or with such code.
+
+1.13. "You" (or "Your") means an individual or a legal
+entity exercising rights under, and complying with all of
+the terms of, this License. For legal entities, "You"
+includes any entity which controls, is controlled by, or is
+under common control with You. For purposes of this
+definition, "control" means (a) the power, direct or
+indirect, to cause the direction or management of such
+entity, whether by contract or otherwise, or (b) ownership
+of more than fifty percent (50%) of the outstanding shares
+or beneficial ownership of such entity.
+
+2. License Grants.
+
+2.1. The Initial Developer Grant.
+
+Conditioned upon Your compliance with Section 3.1 below and
+subject to third party intellectual property claims, the
+Initial Developer hereby grants You a world-wide,
+royalty-free, non-exclusive license:
+
+(a) under intellectual property rights (other than
+patent or trademark) Licensable by Initial Developer,
+to use, reproduce, modify, display, perform,
+sublicense and distribute the Original Software (or
+portions thereof), with or without Modifications,
+and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making,
+using or selling of Original Software, to make, have
+made, use, practice, sell, and offer for sale, and/or
+otherwise dispose of the Original Software (or
+portions thereof).
+
+(c) The licenses granted in Sections 2.1(a) and (b)
+are effective on the date Initial Developer first
+distributes or otherwise makes the Original Software
+available to a third party under the terms of this
+License.
+
+(d) Notwithstanding Section 2.1(b) above, no patent
+license is granted: (1) for code that You delete from
+the Original Software, or (2) for infringements
+caused by: (i) the modification of the Original
+Software, or (ii) the combination of the Original
+Software with other software or devices.
+
+2.2. Contributor Grant.
+
+Conditioned upon Your compliance with Section 3.1 below and
+subject to third party intellectual property claims, each
+Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than
+patent or trademark) Licensable by Contributor to
+use, reproduce, modify, display, perform, sublicense
+and distribute the Modifications created by such
+Contributor (or portions thereof), either on an
+unmodified basis, with other Modifications, as
+Covered Software and/or as part of a Larger Work; and
+
+(b) under Patent Claims infringed by the making,
+using, or selling of Modifications made by that
+Contributor either alone and/or in combination with
+its Contributor Version (or portions of such
+combination), to make, use, sell, offer for sale,
+have made, and/or otherwise dispose of: (1)
+Modifications made by that Contributor (or portions
+thereof); and (2) the combination of Modifications
+made by that Contributor with its Contributor Version
+(or portions of such combination).
+
+(c) The licenses granted in Sections 2.2(a) and
+2.2(b) are effective on the date Contributor first
+distributes or otherwise makes the Modifications
+available to a third party.
+
+(d) Notwithstanding Section 2.2(b) above, no patent
+license is granted: (1) for any code that Contributor
+has deleted from the Contributor Version; (2) for
+infringements caused by: (i) third party
+modifications of Contributor Version, or (ii) the
+combination of Modifications made by that Contributor
+with other software (except as part of the
+Contributor Version) or other devices; or (3) under
+Patent Claims infringed by Covered Software in the
+absence of Modifications made by that Contributor.
+
+3. Distribution Obligations.
+
+3.1. Availability of Source Code.
+
+Any Covered Software that You distribute or otherwise make
+available in Executable form must also be made available in
+Source Code form and that Source Code form must be
+distributed only under the terms of this License. You must
+include a copy of this License with every copy of the
+Source Code form of the Covered Software You distribute or
+otherwise make available. You must inform recipients of any
+such Covered Software in Executable form as to how they can
+obtain such Covered Software in Source Code form in a
+reasonable manner on or through a medium customarily used
+for software exchange.
+
+3.2. Modifications.
+
+The Modifications that You create or to which You
+contribute are governed by the terms of this License. You
+represent that You believe Your Modifications are Your
+original creation(s) and/or You have sufficient rights to
+grant the rights conveyed by this License.
+
+3.3. Required Notices.
+
+You must include a notice in each of Your Modifications
+that identifies You as the Contributor of the Modification.
+You may not remove or alter any copyright, patent or
+trademark notices contained within the Covered Software, or
+any notices of licensing or any descriptive text giving
+attribution to any Contributor or the Initial Developer.
+
+3.4. Application of Additional Terms.
+
+You may not offer or impose any terms on any Covered
+Software in Source Code form that alters or restricts the
+applicable version of this License or the recipients'
+rights hereunder. You may choose to offer, and to charge a
+fee for, warranty, support, indemnity or liability
+obligations to one or more recipients of Covered Software.
+However, you may do so only on Your own behalf, and not on
+behalf of the Initial Developer or any Contributor. You
+must make it absolutely clear that any such warranty,
+support, indemnity or liability obligation is offered by
+You alone, and You hereby agree to indemnify the Initial
+Developer and every Contributor for any liability incurred
+by the Initial Developer or such Contributor as a result of
+warranty, support, indemnity or liability terms You offer.
+
+3.5. Distribution of Executable Versions.
+
+You may distribute the Executable form of the Covered
+Software under the terms of this License or under the terms
+of a license of Your choice, which may contain terms
+different from this License, provided that You are in
+compliance with the terms of this License and that the
+license for the Executable form does not attempt to limit
+or alter the recipient's rights in the Source Code form
+from the rights set forth in this License. If You
+distribute the Covered Software in Executable form under a
+different license, You must make it absolutely clear that
+any terms which differ from this License are offered by You
+alone, not by the Initial Developer or Contributor. You
+hereby agree to indemnify the Initial Developer and every
+Contributor for any liability incurred by the Initial
+Developer or such Contributor as a result of any such terms
+You offer.
+
+3.6. Larger Works.
+
+You may create a Larger Work by combining Covered Software
+with other code not governed by the terms of this License
+and distribute the Larger Work as a single product. In such
+a case, You must make sure the requirements of this License
+are fulfilled for the Covered Software.
+
+4. Versions of the License.
+
+4.1. New Versions.
+
+Sun Microsystems, Inc. is the initial license steward and
+may publish revised and/or new versions of this License
+from time to time. Each version will be given a
+distinguishing version number. Except as provided in
+Section 4.3, no one other than the license steward has the
+right to modify this License.
+
+4.2. Effect of New Versions.
+
+You may always continue to use, distribute or otherwise
+make the Covered Software available under the terms of the
+version of the License under which You originally received
+the Covered Software. If the Initial Developer includes a
+notice in the Original Software prohibiting it from being
+distributed or otherwise made available under any
+subsequent version of the License, You must distribute and
+make the Covered Software available under the terms of the
+version of the License under which You originally received
+the Covered Software. Otherwise, You may also choose to
+use, distribute or otherwise make the Covered Software
+available under the terms of any subsequent version of the
+License published by the license steward.
+
+4.3. Modified Versions.
+
+When You are an Initial Developer and You want to create a
+new license for Your Original Software, You may create and
+use a modified version of this License if You: (a) rename
+the license and remove any references to the name of the
+license steward (except to note that the license differs
+from this License); and (b) otherwise make it clear that
+the license contains terms which differ from this License.
+
+5. DISCLAIMER OF WARRANTY.
+
+COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS"
+BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED
+SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR
+PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY
+COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE
+INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF
+ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF
+WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS
+DISCLAIMER.
+
+6. TERMINATION.
+
+6.1. This License and the rights granted hereunder will
+terminate automatically if You fail to comply with terms
+herein and fail to cure such breach within 30 days of
+becoming aware of the breach. Provisions which, by their
+nature, must remain in effect beyond the termination of
+this License shall survive.
+
+6.2. If You assert a patent infringement claim (excluding
+declaratory judgment actions) against Initial Developer or
+a Contributor (the Initial Developer or Contributor against
+whom You assert such claim is referred to as "Participant")
+alleging that the Participant Software (meaning the
+Contributor Version where the Participant is a Contributor
+or the Original Software where the Participant is the
+Initial Developer) directly or indirectly infringes any
+patent, then any and all rights granted directly or
+indirectly to You by such Participant, the Initial
+Developer (if the Initial Developer is not the Participant)
+and all Contributors under Sections 2.1 and/or 2.2 of this
+License shall, upon 60 days notice from Participant
+terminate prospectively and automatically at the expiration
+of such 60 day notice period, unless if within such 60 day
+period You withdraw Your claim with respect to the
+Participant Software against such Participant either
+unilaterally or pursuant to a written agreement with
+Participant.
+
+6.3. In the event of termination under Sections 6.1 or 6.2
+above, all end user licenses that have been validly granted
+by You or any distributor hereunder prior to termination
+(excluding licenses granted to You by any distributor)
+shall survive termination.
+
+7. LIMITATION OF LIABILITY.
+
+UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE
+INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF
+COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE
+LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR
+CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
+LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK
+STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL
+INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT
+APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO
+NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR
+CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT
+APPLY TO YOU.
+
+8. U.S. GOVERNMENT END USERS.
+
+The Covered Software is a "commercial item," as that term is
+defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial
+computer software" (as that term is defined at 48 C.F.R. ¤
+252.227-7014(a)(1)) and "commercial computer software
+documentation" as such terms are used in 48 C.F.R. 12.212 (Sept.
+1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1
+through 227.7202-4 (June 1995), all U.S. Government End Users
+acquire Covered Software with only those rights set forth herein.
+This U.S. Government Rights clause is in lieu of, and supersedes,
+any other FAR, DFAR, or other clause or provision that addresses
+Government rights in computer software under this License.
+
+9. MISCELLANEOUS.
+
+This License represents the complete agreement concerning subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the
+extent necessary to make it enforceable. This License shall be
+governed by the law of the jurisdiction specified in a notice
+contained within the Original Software (except to the extent
+applicable law, if any, provides otherwise), excluding such
+jurisdiction's conflict-of-law provisions. Any litigation
+relating to this License shall be subject to the jurisdiction of
+the courts located in the jurisdiction and venue specified in a
+notice contained within the Original Software, with the losing
+party responsible for costs, including, without limitation, court
+costs and reasonable attorneys' fees and expenses. The
+application of the United Nations Convention on Contracts for the
+International Sale of Goods is expressly excluded. Any law or
+regulation which provides that the language of a contract shall
+be construed against the drafter shall not apply to this License.
+You agree that You alone are responsible for compliance with the
+United States export administration regulations (and the export
+control laws and regulation of any other countries) when You use,
+distribute or otherwise make available any Covered Software.
+
+10. RESPONSIBILITY FOR CLAIMS.
+
+As between Initial Developer and the Contributors, each party is
+responsible for claims and damages arising, directly or
+indirectly, out of its utilization of rights under this License
+and You agree to work with Initial Developer and Contributors to
+distribute such responsibility on an equitable basis. Nothing
+herein is intended or shall be deemed to constitute any admission
+of liability.
diff --git a/build-formtags/resources/about_files/slf4j.txt b/build-formtags/resources/about_files/slf4j.txt
new file mode 100644
index 0000000..371607c
--- /dev/null
+++ b/build-formtags/resources/about_files/slf4j.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2004-2008 QOS.ch
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/build-formtags/resources/epl-v10.html b/build-formtags/resources/epl-v10.html
new file mode 100644
index 0000000..4da2302
--- /dev/null
+++ b/build-formtags/resources/epl-v10.html
@@ -0,0 +1,258 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+
+
+
+
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+ body {
+ size: 8.5in 11.0in;
+ margin: 0.25in 0.5in 0.25in 0.5in;
+ tab-interval: 0.5in;
+ }
+ p {
+ margin-left: auto;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ p.list {
+ margin-left: 0.5in;
+ margin-top: 0.05em;
+ margin-bottom: 0.05em;
+ }
+ </style>
+
+</head><body lang="EN-US">
+
+<p align="center"><b>Eclipse Public License - v 1.0</b></p>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>"Contribution" means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>"Contributor" means any person or entity that distributes
+the Program.</p>
+
+<p>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>"Program" means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED 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. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body></html>
\ No newline at end of file
diff --git a/build-formtags/resources/notice.html b/build-formtags/resources/notice.html
new file mode 100644
index 0000000..0ee73f4
--- /dev/null
+++ b/build-formtags/resources/notice.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
+<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+
+<TITLE>Eclipse Foundation Software User Agreement</TITLE>
+</HEAD><BODY lang="EN-US">
+<H2>Eclipse Foundation Software User Agreement</H2>
+<P>April 14, 2010</P>
+
+<H3>Usage Of Content</H3>
+
+<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+ (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+ CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+ OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+ NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+ CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</P>
+
+<H3>Applicable Licenses</H3>
+
+<P>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+ ("EPL"). A copy of the EPL is provided with this Content and is also available at <A href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>.
+ For purposes of the EPL, "Program" will mean the Content.</P>
+
+<P>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+ repository ("Repository") in software modules ("Modules") and made available as downloadable archives ("Downloads").</P>
+
+<UL>
+ <LI>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").</LI>
+ <LI>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named "plugins".</LI>
+ <LI>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins
+ and/or Fragments associated with that Feature.</LI>
+ <LI>Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.</LI>
+</UL>
+
+<P>The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and
+Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</P>
+
+<UL>
+ <LI>The top-level (root) directory</LI>
+ <LI>Plug-in and Fragment directories</LI>
+ <LI>Inside Plug-ins and Fragments packaged as JARs</LI>
+ <LI>Sub-directories of the directory named "src" of certain Plug-ins</LI>
+ <LI>Feature directories</LI>
+</UL>
+
+<P>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license ("Feature Update License") during the
+installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</P>
+
+<P>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</P>
+
+<UL>
+ <LI>Common Public License Version 1.0 (available at <A href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</A>)</LI>
+ <LI>Apache Software License 1.1 (available at <A href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>)</LI>
+ <LI>Apache Software License 2.0 (available at <A href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</A>)</LI>
+ <LI>Metro Link Public License 1.00 (available at <A href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</A>)</LI>
+ <LI>Mozilla Public License Version 1.1 (available at <A href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</A>)</LI>
+</UL>
+
+<P>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</P>
+
+
+<H3>Use of Provisioning Technology</H3>
+
+<P>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+ Update Manager ("Provisioning Technology") for the purpose of allowing users to install software, documentation, information and/or
+ other materials (collectively "Installable Software"). This capability is provided with the intent of allowing such users to
+ install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <A href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</A>
+ ("Specification").</P>
+
+<P>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+ applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+ in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+ Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</P>
+
+<OL>
+ <LI>A series of actions may occur ("Provisioning Process") in which a user may execute the Provisioning Technology
+ on a machine ("Target Machine") with the intent of installing, extending or updating the functionality of an Eclipse-based
+ product.</LI>
+ <LI>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+ accessed and copied to the Target Machine.</LI>
+ <LI>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+ Software ("Installable Software Agreement") and such Installable Software Agreement shall be accessed from the Target
+ Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+ the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+ indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</LI>
+</OL>
+
+<H3>Cryptography</H3>
+
+<P>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+ another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+ possession, or use, and re-export of encryption software, to see if this is permitted.</P>
+
+<P><SMALL>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</SMALL></P>
+
+
+</BODY></HTML>
\ No newline at end of file
diff --git a/build.properties b/build.properties
new file mode 100644
index 0000000..5c34a39
--- /dev/null
+++ b/build.properties
@@ -0,0 +1,8 @@
+version=2.0.1
+release.type=integration
+natural.name=formtags
+project.name=Virgo Server Samples
+project.key=VSS
+ivy.cache.dir=${basedir}/../../ivy-cache
+integration.repo.dir=${basedir}/../../integration-repo
+disable.bundlor=true
\ No newline at end of file
diff --git a/build.versions b/build.versions
new file mode 100644
index 0000000..d6ba4a6
--- /dev/null
+++ b/build.versions
@@ -0,0 +1,2 @@
+org.junit=4.7.0
+org.springframework.spring=3.0.0.RELEASE
diff --git a/par/README.TXT b/par/README.TXT
new file mode 100644
index 0000000..b560ff7
--- /dev/null
+++ b/par/README.TXT
@@ -0,0 +1,37 @@
+================================================================================
+== Virgo Server - Form Tags - PAR ==
+================================================================================
+
+@author Sam Brannen
+@author Colin Yates
+@author Christopher Frost
+
+--------------------------------------------------------------------------------
+
+This is a version of the Spring Form Tags showcase application which has been
+converted into a PAR with domain and service bundles as well as a Web Module.
+
+--------------------------------------------------------------------------------
+
+PROJECTS
+
+ - org.springframework.showcase.formtags: the build directory for the PAR
+ - org.springframework.showcase.formtags.domain: the domain classes
+ - org.springframework.showcase.formtags.service: the service API and implementation
+ - org.springframework.showcase.formtags.web: the web module
+
+--------------------------------------------------------------------------------
+
+BUILD AND DEPLOYMENT
+
+1) $> cd org.springframework.showcase.formtags
+
+2) $> ant jar
+
+3) Copy target/artifacts/formtags-par.par to the $SERVER_HOME/pickup directory.
+
+--------------------------------------------------------------------------------
+
+URL: http://localhost:8080/formtags-par
+
+--------------------------------------------------------------------------------
diff --git a/par/org.springframework.showcase.formtags.domain/.classpath b/par/org.springframework.showcase.formtags.domain/.classpath
new file mode 100644
index 0000000..3671d42
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.domain/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources"/>
+ <classpathentry kind="con" path="com.springsource.server.ide.jdt.core.MANIFEST_CLASSPATH_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/JVM 1.6.0"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/par/org.springframework.showcase.formtags.domain/.project b/par/org.springframework.showcase.formtags.domain/.project
new file mode 100644
index 0000000..5ad3ad0
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.domain/.project
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.springframework.showcase.formtags.domain</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.springframework.ide.eclipse.core.springbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.springsource.server.ide.facet.core.bundlenature</nature>
+ <nature>org.springframework.ide.eclipse.core.springnature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+ </natures>
+</projectDescription>
diff --git a/par/org.springframework.showcase.formtags.domain/.settings/org.eclipse.jdt.core.prefs b/par/org.springframework.showcase.formtags.domain/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..57deb69
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.domain/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Fri May 02 14:21:04 BST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/par/org.springframework.showcase.formtags.domain/.settings/org.eclipse.jst.common.project.facet.core.prefs b/par/org.springframework.showcase.formtags.domain/.settings/org.eclipse.jst.common.project.facet.core.prefs
new file mode 100644
index 0000000..9274d51
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.domain/.settings/org.eclipse.jst.common.project.facet.core.prefs
@@ -0,0 +1,3 @@
+#Thu Jun 11 16:56:17 BST 2009
+classpath.helper/org.eclipse.jdt.launching.JRE_CONTAINER\:\:org.eclipse.jdt.internal.launching.macosx.MacOSXType\:\:JVM\ 1.6.0/owners=jst.java\:5.0
+eclipse.preferences.version=1
diff --git a/par/org.springframework.showcase.formtags.domain/.settings/org.eclipse.wst.common.project.facet.core.xml b/par/org.springframework.showcase.formtags.domain/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..4eff0bc
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.domain/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <runtime name="SpringSource dm Server (Runtime) v2.0"/>
+ <installed facet="jst.java" version="5.0"/>
+ <installed facet="com.springsource.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/par/org.springframework.showcase.formtags.domain/.springBeans b/par/org.springframework.showcase.formtags.domain/.springBeans
new file mode 100644
index 0000000..3949aa3
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.domain/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+ <version>1</version>
+ <pluginVersion><![CDATA[2.0.5.v200805202005]]></pluginVersion>
+ <configSuffixes>
+ <configSuffix><![CDATA[xml]]></configSuffix>
+ </configSuffixes>
+ <enableImports><![CDATA[false]]></enableImports>
+ <configs>
+ </configs>
+ <configSets>
+ </configSets>
+</beansProjectDescription>
diff --git a/par/org.springframework.showcase.formtags.domain/build.xml b/par/org.springframework.showcase.formtags.domain/build.xml
new file mode 100644
index 0000000..6755ea5
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.domain/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.springframework.showcase.formtags.domain">
+
+ <property file="${basedir}/../../build.properties" />
+ <property file="${basedir}/../../build.versions" />
+ <import file="${basedir}/../../virgo-build/standard/default.xml" />
+
+</project>
diff --git a/par/org.springframework.showcase.formtags.domain/ivy.xml b/par/org.springframework.showcase.formtags.domain/ivy.xml
new file mode 100644
index 0000000..445f845
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.domain/ivy.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+ version="1.3">
+
+ <info organisation="org.eclipse.virgo.samples" module="${ant.project.name}" />
+
+ <configurations>
+ <include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+ </configurations>
+
+ <publications>
+ <artifact name="${ant.project.name}"/>
+ <artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+ </publications>
+
+ <dependencies>
+ <dependency org="org.springframework" name="org.springframework.spring-library" rev="${org.springframework.spring}" conf="server-provided->compile"/>
+ </dependencies>
+
+</ivy-module>
diff --git a/par/org.springframework.showcase.formtags.domain/src/main/java/org/springframework/showcase/formtags/domain/Colour.java b/par/org.springframework.showcase.formtags.domain/src/main/java/org/springframework/showcase/formtags/domain/Colour.java
new file mode 100644
index 0000000..88e715e
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.domain/src/main/java/org/springframework/showcase/formtags/domain/Colour.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+import org.springframework.core.enums.ShortCodedLabeledEnum;
+
+
+
+/**
+
+ * Simple enumeration for common colors.
+
+ *
+
+
+ */
+
+public class Colour extends ShortCodedLabeledEnum {
+
+
+
+
+
+ public static final Colour RED = new Colour(0, "RED");
+
+ public static final Colour GREEN = new Colour(1, "GREEN");
+
+ public static final Colour BLUE = new Colour(2, "BLUE");
+
+
+
+
+
+ private Colour(int code, String label) {
+
+ super(code, label);
+
+ }
+
+
+
+}
+
diff --git a/par/org.springframework.showcase.formtags.domain/src/main/java/org/springframework/showcase/formtags/domain/Country.java b/par/org.springframework.showcase.formtags.domain/src/main/java/org/springframework/showcase/formtags/domain/Country.java
new file mode 100644
index 0000000..caf564c
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.domain/src/main/java/org/springframework/showcase/formtags/domain/Country.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+/**
+
+ * Models a country.
+
+ *
+
+
+ */
+
+public class Country implements Comparable {
+
+
+
+
+
+ private String code;
+
+ private String name;
+
+
+
+
+
+ /**
+
+ * Creates a new instance of this {@link Country} class.
+
+ */
+
+ public Country() {
+
+ }
+
+
+
+ /**
+
+ * Creates a new instance of this {@link Country} class.
+
+ *
+
+ * @param code the country code
+
+ * @param name the name of the country
+
+ */
+
+ public Country(String code, String name) {
+
+ this.code = code;
+
+ this.name = name;
+
+ }
+
+
+
+
+
+ public String getCode() {
+
+ return code;
+
+ }
+
+
+
+ public String getName() {
+
+ return name;
+
+ }
+
+
+
+
+
+ public int compareTo(Object o) {
+
+ return this.code.compareTo(((Country) o).code);
+
+ }
+
+
+
+}
+
diff --git a/par/org.springframework.showcase.formtags.domain/src/main/java/org/springframework/showcase/formtags/domain/Preferences.java b/par/org.springframework.showcase.formtags.domain/src/main/java/org/springframework/showcase/formtags/domain/Preferences.java
new file mode 100644
index 0000000..ab6c627
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.domain/src/main/java/org/springframework/showcase/formtags/domain/Preferences.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+/**
+
+ * Models a {@link User User's} preferences.
+
+ *
+
+
+ */
+
+public class Preferences {
+
+
+
+
+
+ private boolean receiveNewsletter;
+
+ private String[] interests;
+
+ private String favouriteWord;
+
+
+
+
+
+ public boolean isReceiveNewsletter() {
+
+ return receiveNewsletter;
+
+ }
+
+
+
+ public void setReceiveNewsletter(boolean receiveNewsletter) {
+
+ this.receiveNewsletter = receiveNewsletter;
+
+ }
+
+
+
+ public String[] getInterests() {
+
+ return interests;
+
+ }
+
+
+
+ public void setInterests(String[] interests) {
+
+ this.interests = interests;
+
+ }
+
+
+
+ public String getFavouriteWord() {
+
+ return favouriteWord;
+
+ }
+
+
+
+ public void setFavouriteWord(String favouriteWord) {
+
+ this.favouriteWord = favouriteWord;
+
+ }
+
+
+
+}
+
diff --git a/par/org.springframework.showcase.formtags.domain/src/main/java/org/springframework/showcase/formtags/domain/User.java b/par/org.springframework.showcase.formtags.domain/src/main/java/org/springframework/showcase/formtags/domain/User.java
new file mode 100644
index 0000000..925392f
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.domain/src/main/java/org/springframework/showcase/formtags/domain/User.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+import java.util.ArrayList;
+
+import java.util.List;
+
+
+
+/**
+
+ * Models a user.
+
+ *
+
+
+ */
+
+public class User implements Cloneable {
+
+
+
+
+
+ private Integer id;
+
+ private String firstName;
+
+ private String lastName;
+
+ private String notes;
+
+ private String house;
+
+ private Country country = new Country();
+
+ private Colour favouriteColour = Colour.RED;
+
+ private List skills = new ArrayList();
+
+ private char sex;
+
+ private String password;
+
+ private Preferences preferences = new Preferences();
+
+ private String secretWord;
+
+
+
+
+
+ public Integer getId() {
+
+ return id;
+
+ }
+
+
+
+ public void setId(Integer id) {
+
+ this.id = id;
+
+ }
+
+
+
+ public String getFirstName() {
+
+ return firstName;
+
+ }
+
+
+
+ public void setFirstName(String firstName) {
+
+ this.firstName = firstName;
+
+ }
+
+
+
+ public String getLastName() {
+
+ return lastName;
+
+ }
+
+
+
+ public void setLastName(String lastName) {
+
+ this.lastName = lastName;
+
+ }
+
+
+
+ public String getNotes() {
+
+ return notes;
+
+ }
+
+
+
+ public void setNotes(String notes) {
+
+ this.notes = notes;
+
+ }
+
+
+
+ public String getHouse() {
+
+ return house;
+
+ }
+
+
+
+ public void setHouse(String house) {
+
+ this.house = house;
+
+ }
+
+
+
+ public Country getCountry() {
+
+ return country;
+
+ }
+
+
+
+ public void setCountry(Country country) {
+
+ this.country = country;
+
+ }
+
+
+
+ public Colour getFavouriteColour() {
+
+ return favouriteColour;
+
+ }
+
+
+
+ public void setFavouriteColour(Colour favouriteColour) {
+
+ this.favouriteColour = favouriteColour;
+
+ }
+
+
+
+ public char getSex() {
+
+ return sex;
+
+ }
+
+
+
+ public void setSex(char sex) {
+
+ this.sex = sex;
+
+ }
+
+
+
+ public Preferences getPreferences() {
+
+ return preferences;
+
+ }
+
+
+
+ public void setPreferences(Preferences preferences) {
+
+ this.preferences = preferences;
+
+ }
+
+
+
+ public List getSkills() {
+
+ return skills;
+
+ }
+
+
+
+ public void setSkills(List skills) {
+
+ this.skills = skills;
+
+ }
+
+
+
+ public String getPassword() {
+
+ return password;
+
+ }
+
+
+
+ public void setPassword(String password) {
+
+ this.password = password;
+
+ }
+
+
+
+ public String getSecretWord() {
+
+ return secretWord;
+
+ }
+
+
+
+ public void setSecretWord(String secretWord) {
+
+ this.secretWord = secretWord;
+
+ }
+
+
+
+
+
+ public Object clone() throws CloneNotSupportedException {
+
+ return super.clone();
+
+ }
+
+
+
+}
+
diff --git a/par/org.springframework.showcase.formtags.domain/src/main/resources/META-INF/MANIFEST.MF b/par/org.springframework.showcase.formtags.domain/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..0e37306
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.domain/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Version: 2.0.1
+Bundle-Name: FormTags Domain Model
+Bundle-SymbolicName: org.springframework.showcase.formtags.domain_par
+Export-Package: org.springframework.showcase.formtags.domain
+Import-Bundle: com.springsource.javax.servlet;version="2.5.0"
+Import-Library: org.springframework.spring;version="[2.5.6.A,4.0.0)"
diff --git a/par/org.springframework.showcase.formtags.service/.classpath b/par/org.springframework.showcase.formtags.service/.classpath
new file mode 100644
index 0000000..3671d42
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.service/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources"/>
+ <classpathentry kind="con" path="com.springsource.server.ide.jdt.core.MANIFEST_CLASSPATH_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/JVM 1.6.0"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/par/org.springframework.showcase.formtags.service/.project b/par/org.springframework.showcase.formtags.service/.project
new file mode 100644
index 0000000..33c55ce
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.service/.project
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.springframework.showcase.formtags.service</name>
+ <comment></comment>
+ <projects>
+ <project>org.springframework.showcase.formtags.domain</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.springframework.ide.eclipse.core.springbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.springsource.server.ide.facet.core.bundlenature</nature>
+ <nature>org.springframework.ide.eclipse.core.springnature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+ </natures>
+</projectDescription>
diff --git a/par/org.springframework.showcase.formtags.service/.settings/org.eclipse.jdt.core.prefs b/par/org.springframework.showcase.formtags.service/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1c62194
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.service/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Fri May 02 14:21:08 BST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/par/org.springframework.showcase.formtags.service/.settings/org.eclipse.jst.common.project.facet.core.prefs b/par/org.springframework.showcase.formtags.service/.settings/org.eclipse.jst.common.project.facet.core.prefs
new file mode 100644
index 0000000..9312946
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.service/.settings/org.eclipse.jst.common.project.facet.core.prefs
@@ -0,0 +1,3 @@
+#Thu Jun 11 16:56:25 BST 2009
+classpath.helper/org.eclipse.jdt.launching.JRE_CONTAINER\:\:org.eclipse.jdt.internal.launching.macosx.MacOSXType\:\:JVM\ 1.6.0/owners=jst.java\:5.0
+eclipse.preferences.version=1
diff --git a/par/org.springframework.showcase.formtags.service/.settings/org.eclipse.wst.common.project.facet.core.xml b/par/org.springframework.showcase.formtags.service/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..4eff0bc
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.service/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <runtime name="SpringSource dm Server (Runtime) v2.0"/>
+ <installed facet="jst.java" version="5.0"/>
+ <installed facet="com.springsource.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/par/org.springframework.showcase.formtags.service/.springBeans b/par/org.springframework.showcase.formtags.service/.springBeans
new file mode 100644
index 0000000..02c34e1
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.service/.springBeans
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+ <version>1</version>
+ <pluginVersion><![CDATA[2.0.5.v200805202005]]></pluginVersion>
+ <configSuffixes>
+ <configSuffix><![CDATA[xml]]></configSuffix>
+ </configSuffixes>
+ <enableImports><![CDATA[false]]></enableImports>
+ <configs>
+ <config>src/main/resources/META-INF/spring/module-context.xml</config>
+ <config>src/main/resources/META-INF/spring/osgi-context.xml</config>
+ </configs>
+ <configSets>
+ </configSets>
+</beansProjectDescription>
diff --git a/par/org.springframework.showcase.formtags.service/build.xml b/par/org.springframework.showcase.formtags.service/build.xml
new file mode 100644
index 0000000..48383c3
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.service/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.springframework.showcase.formtags.service">
+
+ <property file="${basedir}/../../build.properties" />
+ <property file="${basedir}/../../build.versions" />
+ <import file="${basedir}/../../virgo-build/standard/default.xml" />
+
+</project>
diff --git a/par/org.springframework.showcase.formtags.service/ivy.xml b/par/org.springframework.showcase.formtags.service/ivy.xml
new file mode 100644
index 0000000..37e7b5b
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.service/ivy.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+ version="1.3">
+
+ <info organisation="org.eclipse.virgo.samples" module="${ant.project.name}" />
+
+ <configurations>
+ <include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+ </configurations>
+
+ <publications>
+ <artifact name="${ant.project.name}"/>
+ <artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+ </publications>
+
+ <dependencies>
+ <dependency org="org.eclipse.virgo.samples" name="org.springframework.showcase.formtags.domain" rev="latest.integration" conf="compile->compile"/>
+ </dependencies>
+
+</ivy-module>
diff --git a/par/org.springframework.showcase.formtags.service/src/main/java/org/springframework/showcase/formtags/service/UserManager.java b/par/org.springframework.showcase.formtags.service/src/main/java/org/springframework/showcase/formtags/service/UserManager.java
new file mode 100644
index 0000000..5bcaa12
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.service/src/main/java/org/springframework/showcase/formtags/service/UserManager.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.service;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.domain.User;
+
+
+
+import java.util.Collection;
+
+
+
+/**
+
+ * Central service interface for the application.
+
+ *
+
+
+ */
+
+public interface UserManager {
+
+
+
+ /**
+
+ * Finds all of the {@link User Users} in the system.
+
+ *
+
+ * @return a {@link Collection} of all of the {@link User Users} in the system.
+
+ */
+
+ Collection findAll();
+
+
+
+ /**
+
+ * Finds the specific {@link User} identified by the supplied <code>id</code>.
+
+ *
+
+ * @param id the value uniquely identifying a {@link User}
+
+ * @return the located {@link User} or <code>null</code> if not found
+
+ */
+
+ User findById(Integer id);
+
+
+
+ /**
+
+ * Saves the supplied {@link User} to persistent storage.
+
+ *
+
+ * @param user the {@link User} to be so saved
+
+ */
+
+ void save(User user);
+
+
+
+ /**
+
+ * Finds all of the {@link Country Countries} in the system.
+
+ *
+
+ * @return all of the {@link Country Countries} in the system
+
+ */
+
+ Collection findAllCountries();
+
+
+
+ /**
+
+ * Finds the specific {@link Country} identified by the supplied (country) <code>code</code>.
+
+ *
+
+ * @param code the country code to be used to locate a specific {@link Country}
+
+ * @return the specific {@link Country} identified by the supplied (country) <code>code</code>
+
+ */
+
+ Country findCountry(String code);
+
+}
+
diff --git a/par/org.springframework.showcase.formtags.service/src/main/java/org/springframework/showcase/formtags/service/internal/StubUserManager.java b/par/org.springframework.showcase.formtags.service/src/main/java/org/springframework/showcase/formtags/service/internal/StubUserManager.java
new file mode 100644
index 0000000..f47660e
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.service/src/main/java/org/springframework/showcase/formtags/service/internal/StubUserManager.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.service.internal;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.domain.User;
+
+import org.springframework.showcase.formtags.service.UserManager;
+
+
+
+import java.util.*;
+
+
+
+/**
+
+ * Stub {@link UserManager} implementation that maintains simple
+
+ * in-memory state for users and countries.
+
+ *
+
+
+ */
+
+public class StubUserManager implements UserManager {
+
+
+
+
+
+ private Map users = new TreeMap();
+
+ private Map countries = new TreeMap();
+
+
+
+
+
+ /**
+
+ * Creates a new instance of the {@link StubUserManager} class.
+
+ */
+
+ public StubUserManager() {
+
+ loadCountries();
+
+ loadUsers();
+
+ }
+
+
+
+
+
+ public void save(User user) {
+
+ // passed in should be a clone - simply replace
+
+ putUser(user);
+
+ }
+
+
+
+ public Collection findAllCountries() {
+
+ return this.countries.values();
+
+ }
+
+
+
+ public Country findCountry(String code) {
+
+ return (Country) this.countries.get(code);
+
+ }
+
+
+
+ public User findById(Integer id) {
+
+ User user = (User) this.users.get(id);
+
+
+
+ if (user != null) {
+
+ return cloneUser(user);
+
+ }
+
+
+
+ return null;
+
+ }
+
+
+
+ public Collection findAll() {
+
+ List userList = new ArrayList();
+
+ Iterator itr = this.users.values().iterator();
+
+ while (itr.hasNext()) {
+
+ User user = (User) itr.next();
+
+ userList.add(cloneUser(user));
+
+ }
+
+ return userList;
+
+ }
+
+
+
+
+
+ private void loadCountries() {
+
+ putCountry(new Country("AT", "Austria"));
+
+ putCountry(new Country("UK", "United Kingdom"));
+
+ putCountry(new Country("US", "United States"));
+
+ }
+
+
+
+ private void loadUsers() {
+
+ User u = new User();
+
+ u.setId(new Integer(1));
+
+ u.setFirstName("Harry");
+
+ u.setLastName("Potter");
+
+ u.setNotes("Promising Wizard...");
+
+ u.setCountry(findCountry("UK"));
+
+ u.setSex('M');
+
+ u.setHouse("Gryffindor");
+
+ u.getPreferences().setReceiveNewsletter(true);
+
+ u.getPreferences().setInterests(new String[]{"Quidditch"});
+
+ u.getPreferences().setFavouriteWord("Magic");
+
+ u.setPassword("password");
+
+
+
+ putUser(u);
+
+
+
+ u = new User();
+
+ u.setId(new Integer(2));
+
+ u.setFirstName("Ronald");
+
+ u.setLastName("Weasly");
+
+ u.setNotes("Friends with Harry Potter.");
+
+ u.setCountry(findCountry("UK"));
+
+ u.setSex('M');
+
+ u.setHouse("Gryffindor");
+
+ u.setPassword("password");
+
+
+
+ putUser(u);
+
+
+
+ u = new User();
+
+ u.setId(new Integer(3));
+
+ u.setFirstName("Hermione");
+
+ u.setLastName("Granger");
+
+ u.setNotes("Friends with Harry Potter.");
+
+ u.setCountry(findCountry("UK"));
+
+ u.setSex('F');
+
+ u.setHouse("Gryffindor");
+
+ u.setPassword("password");
+
+
+
+ putUser(u);
+
+ }
+
+
+
+ private void putUser(User user) {
+
+ this.users.put(user.getId(), user);
+
+ }
+
+
+
+ private void putCountry(Country country) {
+
+ this.countries.put(country.getCode(), country);
+
+ }
+
+
+
+ private User cloneUser(User user) {
+
+ try {
+
+ return (User) user.clone();
+
+ }
+
+ catch (CloneNotSupportedException e) {
+
+ throw new IllegalStateException("Unable to clone user.");
+
+ }
+
+ }
+
+
+
+}
+
diff --git a/par/org.springframework.showcase.formtags.service/src/main/resources/META-INF/MANIFEST.MF b/par/org.springframework.showcase.formtags.service/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..74e0b70
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.service/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-Version: 2.0.1
+Bundle-ManifestVersion: 2
+Bundle-Name: FormTags Service (and implementation)
+Bundle-SymbolicName: org.springframework.showcase.formtags.service_par
+Import-Package: org.springframework.showcase.formtags.domain
+Export-Package: org.springframework.showcase.formtags.service
+
diff --git a/par/org.springframework.showcase.formtags.service/src/main/resources/META-INF/spring/module-context.xml b/par/org.springframework.showcase.formtags.service/src/main/resources/META-INF/spring/module-context.xml
new file mode 100644
index 0000000..4254775
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.service/src/main/resources/META-INF/spring/module-context.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xmlns:tx="http://www.springframework.org/schema/tx"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
+ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
+ http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
+
+ <bean id="userService" class="org.springframework.showcase.formtags.service.internal.StubUserManager"/>
+
+</beans>
diff --git a/par/org.springframework.showcase.formtags.service/src/main/resources/META-INF/spring/osgi-context.xml b/par/org.springframework.showcase.formtags.service/src/main/resources/META-INF/spring/osgi-context.xml
new file mode 100644
index 0000000..57ae111
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.service/src/main/resources/META-INF/spring/osgi-context.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans
+ xmlns="http://www.springframework.org/schema/osgi"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:beans="http://www.springframework.org/schema/beans"
+ xsi:schemaLocation="http://www.springframework.org/schema/osgi
+ http://www.springframework.org/schema/osgi/spring-osgi.xsd
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+ <service ref="userService"
+ interface="org.springframework.showcase.formtags.service.UserManager" />
+
+</beans:beans>
\ No newline at end of file
diff --git a/par/org.springframework.showcase.formtags.web/.classpath b/par/org.springframework.showcase.formtags.web/.classpath
new file mode 100644
index 0000000..72b521b
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/.classpath
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources"/>
+ <classpathentry kind="con" path="com.springsource.server.ide.jdt.core.MANIFEST_CLASSPATH_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.springsource.server.ide.server.core.runtime.classpath/SpringSource dm Server (Runtime) v2.0">
+ <attributes>
+ <attribute name="owner.project.facets" value="jst.web"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/JVM 1.6">
+ <attributes>
+ <attribute name="owner.project.facets" value="jst.java"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/par/org.springframework.showcase.formtags.web/.project b/par/org.springframework.showcase.formtags.web/.project
new file mode 100644
index 0000000..336a3a9
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/.project
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.springframework.showcase.formtags.web</name>
+ <comment></comment>
+ <projects>
+ <project>org.springframework.showcase.formtags.domain</project>
+ <project>org.springframework.showcase.formtags.service</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.springframework.ide.eclipse.core.springbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.validation.validationbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.springsource.server.ide.facet.core.bundlenature</nature>
+ <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+ <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+ <nature>org.springframework.ide.eclipse.core.springnature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+ <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+ </natures>
+</projectDescription>
diff --git a/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.jdt.core.prefs b/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..935ed0d
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Fri Jun 26 16:45:50 BST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.wst.common.component b/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.wst.common.component
new file mode 100644
index 0000000..212d673
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-modules id="moduleCoreId" project-version="1.5.0">
+<wb-module deploy-name="org.springframework.showcase.formtags.web">
+<wb-resource deploy-path="/" source-path="/src/main/webapp"/>
+<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
+<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
+<property name="context-root" value="formtags-par"/>
+<property name="java-output-path" value="/target/classes"/>
+</wb-module>
+</project-modules>
diff --git a/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.wst.common.project.facet.core.xml b/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..e98b7c3
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <runtime name="SpringSource dm Server (Runtime) v2.0"/>
+ <fixed facet="jst.web"/>
+ <fixed facet="jst.java"/>
+ <installed facet="jst.web" version="2.5"/>
+ <installed facet="com.springsource.server.bundle" version="1.0"/>
+ <installed facet="jst.java" version="5.0"/>
+</faceted-project>
diff --git a/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.wst.jsdt.ui.superType.container b/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 0000000..3bd5d0a
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.wst.jsdt.ui.superType.name b/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.wst.jsdt.ui.superType.name
new file mode 100644
index 0000000..05bd71b
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/.settings/org.eclipse.wst.jsdt.ui.superType.name
@@ -0,0 +1 @@
+Window
\ No newline at end of file
diff --git a/par/org.springframework.showcase.formtags.web/.springBeans b/par/org.springframework.showcase.formtags.web/.springBeans
new file mode 100644
index 0000000..8ce1035
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+ <version>1</version>
+ <pluginVersion><![CDATA[2.2.5.200906231226-RC1]]></pluginVersion>
+ <configSuffixes>
+ <configSuffix><![CDATA[xml]]></configSuffix>
+ </configSuffixes>
+ <enableImports><![CDATA[false]]></enableImports>
+ <configs>
+ </configs>
+ <configSets>
+ </configSets>
+</beansProjectDescription>
diff --git a/par/org.springframework.showcase.formtags.web/build.xml b/par/org.springframework.showcase.formtags.web/build.xml
new file mode 100644
index 0000000..839364c
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/build.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.springframework.showcase.formtags.web">
+
+ <property file="${basedir}/../../build.properties" />
+ <property file="${basedir}/../../build.versions" />
+ <import file="${basedir}/../../virgo-build/war/default.xml" />
+
+</project>
diff --git a/par/org.springframework.showcase.formtags.web/ivy.xml b/par/org.springframework.showcase.formtags.web/ivy.xml
new file mode 100644
index 0000000..2c6d481
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/ivy.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+ version="1.3">
+
+ <info organisation="org.eclipse.virgo.samples" module="${ant.project.name}" />
+
+ <configurations>
+ <include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+ </configurations>
+
+ <publications>
+ <artifact name="${ant.project.name}" ext="war"/>
+ <artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+ </publications>
+
+ <dependencies>
+ <dependency org="org.eclipse.virgo.samples" name="org.springframework.showcase.formtags.domain" rev="latest.integration" conf="compile->compile"/>
+ <dependency org="org.eclipse.virgo.samples" name="org.springframework.showcase.formtags.service" rev="latest.integration" conf="compile->compile"/>
+
+ <dependency org="org.springframework" name="org.springframework.spring-library" rev="${org.springframework.spring}" conf="server-provided->compile"/>
+ <dependency org="javax.servlet" name="com.springsource.javax.servlet" rev="2.5.0" conf="server-provided->compile"/>
+ <dependency org="org.apache.taglibs" name="com.springsource.org.apache.taglibs.standard" rev="1.1.2" conf="server-provided->compile"/>
+ </dependencies>
+
+</ivy-module>
diff --git a/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/validation/CountryValidator.java b/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/validation/CountryValidator.java
new file mode 100644
index 0000000..c4a591c
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/validation/CountryValidator.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.validation;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.util.StringUtils;
+
+import org.springframework.validation.Errors;
+
+import org.springframework.validation.Validator;
+
+
+
+/**
+
+ * Simple {@link Validator} implementation for {@link Country} instances.
+
+ *
+
+
+ */
+
+public class CountryValidator implements Validator {
+
+
+
+
+
+ public static final String DEFAULT_BAD_PLACEHOLDER_CODE = "-";
+
+
+
+
+
+ private String badPlaceholderCode = DEFAULT_BAD_PLACEHOLDER_CODE;
+
+
+
+
+
+ public void setBadPlaceholderCode(String badPlaceholderCode) {
+
+ this.badPlaceholderCode = StringUtils.hasText(badPlaceholderCode)
+
+ ? badPlaceholderCode : DEFAULT_BAD_PLACEHOLDER_CODE;
+
+ }
+
+
+
+
+
+ public boolean supports(Class candidate) {
+
+ return Country.class.isAssignableFrom(candidate);
+
+ }
+
+
+
+ public void validate(Object object, Errors errors) {
+
+ Country country = (Country) object;
+
+ if (country.getCode() == this.badPlaceholderCode) {
+
+ errors.rejectValue("bad.country.selected", "Please select a valid country");
+
+ }
+
+ }
+
+
+
+}
+
diff --git a/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/validation/UserValidator.java b/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/validation/UserValidator.java
new file mode 100644
index 0000000..88e8aad
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/validation/UserValidator.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.validation;
+
+
+
+import org.springframework.showcase.formtags.domain.User;
+
+import org.springframework.validation.Errors;
+
+import org.springframework.validation.ValidationUtils;
+
+import org.springframework.validation.Validator;
+
+
+
+/**
+
+ * Simple {@link Validator} implementation for {@link User} instances.
+
+ *
+
+
+ */
+
+public class UserValidator implements Validator {
+
+
+
+ public boolean supports(Class candidate) {
+
+ return User.class.isAssignableFrom(candidate);
+
+ }
+
+
+
+ public void validate(Object obj, Errors errors) {
+
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "required", "Field is required.");
+
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "required", "Field is required.");
+
+ }
+
+
+
+}
+
diff --git a/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/web/CountryEditor.java b/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/web/CountryEditor.java
new file mode 100644
index 0000000..6c098e1
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/web/CountryEditor.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.web;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.service.UserManager;
+
+
+
+import java.beans.PropertyEditorSupport;
+
+
+
+/**
+
+ * Simple {@link java.beans.PropertyEditor} for the {@link org.springframework.showcase.formtags.domain.Country} class.
+
+ *
+
+
+ */
+
+public class CountryEditor extends PropertyEditorSupport {
+
+
+
+ private UserManager userManager;
+
+
+
+
+
+ /**
+
+ * Creates a new instance of the {@link org.springframework.showcase.formtags.web.CountryEditor} class.
+
+ *
+
+ * @param userManager the service object that is to be used to resolve country codes
+
+ */
+
+ public CountryEditor(UserManager userManager) {
+
+ this.userManager = userManager;
+
+ }
+
+
+
+
+
+ public void setAsText(String text) throws IllegalArgumentException {
+
+ setValue(this.userManager.findCountry(text));
+
+ }
+
+
+
+ public String getAsText() {
+
+ if (getValue() == null) {
+
+ return "";
+
+ }
+
+ return ((Country) getValue()).getCode();
+
+ }
+
+
+
+}
+
diff --git a/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/web/FormController.java b/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/web/FormController.java
new file mode 100644
index 0000000..70a82f0
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/web/FormController.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.web;
+
+
+
+import org.springframework.core.enums.StaticLabeledEnumResolver;
+
+import org.springframework.showcase.formtags.domain.Colour;
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.domain.User;
+
+import org.springframework.showcase.formtags.service.UserManager;
+
+import org.springframework.ui.ModelMap;
+
+import org.springframework.validation.Errors;
+
+import org.springframework.web.bind.ServletRequestDataBinder;
+
+import org.springframework.web.bind.ServletRequestUtils;
+
+import org.springframework.web.servlet.mvc.SimpleFormController;
+
+
+
+import javax.servlet.http.HttpServletRequest;
+
+import java.beans.PropertyEditorSupport;
+
+import java.util.Map;
+
+
+
+/**
+
+ * The central form controller for this showcase application.
+
+ *
+
+
+ */
+
+public class FormController extends SimpleFormController {
+
+
+
+ private UserManager userManager;
+
+
+
+
+
+ /**
+
+ * Sets the {@link UserManager} to which this presentation component
+
+ * delegates in order to perform complex business logic.
+
+ * @param userManager the {@link UserManager} to which this presentation
+
+ * component delegatesin order to perform complex business logic
+
+ */
+
+ public void setUserManager(UserManager userManager) {
+
+ this.userManager = userManager;
+
+ }
+
+
+
+
+
+ protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
+
+ binder.registerCustomEditor(Country.class, new CountryEditor(this.userManager));
+
+ binder.registerCustomEditor(Colour.class, new PropertyEditorSupport() {
+
+ public void setAsText(String string) throws IllegalArgumentException {
+
+ Short code = new Short(string);
+
+ StaticLabeledEnumResolver resolver = new StaticLabeledEnumResolver();
+
+ setValue(resolver.getLabeledEnumByCode(Colour.class, code));
+
+ }
+
+ });
+
+ }
+
+
+
+ protected Map referenceData(HttpServletRequest request, Object command, Errors errors) throws Exception {
+
+ return new ModelMap(this.userManager.findAllCountries())
+
+ .addObject("skills", getSkills())
+
+ .addObject(this.userManager.findAll());
+
+ }
+
+
+
+ protected Object formBackingObject(HttpServletRequest request) throws Exception {
+
+ int id = ServletRequestUtils.getRequiredIntParameter(request, "id");
+
+ return this.userManager.findById(new Integer(id));
+
+ }
+
+
+
+ protected void doSubmitAction(Object managedResource) throws Exception {
+
+ this.userManager.save((User) managedResource);
+
+ }
+
+
+
+
+
+ private String[] getSkills() {
+
+ return new String[]{
+
+ "Potions",
+
+ "Herbology",
+
+ "Quidditch"
+
+ };
+
+ }
+
+
+
+}
+
diff --git a/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/web/ListController.java b/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/web/ListController.java
new file mode 100644
index 0000000..b98d743
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/java/org/springframework/showcase/formtags/web/ListController.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.web;
+
+
+
+import org.springframework.showcase.formtags.service.UserManager;
+
+import org.springframework.web.servlet.ModelAndView;
+
+import org.springframework.web.servlet.mvc.AbstractController;
+
+
+
+import javax.servlet.http.HttpServletRequest;
+
+import javax.servlet.http.HttpServletResponse;
+
+
+
+/**
+
+ * Simple {@link org.springframework.web.servlet.mvc.Controller} implementation
+
+ * that pretty much locates (and thus allows a {@link org.springframework.web.servlet.View}
+
+ * to render a list) of all of the {@link org.springframework.showcase.formtags.domain.User Users}
+
+ * in the application.
+
+ *
+
+
+ */
+
+public class ListController extends AbstractController {
+
+
+
+
+
+ private UserManager userManager;
+
+ private String viewName;
+
+
+
+ public void setViewName(String viewName) {
+
+ this.viewName = viewName;
+
+ }
+
+
+
+ /**
+
+ * Sets the {@link UserManager} that to which this presentation component delegates
+
+ * in order to perform complex business logic.
+
+ *
+
+ * @param userManager the {@link UserManager} that to which this presentation component delegates
+
+ * in order to perform complex business logic
+
+ */
+
+ public void setUserManager(UserManager userManager) {
+
+ this.userManager = userManager;
+
+ }
+
+
+
+
+
+ protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ return new ModelAndView(viewName).addObject(this.userManager.findAll());
+
+ }
+
+
+
+}
+
diff --git a/par/org.springframework.showcase.formtags.web/src/main/resources/i18n.properties b/par/org.springframework.showcase.formtags.web/src/main/resources/i18n.properties
new file mode 100644
index 0000000..fa1de17
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/resources/i18n.properties
@@ -0,0 +1 @@
+form.title=Spring 2.0 form tag showcase application
\ No newline at end of file
diff --git a/par/org.springframework.showcase.formtags.web/src/main/resources/i18n_en_GB.properties b/par/org.springframework.showcase.formtags.web/src/main/resources/i18n_en_GB.properties
new file mode 100644
index 0000000..d597e96
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/resources/i18n_en_GB.properties
@@ -0,0 +1 @@
+form.title=Spring 2.0 form tag showcase application (Lovely Jubbly!)
\ No newline at end of file
diff --git a/par/org.springframework.showcase.formtags.web/src/main/webapp/META-INF/MANIFEST.MF b/par/org.springframework.showcase.formtags.web/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..91ac071
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Version: 2.0.1
+Bundle-Name: FormTags Web Bundle
+Bundle-SymbolicName: org.springframework.showcase.formtags.web_par
+Import-Package: org.springframework.showcase.formtags.domain,
+ org.springframework.showcase.formtags.service,
+ org.eclipse.virgo.web.dm;version="[1.0,3.0)",
+ javax.servlet.jsp.jstl.core;version="[1.1.2,1.2.0)",
+ javax.servlet.http
+Import-Bundle: com.springsource.org.apache.taglibs.standard;version="1.1.2"
+Import-Library: org.springframework.spring;version="[2.5.6.A,4.0.0)"
+Web-ContextPath: formtags-par
+
diff --git a/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/applicationContext.xml b/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/applicationContext.xml
new file mode 100644
index 0000000..19a1a73
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/applicationContext.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+ <reference id="userManager" interface="org.springframework.showcase.formtags.service.UserManager" />
+
+</beans:beans>
diff --git a/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/formtags-servlet.xml b/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/formtags-servlet.xml
new file mode 100644
index 0000000..4e01c91
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/formtags-servlet.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
+<beans>
+
+ <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+ <property name="prefix" value="/WEB-INF/jsp/"/>
+ <property name="suffix" value=".jsp"/>
+ </bean>
+
+ <bean name="/list.htm" class="org.springframework.showcase.formtags.web.ListController">
+ <property name="userManager" ref="userManager"/>
+ </bean>
+
+ <bean name="/form.htm" class="org.springframework.showcase.formtags.web.FormController">
+ <property name="formView" value="form"/>
+ <property name="successView" value="redirect:list.htm"/>
+ <property name="userManager" ref="userManager"/>
+ <property name="validators">
+ <bean id="userValidator" class="org.springframework.showcase.formtags.validation.UserValidator"/>
+ </property>
+ </bean>
+
+ <bean name="/about.htm" class="org.springframework.showcase.formtags.web.ListController">
+ <property name="userManager" ref="userManager"/>
+ <property name="viewName" value="about"/>
+ </bean>
+
+ <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
+ <property name="basename" value="i18n"/>
+ </bean>
+
+</beans>
diff --git a/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/jsp/about.jsp b/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/jsp/about.jsp
new file mode 100644
index 0000000..69bb766
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/jsp/about.jsp
@@ -0,0 +1,61 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title>Virgo Server, form tags showcase application</title>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+ <link rel="icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link rel="shortcut icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+
+ <link href="<c:url value="/css/style.css"/>" rel="stylesheet" type="text/css"/>
+
+ </head>
+
+<body>
+ <div id="main">
+
+ <div id="topmenu">
+ <a href="http://www.eclipse.org/virgo/">Virgo</a><a href="http://www.eclipse.org/forums/index.php?t=thread&frm_id=159">Virgo Forums</a><a href="http://forum.springframework.org">Spring forum</a><a href="http://www.dzone.com">Dzone.com</a><a href="http://www.infoq.com">Infoq.com</a>
+ </div>
+
+ <div id="header">
+ <span class="title">Virgo Server<span class="darktitle">2.0</span> form tags</span><br/>
+ </div>
+
+
+ <div id="content">
+ <div id="block">
+ <p>
+The Spring MVC form tags application showcases the new form
+tag library introduced in Spring 2.0.</p>
+
+<p>The web application is *very* simplistic, because the intent is
+to convey the essence of the new form tags themselves and nothing
+else.</p>
+
+ </div>
+
+ </div>
+
+ <div class="lefty">
+ <div class="menu">
+ <c:forEach items="${userList}" var="user">
+ <a href="form.htm?id=<c:out value="${user.id}"/>"><c:out value="${user.lastName}"/>, <c:out value="${user.firstName}"/></a>
+ </c:forEach>
+
+ </div>
+ <p>New JSP tags in Spring 2.0 make building forms with Spring MVC much easier</p>
+ <div class="menu">
+ <a href="<c:url value="/list.htm"/>">Home</a>
+ </div>
+ </div>
+
+</div>
+
+</body>
+</html>
diff --git a/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/jsp/form.jsp b/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/jsp/form.jsp
new file mode 100644
index 0000000..7b67053
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/jsp/form.jsp
@@ -0,0 +1,229 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
+<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title><spring:message code="form.title"/></title>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+ <link rel="icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link rel="shortcut icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link href="<c:url value="/css/style.css"/>" rel="stylesheet" type="text/css"/>
+ </head>
+
+<body>
+ <div id="main">
+
+ <div id="topmenu">
+ <a href="http://www.eclipse.org/virgo/">Virgo</a><a href="http://www.eclipse.org/forums/index.php?t=thread&frm_id=159">Virgo Forums</a><a href="http://forum.springframework.org">Spring forum</a><a href="http://www.dzone.com">Dzone.com</a><a href="http://www.infoq.com">Infoq.com</a>
+ </div>
+
+ <div id="header">
+ <span class="title">Virgo Server <span class="darktitle">2.0</span> form tags</span><br/>
+ </div>
+
+ <div id="content">
+
+ <h1>Edit apprentice magician <c:out value="${command.firstName}"/> <c:out value="${command.lastName}" /></h1>
+ <form:form>
+ <form:errors path="*" cssClass="errorBox" />
+
+ <div class="first">
+ <form:label path="firstName">First Name:</form:label>
+ <form:input path="firstName" />
+ <form:errors path="firstName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="lastName">Last Name:</form:label>
+ <form:input path="lastName" disabled="true" />
+ <form:errors path="lastName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="country">Country:</form:label>
+ <form:select path="country">
+ <form:option value="" label="--Please Select"/>
+ <form:options items="${countryList}" itemValue="code" itemLabel="name"/>
+ </form:select>
+ <form:errors path="country" cssClass="error"/>
+ </div>
+
+ <div>
+ <form:label path="skills">Skills:</form:label>
+ <form:select path="skills" items="${skills}"/>
+ </div>
+
+ <div>
+ <form:label path="notes">Notes:</form:label>
+ <form:textarea path="notes" readonly="true" rows="3" cols="20" />
+ <form:errors path="notes" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="sex">Sex:</form:label>
+ Male: <form:radiobutton path="sex" value="M"/>
+ Female: <form:radiobutton path="sex" value="F"/>
+ </div>
+
+ <div>
+ <form:label path="house">House:</form:label>
+ <form:select path="house">
+ <form:option value="Gryffindor"/>
+ <form:option value="Hufflepuff"/>
+ <form:option value="Ravenclaw" disabled="true"/>
+ <form:option value="Slytherin"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="preferences.receiveNewsletter">Subscribe to newsletter?:</form:label>
+ <form:checkbox path="preferences.receiveNewsletter"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.interests">Interests:</form:label>
+ <span>Quidditch:</span> <form:checkbox path="preferences.interests" value="Quidditch"/><br/>
+ <span>Herbology:</span> <form:checkbox path="preferences.interests" value="Herbology"/><br/>
+ <span>Defence Against the Dark Arts:</span> <form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.favouriteWord">Favourite Word:</form:label>
+ <span>Magic:</span> <form:checkbox path="preferences.favouriteWord" value="Magic"/>
+ </div>
+
+ <div>
+ <form:label path="favouriteColour">Favourite Colour:</form:label>
+ <form:select path="favouriteColour">
+ <form:option value="0" label="RED"/>
+ <form:option value="1" label="GREEN"/>
+ <form:option value="2" label="BLUE"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="password">Password:</form:label>
+ <form:password path="password" showPassword="true" />
+ </div>
+
+ <div>
+ <input type="submit" value="Save Changes" />
+ </div>
+ </form:form>
+
+ <br/>
+
+ <h1>The JSP form tags:</h1>
+ <textarea rows="10" cols="55" class="showjspcode">
+<form:form>
+ <form:errors path="*" cssClass="errorBox" />
+
+ <div class="first">
+ <form:label path="firstName">First Name:</form:label>
+ <form:input path="firstName" />
+ <form:errors path="firstName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="lastName">Last Name:</form:label>
+ <form:input path="lastName" disabled="true" />
+ <form:errors path="lastName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="country">Country:</form:label>
+ <form:select path="country">
+ <form:option value="" label="--Please Select"/>
+ <form:options items="${countryList}" itemValue="code" itemLabel="name"/>
+ </form:select>
+ <form:errors path="country" cssClass="error"/>
+ </div>
+
+ <div>
+ <form:label path="skills">Skills:</form:label>
+ <form:select path="skills" items="${skills}"/>
+ </div>
+
+ <div>
+ <form:label path="notes">Notes:</form:label>
+ <form:textarea path="notes" readonly="true" rows="3" cols="20" />
+ <form:errors path="notes" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="sex">Sex:</form:label>
+ Male: <form:radiobutton path="sex" value="M"/>
+ Female: <form:radiobutton path="sex" value="F"/>
+ </div>
+
+ <div>
+ <form:label path="house">House:</form:label>
+ <form:select path="house">
+ <form:option value="Gryffindor"/>
+ <form:option value="Hufflepuff"/>
+ <form:option value="Ravenclaw"/>
+ <form:option value="Slytherin"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="preferences.receiveNewsletter">Subscribe to newsletter?:</form:label>
+ <form:checkbox path="preferences.receiveNewsletter"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.interests">Interests:</form:label>
+ <span>Quidditch:</span> <form:checkbox path="preferences.interests" value="Quidditch"/><br/>
+ <span>Herbology:</span> <form:checkbox path="preferences.interests" value="Herbology"/><br/>
+ <span>Defence Against the Dark Arts:</span> <form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.favouriteWord">Favourite Word:</form:label>
+ <span>Magic:</span> <form:checkbox path="preferences.favouriteWord" value="Magic"/>
+ </div>
+
+ <div>
+ <form:label path="favouriteColour">Favourite Colour:</form:label>
+ <form:select path="favouriteColour">
+ <form:option value="0" label="RED"/>
+ <form:option value="1" label="GREEN"/>
+ <form:option value="2" label="BLUE"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="password">Password:</form:label>
+ <form:password path="password" showPassword="true" />
+ </div>
+
+ <div>
+ <input type="submit" value="Save Changes" />
+ </div>
+</form:form>
+ </textarea>
+
+ </div>
+
+ <div class="lefty">
+ <div class="menu">
+ <c:forEach items="${userList}" var="user">
+ <a href="form.htm?id=<c:out value="${user.id}"/>"><c:out value="${user.lastName}"/>, <c:out value="${user.firstName}"/></a>
+ </c:forEach>
+
+ </div>
+ <p>New JSP tags in Spring 2.0 make building forms with Spring MVC much easier.</p>
+ <div class="menu">
+ <a href="<c:url value="/about.htm"/>">About</a>
+ <a href="<c:url value="/list.htm"/>">Home</a>
+ </div>
+ </div>
+
+</div>
+
+</body>
+</html>
diff --git a/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/jsp/list.jsp b/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/jsp/list.jsp
new file mode 100644
index 0000000..91f2eb7
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/jsp/list.jsp
@@ -0,0 +1,59 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title>Virgo Server, form tags showcase application</title>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+ <link rel="icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link rel="shortcut icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+
+ <link href="<c:url value="/css/style.css"/>" rel="stylesheet" type="text/css"/>
+
+ </head>
+
+<body>
+ <div id="main">
+
+ <div id="topmenu">
+ <a href="http://www.eclipse.org/virgo/">Virgo</a><a href="http://www.eclipse.org/forums/index.php?t=thread&frm_id=159">Virgo Forums</a><a href="http://forum.springframework.org">Spring forum</a><a href="http://www.dzone.com">Dzone.com</a><a href="http://www.infoq.com">Infoq.com</a>
+ </div>
+
+ <div id="header">
+ <span class="title">Virgo Server<span class="darktitle">2.0</span> form tags</span><br/>
+ </div>
+
+
+ <div id="content">
+ <div id="block">
+ <p>Welcome to this Spring 2.0 showcase application that demonstrates
+ the use of new JSP tags for creating form elements.</p>
+
+ <p>Choose an apprentice magician on the left-hand side to continue.</p>
+
+
+ </div>
+
+ </div>
+
+ <div class="lefty">
+ <div class="menu">
+ <c:forEach items="${userList}" var="user">
+ <a href="form.htm?id=<c:out value="${user.id}"/>"><c:out value="${user.lastName}"/>, <c:out value="${user.firstName}"/></a>
+ </c:forEach>
+
+ </div>
+ <p>New JSP tags in Spring 2.0 make building forms with Spring MVC much easier</p>
+ <div class="menu">
+ <a href="<c:url value="/about.htm"/>">About</a>
+ </div>
+ </div>
+
+</div>
+
+</body>
+</html>
diff --git a/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/web.xml b/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..c7b9f3d
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
+
+ <display-name>Formtags</display-name>
+
+ <welcome-file-list>
+ <welcome-file>index.jsp</welcome-file>
+ <welcome-file>index.html</welcome-file>
+ </welcome-file-list>
+
+<!-- CONFIGURE A PARENT APPLICATION CONTEXT -->
+
+ <context-param>
+ <param-name>contextClass</param-name>
+ <param-value>org.eclipse.virgo.web.dm.ServerOsgiBundleXmlWebApplicationContext</param-value>
+ </context-param>
+
+ <listener>
+ <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+ </listener>
+
+
+ <!-- DISPATCHER SERVLET CONFIG -->
+ <servlet>
+ <servlet-name>formtags</servlet-name>
+ <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>formtags</servlet-name>
+ <url-pattern>*.htm</url-pattern>
+ </servlet-mapping>
+
+</web-app>
\ No newline at end of file
diff --git a/par/org.springframework.showcase.formtags.web/src/main/webapp/css/base.css b/par/org.springframework.showcase.formtags.web/src/main/webapp/css/base.css
new file mode 100644
index 0000000..4cafa80
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/webapp/css/base.css
@@ -0,0 +1,5 @@
+
+.errorBox {
+ border: red solid 1px;
+ background-color: tomato;
+}
diff --git a/par/org.springframework.showcase.formtags.web/src/main/webapp/css/style.css b/par/org.springframework.showcase.formtags.web/src/main/webapp/css/style.css
new file mode 100644
index 0000000..3b337a8
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/webapp/css/style.css
@@ -0,0 +1,239 @@
+body
+{
+ margin: 0;
+ margin: 0 auto;
+ background: #f4f4f4 url(images/bg.gif) top center repeat-y;
+}
+#header
+{
+ vertical-align: top;
+ padding-bottom: 11px;
+ padding-left: 18px;
+ font-family: Georgia, Lucida, Arial, sans-serif;
+ font-size: 11px;
+ font-weight: lighter;
+ color: #00008B;
+ border-bottom: 1px solid #efefef;
+}
+.title
+{
+ font-size: 24px;
+ font-style: italic;
+ font-weight: bold;
+ color: #90200A;
+}
+.darktitle
+{
+ font-size: 24px;
+ font-style: italic;
+ font-weight: bold;
+ color: #000000;
+}
+#main
+{
+ width: 780px;
+ height: auto;
+ border-left: 1px solid #efefef;
+ border-right: 1px solid #efefef;
+ margin: 0 auto 0 auto;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 11px;
+ font-weight: normal;
+ color: #A52A2A;
+}
+h1, h2
+{
+ font-size: 12px;
+ font-family: Verdana, Arial, sans-serif;
+ color: #191970;
+ font-weight: bold;
+ padding-left: 4px;
+}
+h3, h4
+{
+ font-size: 11px;
+ font-family: Verdana, Arial, sans-serif;
+ color: #2F4F4F;
+ font-weight: bold;
+ padding-left: 8px;
+}
+.menu
+{
+ width: 150px;
+ color: #00008B;
+ font-family: Verdana, Arial, sans-serif;
+}
+.menu a:link, .menu a:visited
+{
+ width: 150px;
+ margin: 1px 0 1px 0;
+ padding: 4px 3px 4px 8px;
+ background-color: transparent;
+ color: #003366;
+ text-decoration: none;
+ font-family: Verdana, Arial, sans-serif;
+ font-weight: normal;
+ display: block;
+}
+.menu a:hover
+{
+ color: #A52A2A;
+ text-decoration: none;
+}
+#topmenu
+{
+ text-align: right;
+ padding-top: 1em;
+ padding-right: 1em;
+ font-family: Verdana, Arial, sans-serif;
+ font-weight: bold;
+}
+#topmenu a:link, #topmenu a:visited
+{
+ color: #ffffff;
+ text-decoration: none;
+ background-color: #000000;
+ border: 1px solid #666666;
+ padding-top: .3em;
+ padding-bottom: .3em;
+ padding-left: .8em;
+ padding-right: .8em;
+}
+#topmenu a:hover
+{
+ color: #ffffff;
+ background-color: #90200A;
+ border: 1px solid #90200A;
+ text-decoration: none;
+ padding-top: .3em;
+ padding-bottom: .3em;
+ padding-left: .8em;
+ padding-right: .8em;
+}
+#lefty
+{
+ margin: 8px;
+ width: 150px;
+ height: auto;
+ color: #00008B;
+ font-family: Verdana, Arial, sans-serif;
+}
+#lefty p
+{
+ width: 94%;
+ padding: 12px;
+ font-family: Verdana, Arial, sans-serif;
+ background-color: #f9f9f9;
+ color: #607080;
+}
+#block
+{
+ padding: 12px;
+ font-family: Verdana, Arial, sans-serif;
+ background-color: #f9f9f9;
+ color: #607080;
+}
+#breadcrumb
+{
+ text-align: right;
+ color: #999999;
+ padding-bottom: 11px;
+}
+#breadcrumb a:link, #breadcrumb a:visited
+{
+ color: #999999;
+ text-decoration: none;
+}
+#breadcrumb a:hover
+{
+ color: #aaaaaa;
+ text-decoration: none;
+}
+a:link, a:visited
+{
+ color: #003366;
+ border-bottom: 1px solid #efefef;
+ font-family: Verdana, Arial, sans-serif;
+ text-decoration: none;
+}
+a:hover
+{
+ color: #A52A2A;
+ text-decoration: none;
+}
+#content
+{
+ float: right;
+ width: 570px;
+ text-align: left;
+ padding-top: 11px;
+ padding-bottom: 11px;
+ padding-left: 11px;
+ padding-right: 16px;
+ border-left: 1px solid #efefef;
+ font-family: Verdana, Arial, sans-serif;
+ line-height: 145%;
+ color: #607080;
+}
+#content h3, h4
+{
+ font-family: Verdana, Arial, sans-serif;
+ color: #2F4F4F;
+ font-weight: bold;
+ padding-left: 0px;
+}
+#footer
+{
+ text-align: center;
+ padding: 11px;
+ font-family: Verdana, Arial, sans-serif;
+ font-weight: lighter;
+ color: #cccccc;
+}
+hr
+{
+ border:0;
+ border-bottom: 1px solid #efefef;
+ height: 1px;
+}
+li
+{
+ list-style-type: none;
+ line-height: 160%;
+}
+form div label
+{
+ width: 14em;
+ float: left;
+ margin-left: -15em;
+}
+.first {
+ margin-top: 0em;
+ padding-top: 0em;
+ padding-left: 15em;
+ border-top: none;
+}
+form div
+{
+ margin-top: 0.5em;
+ padding-top: 0.5em;
+ padding-left: 15em;
+ border-top: 1px dashed gray;
+}
+form div span
+{
+ width: 20em;
+ float: left;
+}
+form div span.error
+{
+ width: 20em;
+ margin-left: 0.5em;
+ float: none;
+ color: red;
+}
+form span.errorBox
+{
+ color: red;
+}
+
diff --git a/par/org.springframework.showcase.formtags.web/src/main/webapp/favicon.ico b/par/org.springframework.showcase.formtags.web/src/main/webapp/favicon.ico
new file mode 100644
index 0000000..7e54ebd
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/webapp/favicon.ico
Binary files differ
diff --git a/par/org.springframework.showcase.formtags.web/src/main/webapp/index.jsp b/par/org.springframework.showcase.formtags.web/src/main/webapp/index.jsp
new file mode 100644
index 0000000..92d1b12
--- /dev/null
+++ b/par/org.springframework.showcase.formtags.web/src/main/webapp/index.jsp
@@ -0,0 +1,5 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
+
+<!-- simply redirects to the main switchboard page of the showcase web application -->
+
+<c:redirect url="/list.htm"/>
\ No newline at end of file
diff --git a/par/org.springframework.showcase.formtags/.project b/par/org.springframework.showcase.formtags/.project
new file mode 100644
index 0000000..2521009
--- /dev/null
+++ b/par/org.springframework.showcase.formtags/.project
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.springframework.showcase.formtags</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.springframework.ide.eclipse.core.springbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.springsource.server.ide.facet.core.parnature</nature>
+ <nature>org.springframework.ide.eclipse.core.springnature</nature>
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+ </natures>
+</projectDescription>
diff --git a/par/org.springframework.showcase.formtags/.settings/com.springsource.server.ide.runtime.core.par.xml b/par/org.springframework.showcase.formtags/.settings/com.springsource.server.ide.runtime.core.par.xml
new file mode 100644
index 0000000..fbfb154
--- /dev/null
+++ b/par/org.springframework.showcase.formtags/.settings/com.springsource.server.ide.runtime.core.par.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<com.springsource.server.ide.par:Par xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:com.springsource.server.ide.par="http:///com/springsource/server/ide/par.ecore">
+ <bundle symbolicName="org.springframework.showcase.formtags.domain"/>
+ <bundle symbolicName="org.springframework.showcase.formtags.service"/>
+ <bundle symbolicName="org.springframework.showcase.formtags.web"/>
+</com.springsource.server.ide.par:Par>
diff --git a/par/org.springframework.showcase.formtags/.settings/org.eclipse.wst.common.project.facet.core.xml b/par/org.springframework.showcase.formtags/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..b9894e8
--- /dev/null
+++ b/par/org.springframework.showcase.formtags/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <runtime name="SpringSource dm Server (Runtime) v2.0"/>
+ <installed facet="com.springsource.server.par" version="1.0"/>
+</faceted-project>
diff --git a/par/org.springframework.showcase.formtags/.springBeans b/par/org.springframework.showcase.formtags/.springBeans
new file mode 100644
index 0000000..3949aa3
--- /dev/null
+++ b/par/org.springframework.showcase.formtags/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+ <version>1</version>
+ <pluginVersion><![CDATA[2.0.5.v200805202005]]></pluginVersion>
+ <configSuffixes>
+ <configSuffix><![CDATA[xml]]></configSuffix>
+ </configSuffixes>
+ <enableImports><![CDATA[false]]></enableImports>
+ <configs>
+ </configs>
+ <configSets>
+ </configSets>
+</beansProjectDescription>
diff --git a/par/org.springframework.showcase.formtags/META-INF/MANIFEST.MF b/par/org.springframework.showcase.formtags/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5769d63
--- /dev/null
+++ b/par/org.springframework.showcase.formtags/META-INF/MANIFEST.MF
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+Application-SymbolicName: org.springframework.showcase.formtags_par
+Application-Version: 2.0.1
+Application-Name: FormTags Showcase Application (PAR)
+
+
diff --git a/par/org.springframework.showcase.formtags/build.xml b/par/org.springframework.showcase.formtags/build.xml
new file mode 100644
index 0000000..ddd2681
--- /dev/null
+++ b/par/org.springframework.showcase.formtags/build.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="formtags-par">
+
+ <path id="bundles">
+ <pathelement location="../org.springframework.showcase.formtags.domain" />
+ <pathelement location="../org.springframework.showcase.formtags.service" />
+ <pathelement location="../org.springframework.showcase.formtags.web" />
+ </path>
+
+ <property file="${basedir}/../../build.properties" />
+ <property file="${basedir}/../../build.versions" />
+ <import file="${basedir}/../../build-formtags/package-bundle.xml" />
+ <import file="${basedir}/../../virgo-build/par/default.xml" />
+
+</project>
diff --git a/shared-libs/README.TXT b/shared-libs/README.TXT
new file mode 100644
index 0000000..ec3d579
--- /dev/null
+++ b/shared-libs/README.TXT
@@ -0,0 +1,46 @@
+================================================================================
+== Virgo Server - Form Tags - Shared Libraries WAR ==
+================================================================================
+
+@author Colin Yates
+@author Sam Brannen
+@author Christopher Frost
+
+--------------------------------------------------------------------------------
+
+This is a version of the Spring Form Tags showcase application which has been
+converted into a Shared Libraries WAR. It is a standard WAR except that all
+third-party library dependencies are retrieved via the server's repository.
+Consult formtags-shared-libs/src/main/webapp/META-INF/MANIFEST.MF to see how
+these dependencies are declared.
+
+--------------------------------------------------------------------------------
+
+PROJECTS
+
+ - formtags-shared-libs: the WAR
+
+--------------------------------------------------------------------------------
+
+BUILD AND DEPLOYMENT
+
+1) $> cd formtags-shared-libs
+
+2) $> ant jar
+
+3) Copy target/artifacts/formtags-shared-libs.war to the SERVER_HOME/pickup
+ directory.
+
+--------------------------------------------------------------------------------
+
+URL: http://localhost:8080/formtags-shared-libs
+
+Note: the context path under which the web application is deployed is
+ determined by the file name of the WAR. Thus, if you deploy a distribution
+ JAR named 'formtags-shared-libs-2.0.1.RELEASE.war', you will need to use
+ the following URL:
+
+ http://localhost:8080/formtags-shared-libs-2.0.1.RELEASE
+
+--------------------------------------------------------------------------------
+
diff --git a/shared-libs/formtags-shared-libs/.classpath b/shared-libs/formtags-shared-libs/.classpath
new file mode 100644
index 0000000..58d433f
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources"/>
+ <classpathentry kind="con" path="com.springsource.server.ide.jdt.core.MANIFEST_CLASSPATH_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
+ <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
+ <classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.springsource.server.ide.server.core.runtime.classpath/SpringSource dm Server (Runtime) v2.0"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/JVM 1.6.0"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/shared-libs/formtags-shared-libs/.project b/shared-libs/formtags-shared-libs/.project
new file mode 100644
index 0000000..2bc3cd7
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/.project
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>formtags-shared-libs</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.validation.validationbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.springframework.ide.eclipse.core.springbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.springsource.server.ide.facet.core.bundlenature</nature>
+ <nature>org.springframework.ide.eclipse.core.springnature</nature>
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+ <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+ <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+ </natures>
+</projectDescription>
diff --git a/shared-libs/formtags-shared-libs/.settings/.jsdtscope b/shared-libs/formtags-shared-libs/.settings/.jsdtscope
new file mode 100644
index 0000000..8fbc6ca
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/.settings/.jsdtscope
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject"/>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
+ <classpathentry kind="output" path=""/>
+</classpath>
diff --git a/shared-libs/formtags-shared-libs/.settings/com.springsource.server.ide.jdt.core.prefs b/shared-libs/formtags-shared-libs/.settings/com.springsource.server.ide.jdt.core.prefs
new file mode 100644
index 0000000..fd17e07
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/.settings/com.springsource.server.ide.jdt.core.prefs
@@ -0,0 +1,5 @@
+#Tue Jun 16 09:52:56 BST 2009
+com.springsource.server.ide.jdt.core.source.attachment-com.springsource.javax.servlet-2.5.0.jar=/opt/springsource-dm-server-2.0.0.BUILD-20090615152747/repository/bundles/usr/com.springsource.javax.servlet-sources-2.5.0.jar
+com.springsource.server.ide.jdt.core.source.attachment-com.springsource.javax.servlet.jsp.jstl-1.2.0.jar=/opt/springsource-dm-server-2.0.0.BUILD-20090615152747/repository/bundles/usr/com.springsource.javax.servlet.jsp.jstl-sources-1.2.0.jar
+com.springsource.server.ide.jdt.core.source.attachment-org.springframework.web-3.0.0.CI-282.jar=/Users/chrisfrost/SVN_Repos/dm-server-servlet/main-branches/jersey/ivy-cache/repository/org.springframework/org.springframework.web/3.0.0.CI-282/org.springframework.web-sources-3.0.0.CI-282.jar
+eclipse.preferences.version=1
diff --git a/shared-libs/formtags-shared-libs/.settings/org.eclipse.jdt.core.prefs b/shared-libs/formtags-shared-libs/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..c8c423d
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Fri Jun 12 17:18:21 BST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/shared-libs/formtags-shared-libs/.settings/org.eclipse.jst.common.project.facet.core.prefs b/shared-libs/formtags-shared-libs/.settings/org.eclipse.jst.common.project.facet.core.prefs
new file mode 100644
index 0000000..af1970c
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/.settings/org.eclipse.jst.common.project.facet.core.prefs
@@ -0,0 +1,4 @@
+#Fri Jun 12 17:18:21 BST 2009
+classpath.helper/org.eclipse.jdt.launching.JRE_CONTAINER\:\:org.eclipse.jdt.internal.launching.macosx.MacOSXType\:\:JVM\ 1.6.0/owners=jst.java\:6.0
+classpath.helper/org.eclipse.jst.server.core.container\:\:com.springsource.server.ide.server.core.runtime.classpath\:\:SpringSource\ dm\ Server\ (Runtime)\ v2.0/owners=jst.web\:2.4
+eclipse.preferences.version=1
diff --git a/shared-libs/formtags-shared-libs/.settings/org.eclipse.wst.common.component b/shared-libs/formtags-shared-libs/.settings/org.eclipse.wst.common.component
new file mode 100644
index 0000000..8abc65f
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-modules id="moduleCoreId" project-version="1.5.0">
+<wb-module deploy-name="formtags-shared-libs">
+<wb-resource deploy-path="/" source-path="/src/main/webapp"/>
+<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
+<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
+<property name="java-output-path" value="build/classes"/>
+<property name="context-root" value="formtags-shared-libs"/>
+</wb-module>
+</project-modules>
diff --git a/shared-libs/formtags-shared-libs/.settings/org.eclipse.wst.common.project.facet.core.xml b/shared-libs/formtags-shared-libs/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..fa9b239
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <runtime name="SpringSource dm Server (Runtime) v2.0"/>
+ <fixed facet="jst.java"/>
+ <fixed facet="jst.web"/>
+ <installed facet="jst.web" version="2.4"/>
+ <installed facet="com.springsource.server.bundle" version="1.0"/>
+ <installed facet="jst.java" version="6.0"/>
+</faceted-project>
diff --git a/shared-libs/formtags-shared-libs/.settings/org.eclipse.wst.jsdt.ui.superType.container b/shared-libs/formtags-shared-libs/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 0000000..3bd5d0a
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/shared-libs/formtags-shared-libs/.settings/org.eclipse.wst.jsdt.ui.superType.name b/shared-libs/formtags-shared-libs/.settings/org.eclipse.wst.jsdt.ui.superType.name
new file mode 100644
index 0000000..05bd71b
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/.settings/org.eclipse.wst.jsdt.ui.superType.name
@@ -0,0 +1 @@
+Window
\ No newline at end of file
diff --git a/shared-libs/formtags-shared-libs/.springBeans b/shared-libs/formtags-shared-libs/.springBeans
new file mode 100644
index 0000000..8ce1035
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+ <version>1</version>
+ <pluginVersion><![CDATA[2.2.5.200906231226-RC1]]></pluginVersion>
+ <configSuffixes>
+ <configSuffix><![CDATA[xml]]></configSuffix>
+ </configSuffixes>
+ <enableImports><![CDATA[false]]></enableImports>
+ <configs>
+ </configs>
+ <configSets>
+ </configSets>
+</beansProjectDescription>
diff --git a/shared-libs/formtags-shared-libs/build.xml b/shared-libs/formtags-shared-libs/build.xml
new file mode 100644
index 0000000..5dd556f
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="formtags-shared-libs">
+
+ <property file="${basedir}/../../build.properties" />
+ <property file="${basedir}/../../build.versions" />
+ <import file="${basedir}/../../build-formtags/package-bundle.xml" />
+ <import file="${basedir}/../../virgo-build/war/default.xml" />
+
+</project>
diff --git a/shared-libs/formtags-shared-libs/ivy.xml b/shared-libs/formtags-shared-libs/ivy.xml
new file mode 100644
index 0000000..bb999d9
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/ivy.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+ version="1.3">
+
+ <info organisation="org.eclipse.virgo.samples" module="${ant.project.name}" />
+
+ <configurations>
+ <include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+ </configurations>
+
+ <publications>
+ <artifact name="${ant.project.name}" type="war" ext="war"/>
+ <artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+ </publications>
+
+ <dependencies>
+ <dependency org="org.springframework" name="org.springframework.spring-library" rev="${org.springframework.spring}" conf="provided->compile"/>
+ <dependency org="javax.servlet" name="com.springsource.javax.servlet" rev="2.5.0" conf="provided->compile"/>
+ <dependency org="org.apache.taglibs" name="com.springsource.org.apache.taglibs.standard" rev="1.1.2" conf="provided->compile"/>
+ </dependencies>
+
+</ivy-module>
diff --git a/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/domain/Colour.java b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/domain/Colour.java
new file mode 100644
index 0000000..88e715e
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/domain/Colour.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+import org.springframework.core.enums.ShortCodedLabeledEnum;
+
+
+
+/**
+
+ * Simple enumeration for common colors.
+
+ *
+
+
+ */
+
+public class Colour extends ShortCodedLabeledEnum {
+
+
+
+
+
+ public static final Colour RED = new Colour(0, "RED");
+
+ public static final Colour GREEN = new Colour(1, "GREEN");
+
+ public static final Colour BLUE = new Colour(2, "BLUE");
+
+
+
+
+
+ private Colour(int code, String label) {
+
+ super(code, label);
+
+ }
+
+
+
+}
+
diff --git a/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/domain/Country.java b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/domain/Country.java
new file mode 100644
index 0000000..caf564c
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/domain/Country.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+/**
+
+ * Models a country.
+
+ *
+
+
+ */
+
+public class Country implements Comparable {
+
+
+
+
+
+ private String code;
+
+ private String name;
+
+
+
+
+
+ /**
+
+ * Creates a new instance of this {@link Country} class.
+
+ */
+
+ public Country() {
+
+ }
+
+
+
+ /**
+
+ * Creates a new instance of this {@link Country} class.
+
+ *
+
+ * @param code the country code
+
+ * @param name the name of the country
+
+ */
+
+ public Country(String code, String name) {
+
+ this.code = code;
+
+ this.name = name;
+
+ }
+
+
+
+
+
+ public String getCode() {
+
+ return code;
+
+ }
+
+
+
+ public String getName() {
+
+ return name;
+
+ }
+
+
+
+
+
+ public int compareTo(Object o) {
+
+ return this.code.compareTo(((Country) o).code);
+
+ }
+
+
+
+}
+
diff --git a/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/domain/Preferences.java b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/domain/Preferences.java
new file mode 100644
index 0000000..ab6c627
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/domain/Preferences.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+/**
+
+ * Models a {@link User User's} preferences.
+
+ *
+
+
+ */
+
+public class Preferences {
+
+
+
+
+
+ private boolean receiveNewsletter;
+
+ private String[] interests;
+
+ private String favouriteWord;
+
+
+
+
+
+ public boolean isReceiveNewsletter() {
+
+ return receiveNewsletter;
+
+ }
+
+
+
+ public void setReceiveNewsletter(boolean receiveNewsletter) {
+
+ this.receiveNewsletter = receiveNewsletter;
+
+ }
+
+
+
+ public String[] getInterests() {
+
+ return interests;
+
+ }
+
+
+
+ public void setInterests(String[] interests) {
+
+ this.interests = interests;
+
+ }
+
+
+
+ public String getFavouriteWord() {
+
+ return favouriteWord;
+
+ }
+
+
+
+ public void setFavouriteWord(String favouriteWord) {
+
+ this.favouriteWord = favouriteWord;
+
+ }
+
+
+
+}
+
diff --git a/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/domain/User.java b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/domain/User.java
new file mode 100644
index 0000000..925392f
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/domain/User.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+import java.util.ArrayList;
+
+import java.util.List;
+
+
+
+/**
+
+ * Models a user.
+
+ *
+
+
+ */
+
+public class User implements Cloneable {
+
+
+
+
+
+ private Integer id;
+
+ private String firstName;
+
+ private String lastName;
+
+ private String notes;
+
+ private String house;
+
+ private Country country = new Country();
+
+ private Colour favouriteColour = Colour.RED;
+
+ private List skills = new ArrayList();
+
+ private char sex;
+
+ private String password;
+
+ private Preferences preferences = new Preferences();
+
+ private String secretWord;
+
+
+
+
+
+ public Integer getId() {
+
+ return id;
+
+ }
+
+
+
+ public void setId(Integer id) {
+
+ this.id = id;
+
+ }
+
+
+
+ public String getFirstName() {
+
+ return firstName;
+
+ }
+
+
+
+ public void setFirstName(String firstName) {
+
+ this.firstName = firstName;
+
+ }
+
+
+
+ public String getLastName() {
+
+ return lastName;
+
+ }
+
+
+
+ public void setLastName(String lastName) {
+
+ this.lastName = lastName;
+
+ }
+
+
+
+ public String getNotes() {
+
+ return notes;
+
+ }
+
+
+
+ public void setNotes(String notes) {
+
+ this.notes = notes;
+
+ }
+
+
+
+ public String getHouse() {
+
+ return house;
+
+ }
+
+
+
+ public void setHouse(String house) {
+
+ this.house = house;
+
+ }
+
+
+
+ public Country getCountry() {
+
+ return country;
+
+ }
+
+
+
+ public void setCountry(Country country) {
+
+ this.country = country;
+
+ }
+
+
+
+ public Colour getFavouriteColour() {
+
+ return favouriteColour;
+
+ }
+
+
+
+ public void setFavouriteColour(Colour favouriteColour) {
+
+ this.favouriteColour = favouriteColour;
+
+ }
+
+
+
+ public char getSex() {
+
+ return sex;
+
+ }
+
+
+
+ public void setSex(char sex) {
+
+ this.sex = sex;
+
+ }
+
+
+
+ public Preferences getPreferences() {
+
+ return preferences;
+
+ }
+
+
+
+ public void setPreferences(Preferences preferences) {
+
+ this.preferences = preferences;
+
+ }
+
+
+
+ public List getSkills() {
+
+ return skills;
+
+ }
+
+
+
+ public void setSkills(List skills) {
+
+ this.skills = skills;
+
+ }
+
+
+
+ public String getPassword() {
+
+ return password;
+
+ }
+
+
+
+ public void setPassword(String password) {
+
+ this.password = password;
+
+ }
+
+
+
+ public String getSecretWord() {
+
+ return secretWord;
+
+ }
+
+
+
+ public void setSecretWord(String secretWord) {
+
+ this.secretWord = secretWord;
+
+ }
+
+
+
+
+
+ public Object clone() throws CloneNotSupportedException {
+
+ return super.clone();
+
+ }
+
+
+
+}
+
diff --git a/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/service/StubUserManager.java b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/service/StubUserManager.java
new file mode 100644
index 0000000..b9a321c
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/service/StubUserManager.java
@@ -0,0 +1,266 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.service;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.domain.User;
+
+
+
+import java.util.*;
+
+
+
+/**
+
+ * Stub {@link UserManager} implementation that maintains simple
+
+ * in-memory state for users and countries.
+
+ *
+
+
+ */
+
+public class StubUserManager implements UserManager {
+
+
+
+
+
+ private Map users = new TreeMap();
+
+ private Map countries = new TreeMap();
+
+
+
+
+
+ /**
+
+ * Creates a new instance of the {@link StubUserManager} class.
+
+ */
+
+ public StubUserManager() {
+
+ loadCountries();
+
+ loadUsers();
+
+ }
+
+
+
+
+
+ public void save(User user) {
+
+ // passed in should be a clone - simply replace
+
+ putUser(user);
+
+ }
+
+
+
+ public Collection findAllCountries() {
+
+ return this.countries.values();
+
+ }
+
+
+
+ public Country findCountry(String code) {
+
+ return (Country) this.countries.get(code);
+
+ }
+
+
+
+ public User findById(Integer id) {
+
+ User user = (User) this.users.get(id);
+
+
+
+ if (user != null) {
+
+ return cloneUser(user);
+
+ }
+
+
+
+ return null;
+
+ }
+
+
+
+ public Collection findAll() {
+
+ List userList = new ArrayList();
+
+ Iterator itr = this.users.values().iterator();
+
+ while (itr.hasNext()) {
+
+ User user = (User) itr.next();
+
+ userList.add(cloneUser(user));
+
+ }
+
+ return userList;
+
+ }
+
+
+
+
+
+ private void loadCountries() {
+
+ putCountry(new Country("AT", "Austria"));
+
+ putCountry(new Country("UK", "United Kingdom"));
+
+ putCountry(new Country("US", "United States"));
+
+ }
+
+
+
+ private void loadUsers() {
+
+ User u = new User();
+
+ u.setId(new Integer(1));
+
+ u.setFirstName("Harry");
+
+ u.setLastName("Potter");
+
+ u.setNotes("Promising Wizard...");
+
+ u.setCountry(findCountry("UK"));
+
+ u.setSex('M');
+
+ u.setHouse("Gryffindor");
+
+ u.getPreferences().setReceiveNewsletter(true);
+
+ u.getPreferences().setInterests(new String[]{"Quidditch"});
+
+ u.getPreferences().setFavouriteWord("Magic");
+
+ u.setPassword("password");
+
+
+
+ putUser(u);
+
+
+
+ u = new User();
+
+ u.setId(new Integer(2));
+
+ u.setFirstName("Ronald");
+
+ u.setLastName("Weasly");
+
+ u.setNotes("Friends with Harry Potter.");
+
+ u.setCountry(findCountry("UK"));
+
+ u.setSex('M');
+
+ u.setHouse("Gryffindor");
+
+ u.setPassword("password");
+
+
+
+ putUser(u);
+
+
+
+ u = new User();
+
+ u.setId(new Integer(3));
+
+ u.setFirstName("Hermione");
+
+ u.setLastName("Granger");
+
+ u.setNotes("Friends with Harry Potter.");
+
+ u.setCountry(findCountry("UK"));
+
+ u.setSex('F');
+
+ u.setHouse("Gryffindor");
+
+ u.setPassword("password");
+
+
+
+ putUser(u);
+
+ }
+
+
+
+ private void putUser(User user) {
+
+ this.users.put(user.getId(), user);
+
+ }
+
+
+
+ private void putCountry(Country country) {
+
+ this.countries.put(country.getCode(), country);
+
+ }
+
+
+
+ private User cloneUser(User user) {
+
+ try {
+
+ return (User) user.clone();
+
+ }
+
+ catch (CloneNotSupportedException e) {
+
+ throw new IllegalStateException("Unable to clone user.");
+
+ }
+
+ }
+
+
+
+}
+
diff --git a/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/service/UserManager.java b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/service/UserManager.java
new file mode 100644
index 0000000..5bcaa12
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/service/UserManager.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.service;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.domain.User;
+
+
+
+import java.util.Collection;
+
+
+
+/**
+
+ * Central service interface for the application.
+
+ *
+
+
+ */
+
+public interface UserManager {
+
+
+
+ /**
+
+ * Finds all of the {@link User Users} in the system.
+
+ *
+
+ * @return a {@link Collection} of all of the {@link User Users} in the system.
+
+ */
+
+ Collection findAll();
+
+
+
+ /**
+
+ * Finds the specific {@link User} identified by the supplied <code>id</code>.
+
+ *
+
+ * @param id the value uniquely identifying a {@link User}
+
+ * @return the located {@link User} or <code>null</code> if not found
+
+ */
+
+ User findById(Integer id);
+
+
+
+ /**
+
+ * Saves the supplied {@link User} to persistent storage.
+
+ *
+
+ * @param user the {@link User} to be so saved
+
+ */
+
+ void save(User user);
+
+
+
+ /**
+
+ * Finds all of the {@link Country Countries} in the system.
+
+ *
+
+ * @return all of the {@link Country Countries} in the system
+
+ */
+
+ Collection findAllCountries();
+
+
+
+ /**
+
+ * Finds the specific {@link Country} identified by the supplied (country) <code>code</code>.
+
+ *
+
+ * @param code the country code to be used to locate a specific {@link Country}
+
+ * @return the specific {@link Country} identified by the supplied (country) <code>code</code>
+
+ */
+
+ Country findCountry(String code);
+
+}
+
diff --git a/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/validation/CountryValidator.java b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/validation/CountryValidator.java
new file mode 100644
index 0000000..c4a591c
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/validation/CountryValidator.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.validation;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.util.StringUtils;
+
+import org.springframework.validation.Errors;
+
+import org.springframework.validation.Validator;
+
+
+
+/**
+
+ * Simple {@link Validator} implementation for {@link Country} instances.
+
+ *
+
+
+ */
+
+public class CountryValidator implements Validator {
+
+
+
+
+
+ public static final String DEFAULT_BAD_PLACEHOLDER_CODE = "-";
+
+
+
+
+
+ private String badPlaceholderCode = DEFAULT_BAD_PLACEHOLDER_CODE;
+
+
+
+
+
+ public void setBadPlaceholderCode(String badPlaceholderCode) {
+
+ this.badPlaceholderCode = StringUtils.hasText(badPlaceholderCode)
+
+ ? badPlaceholderCode : DEFAULT_BAD_PLACEHOLDER_CODE;
+
+ }
+
+
+
+
+
+ public boolean supports(Class candidate) {
+
+ return Country.class.isAssignableFrom(candidate);
+
+ }
+
+
+
+ public void validate(Object object, Errors errors) {
+
+ Country country = (Country) object;
+
+ if (country.getCode() == this.badPlaceholderCode) {
+
+ errors.rejectValue("bad.country.selected", "Please select a valid country");
+
+ }
+
+ }
+
+
+
+}
+
diff --git a/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/validation/UserValidator.java b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/validation/UserValidator.java
new file mode 100644
index 0000000..88e8aad
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/validation/UserValidator.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.validation;
+
+
+
+import org.springframework.showcase.formtags.domain.User;
+
+import org.springframework.validation.Errors;
+
+import org.springframework.validation.ValidationUtils;
+
+import org.springframework.validation.Validator;
+
+
+
+/**
+
+ * Simple {@link Validator} implementation for {@link User} instances.
+
+ *
+
+
+ */
+
+public class UserValidator implements Validator {
+
+
+
+ public boolean supports(Class candidate) {
+
+ return User.class.isAssignableFrom(candidate);
+
+ }
+
+
+
+ public void validate(Object obj, Errors errors) {
+
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "required", "Field is required.");
+
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "required", "Field is required.");
+
+ }
+
+
+
+}
+
diff --git a/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/web/CountryEditor.java b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/web/CountryEditor.java
new file mode 100644
index 0000000..6c098e1
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/web/CountryEditor.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.web;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.service.UserManager;
+
+
+
+import java.beans.PropertyEditorSupport;
+
+
+
+/**
+
+ * Simple {@link java.beans.PropertyEditor} for the {@link org.springframework.showcase.formtags.domain.Country} class.
+
+ *
+
+
+ */
+
+public class CountryEditor extends PropertyEditorSupport {
+
+
+
+ private UserManager userManager;
+
+
+
+
+
+ /**
+
+ * Creates a new instance of the {@link org.springframework.showcase.formtags.web.CountryEditor} class.
+
+ *
+
+ * @param userManager the service object that is to be used to resolve country codes
+
+ */
+
+ public CountryEditor(UserManager userManager) {
+
+ this.userManager = userManager;
+
+ }
+
+
+
+
+
+ public void setAsText(String text) throws IllegalArgumentException {
+
+ setValue(this.userManager.findCountry(text));
+
+ }
+
+
+
+ public String getAsText() {
+
+ if (getValue() == null) {
+
+ return "";
+
+ }
+
+ return ((Country) getValue()).getCode();
+
+ }
+
+
+
+}
+
diff --git a/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/web/FormController.java b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/web/FormController.java
new file mode 100644
index 0000000..70a82f0
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/web/FormController.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.web;
+
+
+
+import org.springframework.core.enums.StaticLabeledEnumResolver;
+
+import org.springframework.showcase.formtags.domain.Colour;
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.domain.User;
+
+import org.springframework.showcase.formtags.service.UserManager;
+
+import org.springframework.ui.ModelMap;
+
+import org.springframework.validation.Errors;
+
+import org.springframework.web.bind.ServletRequestDataBinder;
+
+import org.springframework.web.bind.ServletRequestUtils;
+
+import org.springframework.web.servlet.mvc.SimpleFormController;
+
+
+
+import javax.servlet.http.HttpServletRequest;
+
+import java.beans.PropertyEditorSupport;
+
+import java.util.Map;
+
+
+
+/**
+
+ * The central form controller for this showcase application.
+
+ *
+
+
+ */
+
+public class FormController extends SimpleFormController {
+
+
+
+ private UserManager userManager;
+
+
+
+
+
+ /**
+
+ * Sets the {@link UserManager} to which this presentation component
+
+ * delegates in order to perform complex business logic.
+
+ * @param userManager the {@link UserManager} to which this presentation
+
+ * component delegatesin order to perform complex business logic
+
+ */
+
+ public void setUserManager(UserManager userManager) {
+
+ this.userManager = userManager;
+
+ }
+
+
+
+
+
+ protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
+
+ binder.registerCustomEditor(Country.class, new CountryEditor(this.userManager));
+
+ binder.registerCustomEditor(Colour.class, new PropertyEditorSupport() {
+
+ public void setAsText(String string) throws IllegalArgumentException {
+
+ Short code = new Short(string);
+
+ StaticLabeledEnumResolver resolver = new StaticLabeledEnumResolver();
+
+ setValue(resolver.getLabeledEnumByCode(Colour.class, code));
+
+ }
+
+ });
+
+ }
+
+
+
+ protected Map referenceData(HttpServletRequest request, Object command, Errors errors) throws Exception {
+
+ return new ModelMap(this.userManager.findAllCountries())
+
+ .addObject("skills", getSkills())
+
+ .addObject(this.userManager.findAll());
+
+ }
+
+
+
+ protected Object formBackingObject(HttpServletRequest request) throws Exception {
+
+ int id = ServletRequestUtils.getRequiredIntParameter(request, "id");
+
+ return this.userManager.findById(new Integer(id));
+
+ }
+
+
+
+ protected void doSubmitAction(Object managedResource) throws Exception {
+
+ this.userManager.save((User) managedResource);
+
+ }
+
+
+
+
+
+ private String[] getSkills() {
+
+ return new String[]{
+
+ "Potions",
+
+ "Herbology",
+
+ "Quidditch"
+
+ };
+
+ }
+
+
+
+}
+
diff --git a/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/web/ListController.java b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/web/ListController.java
new file mode 100644
index 0000000..b98d743
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/java/org/springframework/showcase/formtags/web/ListController.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.web;
+
+
+
+import org.springframework.showcase.formtags.service.UserManager;
+
+import org.springframework.web.servlet.ModelAndView;
+
+import org.springframework.web.servlet.mvc.AbstractController;
+
+
+
+import javax.servlet.http.HttpServletRequest;
+
+import javax.servlet.http.HttpServletResponse;
+
+
+
+/**
+
+ * Simple {@link org.springframework.web.servlet.mvc.Controller} implementation
+
+ * that pretty much locates (and thus allows a {@link org.springframework.web.servlet.View}
+
+ * to render a list) of all of the {@link org.springframework.showcase.formtags.domain.User Users}
+
+ * in the application.
+
+ *
+
+
+ */
+
+public class ListController extends AbstractController {
+
+
+
+
+
+ private UserManager userManager;
+
+ private String viewName;
+
+
+
+ public void setViewName(String viewName) {
+
+ this.viewName = viewName;
+
+ }
+
+
+
+ /**
+
+ * Sets the {@link UserManager} that to which this presentation component delegates
+
+ * in order to perform complex business logic.
+
+ *
+
+ * @param userManager the {@link UserManager} that to which this presentation component delegates
+
+ * in order to perform complex business logic
+
+ */
+
+ public void setUserManager(UserManager userManager) {
+
+ this.userManager = userManager;
+
+ }
+
+
+
+
+
+ protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ return new ModelAndView(viewName).addObject(this.userManager.findAll());
+
+ }
+
+
+
+}
+
diff --git a/shared-libs/formtags-shared-libs/src/main/resources/i18n.properties b/shared-libs/formtags-shared-libs/src/main/resources/i18n.properties
new file mode 100644
index 0000000..fa1de17
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/resources/i18n.properties
@@ -0,0 +1 @@
+form.title=Spring 2.0 form tag showcase application
\ No newline at end of file
diff --git a/shared-libs/formtags-shared-libs/src/main/resources/i18n_en_GB.properties b/shared-libs/formtags-shared-libs/src/main/resources/i18n_en_GB.properties
new file mode 100644
index 0000000..d597e96
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/resources/i18n_en_GB.properties
@@ -0,0 +1 @@
+form.title=Spring 2.0 form tag showcase application (Lovely Jubbly!)
\ No newline at end of file
diff --git a/shared-libs/formtags-shared-libs/src/main/webapp/META-INF/MANIFEST.MF b/shared-libs/formtags-shared-libs/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b767eda
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Version: 2.0.1
+Bundle-Name: FormTags Shared Library War
+Bundle-SymbolicName: org.springframework.showcase.formtags_shared_libs
+Import-Package: javax.servlet.http,
+ javax.servlet.jsp.jstl.core;version="[1.1.2,1.2.0)"
+Import-Library: org.springframework.spring;version="[2.5.6.A,4.0.0)"
+Import-Bundle: com.springsource.org.apache.taglibs.standard;version="1.1.2"
diff --git a/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/applicationContext.xml b/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/applicationContext.xml
new file mode 100644
index 0000000..6daba4b
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/applicationContext.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
+<beans>
+
+ <bean id="userManager" class="org.springframework.showcase.formtags.service.StubUserManager"/>
+
+</beans>
\ No newline at end of file
diff --git a/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/formtags-servlet.xml b/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/formtags-servlet.xml
new file mode 100644
index 0000000..4e01c91
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/formtags-servlet.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
+<beans>
+
+ <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+ <property name="prefix" value="/WEB-INF/jsp/"/>
+ <property name="suffix" value=".jsp"/>
+ </bean>
+
+ <bean name="/list.htm" class="org.springframework.showcase.formtags.web.ListController">
+ <property name="userManager" ref="userManager"/>
+ </bean>
+
+ <bean name="/form.htm" class="org.springframework.showcase.formtags.web.FormController">
+ <property name="formView" value="form"/>
+ <property name="successView" value="redirect:list.htm"/>
+ <property name="userManager" ref="userManager"/>
+ <property name="validators">
+ <bean id="userValidator" class="org.springframework.showcase.formtags.validation.UserValidator"/>
+ </property>
+ </bean>
+
+ <bean name="/about.htm" class="org.springframework.showcase.formtags.web.ListController">
+ <property name="userManager" ref="userManager"/>
+ <property name="viewName" value="about"/>
+ </bean>
+
+ <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
+ <property name="basename" value="i18n"/>
+ </bean>
+
+</beans>
diff --git a/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/jsp/about.jsp b/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/jsp/about.jsp
new file mode 100644
index 0000000..69bb766
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/jsp/about.jsp
@@ -0,0 +1,61 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title>Virgo Server, form tags showcase application</title>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+ <link rel="icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link rel="shortcut icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+
+ <link href="<c:url value="/css/style.css"/>" rel="stylesheet" type="text/css"/>
+
+ </head>
+
+<body>
+ <div id="main">
+
+ <div id="topmenu">
+ <a href="http://www.eclipse.org/virgo/">Virgo</a><a href="http://www.eclipse.org/forums/index.php?t=thread&frm_id=159">Virgo Forums</a><a href="http://forum.springframework.org">Spring forum</a><a href="http://www.dzone.com">Dzone.com</a><a href="http://www.infoq.com">Infoq.com</a>
+ </div>
+
+ <div id="header">
+ <span class="title">Virgo Server<span class="darktitle">2.0</span> form tags</span><br/>
+ </div>
+
+
+ <div id="content">
+ <div id="block">
+ <p>
+The Spring MVC form tags application showcases the new form
+tag library introduced in Spring 2.0.</p>
+
+<p>The web application is *very* simplistic, because the intent is
+to convey the essence of the new form tags themselves and nothing
+else.</p>
+
+ </div>
+
+ </div>
+
+ <div class="lefty">
+ <div class="menu">
+ <c:forEach items="${userList}" var="user">
+ <a href="form.htm?id=<c:out value="${user.id}"/>"><c:out value="${user.lastName}"/>, <c:out value="${user.firstName}"/></a>
+ </c:forEach>
+
+ </div>
+ <p>New JSP tags in Spring 2.0 make building forms with Spring MVC much easier</p>
+ <div class="menu">
+ <a href="<c:url value="/list.htm"/>">Home</a>
+ </div>
+ </div>
+
+</div>
+
+</body>
+</html>
diff --git a/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/jsp/form.jsp b/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/jsp/form.jsp
new file mode 100644
index 0000000..7b67053
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/jsp/form.jsp
@@ -0,0 +1,229 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
+<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title><spring:message code="form.title"/></title>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+ <link rel="icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link rel="shortcut icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link href="<c:url value="/css/style.css"/>" rel="stylesheet" type="text/css"/>
+ </head>
+
+<body>
+ <div id="main">
+
+ <div id="topmenu">
+ <a href="http://www.eclipse.org/virgo/">Virgo</a><a href="http://www.eclipse.org/forums/index.php?t=thread&frm_id=159">Virgo Forums</a><a href="http://forum.springframework.org">Spring forum</a><a href="http://www.dzone.com">Dzone.com</a><a href="http://www.infoq.com">Infoq.com</a>
+ </div>
+
+ <div id="header">
+ <span class="title">Virgo Server <span class="darktitle">2.0</span> form tags</span><br/>
+ </div>
+
+ <div id="content">
+
+ <h1>Edit apprentice magician <c:out value="${command.firstName}"/> <c:out value="${command.lastName}" /></h1>
+ <form:form>
+ <form:errors path="*" cssClass="errorBox" />
+
+ <div class="first">
+ <form:label path="firstName">First Name:</form:label>
+ <form:input path="firstName" />
+ <form:errors path="firstName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="lastName">Last Name:</form:label>
+ <form:input path="lastName" disabled="true" />
+ <form:errors path="lastName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="country">Country:</form:label>
+ <form:select path="country">
+ <form:option value="" label="--Please Select"/>
+ <form:options items="${countryList}" itemValue="code" itemLabel="name"/>
+ </form:select>
+ <form:errors path="country" cssClass="error"/>
+ </div>
+
+ <div>
+ <form:label path="skills">Skills:</form:label>
+ <form:select path="skills" items="${skills}"/>
+ </div>
+
+ <div>
+ <form:label path="notes">Notes:</form:label>
+ <form:textarea path="notes" readonly="true" rows="3" cols="20" />
+ <form:errors path="notes" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="sex">Sex:</form:label>
+ Male: <form:radiobutton path="sex" value="M"/>
+ Female: <form:radiobutton path="sex" value="F"/>
+ </div>
+
+ <div>
+ <form:label path="house">House:</form:label>
+ <form:select path="house">
+ <form:option value="Gryffindor"/>
+ <form:option value="Hufflepuff"/>
+ <form:option value="Ravenclaw" disabled="true"/>
+ <form:option value="Slytherin"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="preferences.receiveNewsletter">Subscribe to newsletter?:</form:label>
+ <form:checkbox path="preferences.receiveNewsletter"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.interests">Interests:</form:label>
+ <span>Quidditch:</span> <form:checkbox path="preferences.interests" value="Quidditch"/><br/>
+ <span>Herbology:</span> <form:checkbox path="preferences.interests" value="Herbology"/><br/>
+ <span>Defence Against the Dark Arts:</span> <form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.favouriteWord">Favourite Word:</form:label>
+ <span>Magic:</span> <form:checkbox path="preferences.favouriteWord" value="Magic"/>
+ </div>
+
+ <div>
+ <form:label path="favouriteColour">Favourite Colour:</form:label>
+ <form:select path="favouriteColour">
+ <form:option value="0" label="RED"/>
+ <form:option value="1" label="GREEN"/>
+ <form:option value="2" label="BLUE"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="password">Password:</form:label>
+ <form:password path="password" showPassword="true" />
+ </div>
+
+ <div>
+ <input type="submit" value="Save Changes" />
+ </div>
+ </form:form>
+
+ <br/>
+
+ <h1>The JSP form tags:</h1>
+ <textarea rows="10" cols="55" class="showjspcode">
+<form:form>
+ <form:errors path="*" cssClass="errorBox" />
+
+ <div class="first">
+ <form:label path="firstName">First Name:</form:label>
+ <form:input path="firstName" />
+ <form:errors path="firstName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="lastName">Last Name:</form:label>
+ <form:input path="lastName" disabled="true" />
+ <form:errors path="lastName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="country">Country:</form:label>
+ <form:select path="country">
+ <form:option value="" label="--Please Select"/>
+ <form:options items="${countryList}" itemValue="code" itemLabel="name"/>
+ </form:select>
+ <form:errors path="country" cssClass="error"/>
+ </div>
+
+ <div>
+ <form:label path="skills">Skills:</form:label>
+ <form:select path="skills" items="${skills}"/>
+ </div>
+
+ <div>
+ <form:label path="notes">Notes:</form:label>
+ <form:textarea path="notes" readonly="true" rows="3" cols="20" />
+ <form:errors path="notes" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="sex">Sex:</form:label>
+ Male: <form:radiobutton path="sex" value="M"/>
+ Female: <form:radiobutton path="sex" value="F"/>
+ </div>
+
+ <div>
+ <form:label path="house">House:</form:label>
+ <form:select path="house">
+ <form:option value="Gryffindor"/>
+ <form:option value="Hufflepuff"/>
+ <form:option value="Ravenclaw"/>
+ <form:option value="Slytherin"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="preferences.receiveNewsletter">Subscribe to newsletter?:</form:label>
+ <form:checkbox path="preferences.receiveNewsletter"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.interests">Interests:</form:label>
+ <span>Quidditch:</span> <form:checkbox path="preferences.interests" value="Quidditch"/><br/>
+ <span>Herbology:</span> <form:checkbox path="preferences.interests" value="Herbology"/><br/>
+ <span>Defence Against the Dark Arts:</span> <form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.favouriteWord">Favourite Word:</form:label>
+ <span>Magic:</span> <form:checkbox path="preferences.favouriteWord" value="Magic"/>
+ </div>
+
+ <div>
+ <form:label path="favouriteColour">Favourite Colour:</form:label>
+ <form:select path="favouriteColour">
+ <form:option value="0" label="RED"/>
+ <form:option value="1" label="GREEN"/>
+ <form:option value="2" label="BLUE"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="password">Password:</form:label>
+ <form:password path="password" showPassword="true" />
+ </div>
+
+ <div>
+ <input type="submit" value="Save Changes" />
+ </div>
+</form:form>
+ </textarea>
+
+ </div>
+
+ <div class="lefty">
+ <div class="menu">
+ <c:forEach items="${userList}" var="user">
+ <a href="form.htm?id=<c:out value="${user.id}"/>"><c:out value="${user.lastName}"/>, <c:out value="${user.firstName}"/></a>
+ </c:forEach>
+
+ </div>
+ <p>New JSP tags in Spring 2.0 make building forms with Spring MVC much easier.</p>
+ <div class="menu">
+ <a href="<c:url value="/about.htm"/>">About</a>
+ <a href="<c:url value="/list.htm"/>">Home</a>
+ </div>
+ </div>
+
+</div>
+
+</body>
+</html>
diff --git a/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/jsp/list.jsp b/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/jsp/list.jsp
new file mode 100644
index 0000000..91f2eb7
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/jsp/list.jsp
@@ -0,0 +1,59 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title>Virgo Server, form tags showcase application</title>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+ <link rel="icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link rel="shortcut icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+
+ <link href="<c:url value="/css/style.css"/>" rel="stylesheet" type="text/css"/>
+
+ </head>
+
+<body>
+ <div id="main">
+
+ <div id="topmenu">
+ <a href="http://www.eclipse.org/virgo/">Virgo</a><a href="http://www.eclipse.org/forums/index.php?t=thread&frm_id=159">Virgo Forums</a><a href="http://forum.springframework.org">Spring forum</a><a href="http://www.dzone.com">Dzone.com</a><a href="http://www.infoq.com">Infoq.com</a>
+ </div>
+
+ <div id="header">
+ <span class="title">Virgo Server<span class="darktitle">2.0</span> form tags</span><br/>
+ </div>
+
+
+ <div id="content">
+ <div id="block">
+ <p>Welcome to this Spring 2.0 showcase application that demonstrates
+ the use of new JSP tags for creating form elements.</p>
+
+ <p>Choose an apprentice magician on the left-hand side to continue.</p>
+
+
+ </div>
+
+ </div>
+
+ <div class="lefty">
+ <div class="menu">
+ <c:forEach items="${userList}" var="user">
+ <a href="form.htm?id=<c:out value="${user.id}"/>"><c:out value="${user.lastName}"/>, <c:out value="${user.firstName}"/></a>
+ </c:forEach>
+
+ </div>
+ <p>New JSP tags in Spring 2.0 make building forms with Spring MVC much easier</p>
+ <div class="menu">
+ <a href="<c:url value="/about.htm"/>">About</a>
+ </div>
+ </div>
+
+</div>
+
+</body>
+</html>
diff --git a/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/web.xml b/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..3957ca9
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+ <listener>
+ <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+ </listener>
+
+ <servlet>
+ <servlet-name>formtags</servlet-name>
+ <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>formtags</servlet-name>
+ <url-pattern>*.htm</url-pattern>
+ </servlet-mapping>
+
+ <welcome-file-list>
+ <welcome-file>index.jsp</welcome-file>
+ </welcome-file-list>
+
+</web-app>
diff --git a/shared-libs/formtags-shared-libs/src/main/webapp/css/base.css b/shared-libs/formtags-shared-libs/src/main/webapp/css/base.css
new file mode 100644
index 0000000..4cafa80
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/webapp/css/base.css
@@ -0,0 +1,5 @@
+
+.errorBox {
+ border: red solid 1px;
+ background-color: tomato;
+}
diff --git a/shared-libs/formtags-shared-libs/src/main/webapp/css/style.css b/shared-libs/formtags-shared-libs/src/main/webapp/css/style.css
new file mode 100644
index 0000000..3b337a8
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/webapp/css/style.css
@@ -0,0 +1,239 @@
+body
+{
+ margin: 0;
+ margin: 0 auto;
+ background: #f4f4f4 url(images/bg.gif) top center repeat-y;
+}
+#header
+{
+ vertical-align: top;
+ padding-bottom: 11px;
+ padding-left: 18px;
+ font-family: Georgia, Lucida, Arial, sans-serif;
+ font-size: 11px;
+ font-weight: lighter;
+ color: #00008B;
+ border-bottom: 1px solid #efefef;
+}
+.title
+{
+ font-size: 24px;
+ font-style: italic;
+ font-weight: bold;
+ color: #90200A;
+}
+.darktitle
+{
+ font-size: 24px;
+ font-style: italic;
+ font-weight: bold;
+ color: #000000;
+}
+#main
+{
+ width: 780px;
+ height: auto;
+ border-left: 1px solid #efefef;
+ border-right: 1px solid #efefef;
+ margin: 0 auto 0 auto;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 11px;
+ font-weight: normal;
+ color: #A52A2A;
+}
+h1, h2
+{
+ font-size: 12px;
+ font-family: Verdana, Arial, sans-serif;
+ color: #191970;
+ font-weight: bold;
+ padding-left: 4px;
+}
+h3, h4
+{
+ font-size: 11px;
+ font-family: Verdana, Arial, sans-serif;
+ color: #2F4F4F;
+ font-weight: bold;
+ padding-left: 8px;
+}
+.menu
+{
+ width: 150px;
+ color: #00008B;
+ font-family: Verdana, Arial, sans-serif;
+}
+.menu a:link, .menu a:visited
+{
+ width: 150px;
+ margin: 1px 0 1px 0;
+ padding: 4px 3px 4px 8px;
+ background-color: transparent;
+ color: #003366;
+ text-decoration: none;
+ font-family: Verdana, Arial, sans-serif;
+ font-weight: normal;
+ display: block;
+}
+.menu a:hover
+{
+ color: #A52A2A;
+ text-decoration: none;
+}
+#topmenu
+{
+ text-align: right;
+ padding-top: 1em;
+ padding-right: 1em;
+ font-family: Verdana, Arial, sans-serif;
+ font-weight: bold;
+}
+#topmenu a:link, #topmenu a:visited
+{
+ color: #ffffff;
+ text-decoration: none;
+ background-color: #000000;
+ border: 1px solid #666666;
+ padding-top: .3em;
+ padding-bottom: .3em;
+ padding-left: .8em;
+ padding-right: .8em;
+}
+#topmenu a:hover
+{
+ color: #ffffff;
+ background-color: #90200A;
+ border: 1px solid #90200A;
+ text-decoration: none;
+ padding-top: .3em;
+ padding-bottom: .3em;
+ padding-left: .8em;
+ padding-right: .8em;
+}
+#lefty
+{
+ margin: 8px;
+ width: 150px;
+ height: auto;
+ color: #00008B;
+ font-family: Verdana, Arial, sans-serif;
+}
+#lefty p
+{
+ width: 94%;
+ padding: 12px;
+ font-family: Verdana, Arial, sans-serif;
+ background-color: #f9f9f9;
+ color: #607080;
+}
+#block
+{
+ padding: 12px;
+ font-family: Verdana, Arial, sans-serif;
+ background-color: #f9f9f9;
+ color: #607080;
+}
+#breadcrumb
+{
+ text-align: right;
+ color: #999999;
+ padding-bottom: 11px;
+}
+#breadcrumb a:link, #breadcrumb a:visited
+{
+ color: #999999;
+ text-decoration: none;
+}
+#breadcrumb a:hover
+{
+ color: #aaaaaa;
+ text-decoration: none;
+}
+a:link, a:visited
+{
+ color: #003366;
+ border-bottom: 1px solid #efefef;
+ font-family: Verdana, Arial, sans-serif;
+ text-decoration: none;
+}
+a:hover
+{
+ color: #A52A2A;
+ text-decoration: none;
+}
+#content
+{
+ float: right;
+ width: 570px;
+ text-align: left;
+ padding-top: 11px;
+ padding-bottom: 11px;
+ padding-left: 11px;
+ padding-right: 16px;
+ border-left: 1px solid #efefef;
+ font-family: Verdana, Arial, sans-serif;
+ line-height: 145%;
+ color: #607080;
+}
+#content h3, h4
+{
+ font-family: Verdana, Arial, sans-serif;
+ color: #2F4F4F;
+ font-weight: bold;
+ padding-left: 0px;
+}
+#footer
+{
+ text-align: center;
+ padding: 11px;
+ font-family: Verdana, Arial, sans-serif;
+ font-weight: lighter;
+ color: #cccccc;
+}
+hr
+{
+ border:0;
+ border-bottom: 1px solid #efefef;
+ height: 1px;
+}
+li
+{
+ list-style-type: none;
+ line-height: 160%;
+}
+form div label
+{
+ width: 14em;
+ float: left;
+ margin-left: -15em;
+}
+.first {
+ margin-top: 0em;
+ padding-top: 0em;
+ padding-left: 15em;
+ border-top: none;
+}
+form div
+{
+ margin-top: 0.5em;
+ padding-top: 0.5em;
+ padding-left: 15em;
+ border-top: 1px dashed gray;
+}
+form div span
+{
+ width: 20em;
+ float: left;
+}
+form div span.error
+{
+ width: 20em;
+ margin-left: 0.5em;
+ float: none;
+ color: red;
+}
+form span.errorBox
+{
+ color: red;
+}
+
diff --git a/shared-libs/formtags-shared-libs/src/main/webapp/favicon.ico b/shared-libs/formtags-shared-libs/src/main/webapp/favicon.ico
new file mode 100644
index 0000000..7e54ebd
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/webapp/favicon.ico
Binary files differ
diff --git a/shared-libs/formtags-shared-libs/src/main/webapp/index.jsp b/shared-libs/formtags-shared-libs/src/main/webapp/index.jsp
new file mode 100644
index 0000000..92d1b12
--- /dev/null
+++ b/shared-libs/formtags-shared-libs/src/main/webapp/index.jsp
@@ -0,0 +1,5 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
+
+<!-- simply redirects to the main switchboard page of the showcase web application -->
+
+<c:redirect url="/list.htm"/>
\ No newline at end of file
diff --git a/shared-services/README.TXT b/shared-services/README.TXT
new file mode 100644
index 0000000..9d26fc2
--- /dev/null
+++ b/shared-services/README.TXT
@@ -0,0 +1,54 @@
+================================================================================
+== Virgo Server - Form Tags - Shared Services WAR ==
+================================================================================
+
+@author Sam Brannen
+@author Colin Yates
+@author Christopher Frost
+
+--------------------------------------------------------------------------------
+
+This is a version of the Spring Form Tags showcase application which builds upon
+the benefits of the Shared Libraries WAR. In addition to externalizing
+third-party library dependencies, this example externalizes the service layer
+by splitting the Shared Libraries WAR into a service bundle and a Shared
+Services WAR.
+
+--------------------------------------------------------------------------------
+
+PROJECTS
+
+ - build-shared-services: the build directory for the application
+ - formtags-shared-services-service: the service bundle
+ - formtags-shared-services-war: the WAR
+
+--------------------------------------------------------------------------------
+
+BUILD AND DEPLOYMENT
+
+1) Build and deploy the service bundle:
+
+ a) $> cd formtags-shared-services-service
+ b) $> ant jar
+ c) Copy target/artifacts/formtags-shared-services-service.jar to the
+ SERVER_HOME_HOME/pickup directory.
+
+2) Build and deploy the WAR:
+
+ a) $> cd ../formtags-shared-services-war
+ b) $> ant jar
+ c) Copy target/artifacts/formtags-shared-services-war.war to the
+ SERVER_HOME/pickup directory.
+
+--------------------------------------------------------------------------------
+
+URL: http://localhost:8080/formtags-shared-services-war
+
+Note: the context path under which the web application is deployed is
+ determined by the file name of the WAR. Thus, if you deploy a distribution
+ JAR named 'formtags-shared-services-war-2.0.1.RELEASE.war', you will need
+ to use the following URL:
+
+ http://localhost:8080/formtags-shared-services-war-1.0.0.RELEASE
+
+--------------------------------------------------------------------------------
diff --git a/shared-services/build-shared-services/build.xml b/shared-services/build-shared-services/build.xml
new file mode 100644
index 0000000..ffb0918
--- /dev/null
+++ b/shared-services/build-shared-services/build.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="build-shared-services" default="precommit">
+
+ <path id="bundles">
+ <pathelement location="${basedir}/../formtags-shared-services-service"/>
+ <pathelement location="${basedir}/../formtags-shared-services-war"/>
+ </path>
+
+ <property file="${basedir}/../../build.properties"/>
+ <import file="${basedir}/../../virgo-build/multi-bundle/default.xml"/>
+
+ <target name="precommit" depends="clean, clean-integration, jar"/>
+
+</project>
diff --git a/shared-services/formtags-shared-services-service/.classpath b/shared-services/formtags-shared-services-service/.classpath
new file mode 100644
index 0000000..3671d42
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources"/>
+ <classpathentry kind="con" path="com.springsource.server.ide.jdt.core.MANIFEST_CLASSPATH_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/JVM 1.6.0"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/shared-services/formtags-shared-services-service/.project b/shared-services/formtags-shared-services-service/.project
new file mode 100644
index 0000000..31b5a56
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/.project
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>formtags-shared-services-service</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.springframework.ide.eclipse.core.springbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.springsource.server.ide.facet.core.bundlenature</nature>
+ <nature>org.springframework.ide.eclipse.core.springnature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+ </natures>
+</projectDescription>
diff --git a/shared-services/formtags-shared-services-service/.settings/org.eclipse.jdt.core.prefs b/shared-services/formtags-shared-services-service/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..1c62194
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Fri May 02 14:21:08 BST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/shared-services/formtags-shared-services-service/.settings/org.eclipse.jst.common.project.facet.core.prefs b/shared-services/formtags-shared-services-service/.settings/org.eclipse.jst.common.project.facet.core.prefs
new file mode 100644
index 0000000..73cb4d8
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/.settings/org.eclipse.jst.common.project.facet.core.prefs
@@ -0,0 +1,3 @@
+#Thu Jun 11 16:55:50 BST 2009
+classpath.helper/org.eclipse.jdt.launching.JRE_CONTAINER\:\:org.eclipse.jdt.internal.launching.macosx.MacOSXType\:\:JVM\ 1.6.0/owners=jst.java\:5.0
+eclipse.preferences.version=1
diff --git a/shared-services/formtags-shared-services-service/.settings/org.eclipse.wst.common.project.facet.core.xml b/shared-services/formtags-shared-services-service/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..4eff0bc
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <runtime name="SpringSource dm Server (Runtime) v2.0"/>
+ <installed facet="jst.java" version="5.0"/>
+ <installed facet="com.springsource.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/shared-services/formtags-shared-services-service/.springBeans b/shared-services/formtags-shared-services-service/.springBeans
new file mode 100644
index 0000000..02c34e1
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/.springBeans
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+ <version>1</version>
+ <pluginVersion><![CDATA[2.0.5.v200805202005]]></pluginVersion>
+ <configSuffixes>
+ <configSuffix><![CDATA[xml]]></configSuffix>
+ </configSuffixes>
+ <enableImports><![CDATA[false]]></enableImports>
+ <configs>
+ <config>src/main/resources/META-INF/spring/module-context.xml</config>
+ <config>src/main/resources/META-INF/spring/osgi-context.xml</config>
+ </configs>
+ <configSets>
+ </configSets>
+</beansProjectDescription>
diff --git a/shared-services/formtags-shared-services-service/build.xml b/shared-services/formtags-shared-services-service/build.xml
new file mode 100644
index 0000000..a4c4069
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="formtags-shared-services-service">
+
+ <property file="${basedir}/../../build.properties" />
+ <property file="${basedir}/../../build.versions" />
+ <import file="${basedir}/../../build-formtags/package-bundle.xml" />
+ <import file="${basedir}/../../virgo-build/standard/default.xml" />
+
+</project>
diff --git a/shared-services/formtags-shared-services-service/ivy.xml b/shared-services/formtags-shared-services-service/ivy.xml
new file mode 100644
index 0000000..7cc7417
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/ivy.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+ version="1.3">
+
+ <info organisation="org.eclipse.virgo.samples" module="${ant.project.name}" />
+
+ <configurations>
+ <include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+ </configurations>
+
+ <publications>
+ <artifact name="${ant.project.name}"/>
+ <artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+ </publications>
+
+ <dependencies>
+ <dependency org="org.springframework" name="org.springframework.spring-library" rev="${org.springframework.spring}" conf="provided->compile"/>
+ </dependencies>
+
+</ivy-module>
diff --git a/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/domain/Colour.java b/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/domain/Colour.java
new file mode 100644
index 0000000..88e715e
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/domain/Colour.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+import org.springframework.core.enums.ShortCodedLabeledEnum;
+
+
+
+/**
+
+ * Simple enumeration for common colors.
+
+ *
+
+
+ */
+
+public class Colour extends ShortCodedLabeledEnum {
+
+
+
+
+
+ public static final Colour RED = new Colour(0, "RED");
+
+ public static final Colour GREEN = new Colour(1, "GREEN");
+
+ public static final Colour BLUE = new Colour(2, "BLUE");
+
+
+
+
+
+ private Colour(int code, String label) {
+
+ super(code, label);
+
+ }
+
+
+
+}
+
diff --git a/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/domain/Country.java b/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/domain/Country.java
new file mode 100644
index 0000000..caf564c
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/domain/Country.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+/**
+
+ * Models a country.
+
+ *
+
+
+ */
+
+public class Country implements Comparable {
+
+
+
+
+
+ private String code;
+
+ private String name;
+
+
+
+
+
+ /**
+
+ * Creates a new instance of this {@link Country} class.
+
+ */
+
+ public Country() {
+
+ }
+
+
+
+ /**
+
+ * Creates a new instance of this {@link Country} class.
+
+ *
+
+ * @param code the country code
+
+ * @param name the name of the country
+
+ */
+
+ public Country(String code, String name) {
+
+ this.code = code;
+
+ this.name = name;
+
+ }
+
+
+
+
+
+ public String getCode() {
+
+ return code;
+
+ }
+
+
+
+ public String getName() {
+
+ return name;
+
+ }
+
+
+
+
+
+ public int compareTo(Object o) {
+
+ return this.code.compareTo(((Country) o).code);
+
+ }
+
+
+
+}
+
diff --git a/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/domain/Preferences.java b/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/domain/Preferences.java
new file mode 100644
index 0000000..ab6c627
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/domain/Preferences.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+/**
+
+ * Models a {@link User User's} preferences.
+
+ *
+
+
+ */
+
+public class Preferences {
+
+
+
+
+
+ private boolean receiveNewsletter;
+
+ private String[] interests;
+
+ private String favouriteWord;
+
+
+
+
+
+ public boolean isReceiveNewsletter() {
+
+ return receiveNewsletter;
+
+ }
+
+
+
+ public void setReceiveNewsletter(boolean receiveNewsletter) {
+
+ this.receiveNewsletter = receiveNewsletter;
+
+ }
+
+
+
+ public String[] getInterests() {
+
+ return interests;
+
+ }
+
+
+
+ public void setInterests(String[] interests) {
+
+ this.interests = interests;
+
+ }
+
+
+
+ public String getFavouriteWord() {
+
+ return favouriteWord;
+
+ }
+
+
+
+ public void setFavouriteWord(String favouriteWord) {
+
+ this.favouriteWord = favouriteWord;
+
+ }
+
+
+
+}
+
diff --git a/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/domain/User.java b/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/domain/User.java
new file mode 100644
index 0000000..925392f
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/domain/User.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+import java.util.ArrayList;
+
+import java.util.List;
+
+
+
+/**
+
+ * Models a user.
+
+ *
+
+
+ */
+
+public class User implements Cloneable {
+
+
+
+
+
+ private Integer id;
+
+ private String firstName;
+
+ private String lastName;
+
+ private String notes;
+
+ private String house;
+
+ private Country country = new Country();
+
+ private Colour favouriteColour = Colour.RED;
+
+ private List skills = new ArrayList();
+
+ private char sex;
+
+ private String password;
+
+ private Preferences preferences = new Preferences();
+
+ private String secretWord;
+
+
+
+
+
+ public Integer getId() {
+
+ return id;
+
+ }
+
+
+
+ public void setId(Integer id) {
+
+ this.id = id;
+
+ }
+
+
+
+ public String getFirstName() {
+
+ return firstName;
+
+ }
+
+
+
+ public void setFirstName(String firstName) {
+
+ this.firstName = firstName;
+
+ }
+
+
+
+ public String getLastName() {
+
+ return lastName;
+
+ }
+
+
+
+ public void setLastName(String lastName) {
+
+ this.lastName = lastName;
+
+ }
+
+
+
+ public String getNotes() {
+
+ return notes;
+
+ }
+
+
+
+ public void setNotes(String notes) {
+
+ this.notes = notes;
+
+ }
+
+
+
+ public String getHouse() {
+
+ return house;
+
+ }
+
+
+
+ public void setHouse(String house) {
+
+ this.house = house;
+
+ }
+
+
+
+ public Country getCountry() {
+
+ return country;
+
+ }
+
+
+
+ public void setCountry(Country country) {
+
+ this.country = country;
+
+ }
+
+
+
+ public Colour getFavouriteColour() {
+
+ return favouriteColour;
+
+ }
+
+
+
+ public void setFavouriteColour(Colour favouriteColour) {
+
+ this.favouriteColour = favouriteColour;
+
+ }
+
+
+
+ public char getSex() {
+
+ return sex;
+
+ }
+
+
+
+ public void setSex(char sex) {
+
+ this.sex = sex;
+
+ }
+
+
+
+ public Preferences getPreferences() {
+
+ return preferences;
+
+ }
+
+
+
+ public void setPreferences(Preferences preferences) {
+
+ this.preferences = preferences;
+
+ }
+
+
+
+ public List getSkills() {
+
+ return skills;
+
+ }
+
+
+
+ public void setSkills(List skills) {
+
+ this.skills = skills;
+
+ }
+
+
+
+ public String getPassword() {
+
+ return password;
+
+ }
+
+
+
+ public void setPassword(String password) {
+
+ this.password = password;
+
+ }
+
+
+
+ public String getSecretWord() {
+
+ return secretWord;
+
+ }
+
+
+
+ public void setSecretWord(String secretWord) {
+
+ this.secretWord = secretWord;
+
+ }
+
+
+
+
+
+ public Object clone() throws CloneNotSupportedException {
+
+ return super.clone();
+
+ }
+
+
+
+}
+
diff --git a/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/service/UserManager.java b/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/service/UserManager.java
new file mode 100644
index 0000000..5bcaa12
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/service/UserManager.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.service;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.domain.User;
+
+
+
+import java.util.Collection;
+
+
+
+/**
+
+ * Central service interface for the application.
+
+ *
+
+
+ */
+
+public interface UserManager {
+
+
+
+ /**
+
+ * Finds all of the {@link User Users} in the system.
+
+ *
+
+ * @return a {@link Collection} of all of the {@link User Users} in the system.
+
+ */
+
+ Collection findAll();
+
+
+
+ /**
+
+ * Finds the specific {@link User} identified by the supplied <code>id</code>.
+
+ *
+
+ * @param id the value uniquely identifying a {@link User}
+
+ * @return the located {@link User} or <code>null</code> if not found
+
+ */
+
+ User findById(Integer id);
+
+
+
+ /**
+
+ * Saves the supplied {@link User} to persistent storage.
+
+ *
+
+ * @param user the {@link User} to be so saved
+
+ */
+
+ void save(User user);
+
+
+
+ /**
+
+ * Finds all of the {@link Country Countries} in the system.
+
+ *
+
+ * @return all of the {@link Country Countries} in the system
+
+ */
+
+ Collection findAllCountries();
+
+
+
+ /**
+
+ * Finds the specific {@link Country} identified by the supplied (country) <code>code</code>.
+
+ *
+
+ * @param code the country code to be used to locate a specific {@link Country}
+
+ * @return the specific {@link Country} identified by the supplied (country) <code>code</code>
+
+ */
+
+ Country findCountry(String code);
+
+}
+
diff --git a/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/service/internal/StubUserManager.java b/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/service/internal/StubUserManager.java
new file mode 100644
index 0000000..f47660e
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/src/main/java/org/springframework/showcase/formtags/service/internal/StubUserManager.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.service.internal;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.domain.User;
+
+import org.springframework.showcase.formtags.service.UserManager;
+
+
+
+import java.util.*;
+
+
+
+/**
+
+ * Stub {@link UserManager} implementation that maintains simple
+
+ * in-memory state for users and countries.
+
+ *
+
+
+ */
+
+public class StubUserManager implements UserManager {
+
+
+
+
+
+ private Map users = new TreeMap();
+
+ private Map countries = new TreeMap();
+
+
+
+
+
+ /**
+
+ * Creates a new instance of the {@link StubUserManager} class.
+
+ */
+
+ public StubUserManager() {
+
+ loadCountries();
+
+ loadUsers();
+
+ }
+
+
+
+
+
+ public void save(User user) {
+
+ // passed in should be a clone - simply replace
+
+ putUser(user);
+
+ }
+
+
+
+ public Collection findAllCountries() {
+
+ return this.countries.values();
+
+ }
+
+
+
+ public Country findCountry(String code) {
+
+ return (Country) this.countries.get(code);
+
+ }
+
+
+
+ public User findById(Integer id) {
+
+ User user = (User) this.users.get(id);
+
+
+
+ if (user != null) {
+
+ return cloneUser(user);
+
+ }
+
+
+
+ return null;
+
+ }
+
+
+
+ public Collection findAll() {
+
+ List userList = new ArrayList();
+
+ Iterator itr = this.users.values().iterator();
+
+ while (itr.hasNext()) {
+
+ User user = (User) itr.next();
+
+ userList.add(cloneUser(user));
+
+ }
+
+ return userList;
+
+ }
+
+
+
+
+
+ private void loadCountries() {
+
+ putCountry(new Country("AT", "Austria"));
+
+ putCountry(new Country("UK", "United Kingdom"));
+
+ putCountry(new Country("US", "United States"));
+
+ }
+
+
+
+ private void loadUsers() {
+
+ User u = new User();
+
+ u.setId(new Integer(1));
+
+ u.setFirstName("Harry");
+
+ u.setLastName("Potter");
+
+ u.setNotes("Promising Wizard...");
+
+ u.setCountry(findCountry("UK"));
+
+ u.setSex('M');
+
+ u.setHouse("Gryffindor");
+
+ u.getPreferences().setReceiveNewsletter(true);
+
+ u.getPreferences().setInterests(new String[]{"Quidditch"});
+
+ u.getPreferences().setFavouriteWord("Magic");
+
+ u.setPassword("password");
+
+
+
+ putUser(u);
+
+
+
+ u = new User();
+
+ u.setId(new Integer(2));
+
+ u.setFirstName("Ronald");
+
+ u.setLastName("Weasly");
+
+ u.setNotes("Friends with Harry Potter.");
+
+ u.setCountry(findCountry("UK"));
+
+ u.setSex('M');
+
+ u.setHouse("Gryffindor");
+
+ u.setPassword("password");
+
+
+
+ putUser(u);
+
+
+
+ u = new User();
+
+ u.setId(new Integer(3));
+
+ u.setFirstName("Hermione");
+
+ u.setLastName("Granger");
+
+ u.setNotes("Friends with Harry Potter.");
+
+ u.setCountry(findCountry("UK"));
+
+ u.setSex('F');
+
+ u.setHouse("Gryffindor");
+
+ u.setPassword("password");
+
+
+
+ putUser(u);
+
+ }
+
+
+
+ private void putUser(User user) {
+
+ this.users.put(user.getId(), user);
+
+ }
+
+
+
+ private void putCountry(Country country) {
+
+ this.countries.put(country.getCode(), country);
+
+ }
+
+
+
+ private User cloneUser(User user) {
+
+ try {
+
+ return (User) user.clone();
+
+ }
+
+ catch (CloneNotSupportedException e) {
+
+ throw new IllegalStateException("Unable to clone user.");
+
+ }
+
+ }
+
+
+
+}
+
diff --git a/shared-services/formtags-shared-services-service/src/main/resources/META-INF/MANIFEST.MF b/shared-services/formtags-shared-services-service/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..d4462ba
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: FormTags Service (and implementation)
+Bundle-SymbolicName: org.springframework.showcase.formtags.service_shared_services
+Bundle-Version: 2.0.1
+Import-Library: org.springframework.spring;version="[2.5.6.A,4.0.0)"
+Export-Package: org.springframework.showcase.formtags.domain,
+ org.springframework.showcase.formtags.service
+
diff --git a/shared-services/formtags-shared-services-service/src/main/resources/META-INF/spring/module-context.xml b/shared-services/formtags-shared-services-service/src/main/resources/META-INF/spring/module-context.xml
new file mode 100644
index 0000000..8593098
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/src/main/resources/META-INF/spring/module-context.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xmlns:tx="http://www.springframework.org/schema/tx"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
+ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
+ http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
+
+ <bean id="userManager" class="org.springframework.showcase.formtags.service.internal.StubUserManager"/>
+
+</beans>
diff --git a/shared-services/formtags-shared-services-service/src/main/resources/META-INF/spring/osgi-context.xml b/shared-services/formtags-shared-services-service/src/main/resources/META-INF/spring/osgi-context.xml
new file mode 100644
index 0000000..a4b7392
--- /dev/null
+++ b/shared-services/formtags-shared-services-service/src/main/resources/META-INF/spring/osgi-context.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans
+ xmlns="http://www.springframework.org/schema/osgi"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:beans="http://www.springframework.org/schema/beans"
+ xsi:schemaLocation="http://www.springframework.org/schema/osgi
+ http://www.springframework.org/schema/osgi/spring-osgi.xsd
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+ <service ref="userManager" interface="org.springframework.showcase.formtags.service.UserManager" />
+
+</beans:beans>
\ No newline at end of file
diff --git a/shared-services/formtags-shared-services-war/.classpath b/shared-services/formtags-shared-services-war/.classpath
new file mode 100644
index 0000000..58d433f
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources"/>
+ <classpathentry kind="con" path="com.springsource.server.ide.jdt.core.MANIFEST_CLASSPATH_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
+ <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
+ <classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.springsource.server.ide.server.core.runtime.classpath/SpringSource dm Server (Runtime) v2.0"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/JVM 1.6.0"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/shared-services/formtags-shared-services-war/.project b/shared-services/formtags-shared-services-war/.project
new file mode 100644
index 0000000..afbe4ef
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/.project
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>formtags-shared-services-war</name>
+ <comment></comment>
+ <projects>
+ <project>formtags-shared-services-service</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.validation.validationbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.springframework.ide.eclipse.core.springbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.springsource.server.ide.facet.core.bundlenature</nature>
+ <nature>org.springframework.ide.eclipse.core.springnature</nature>
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+ <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+ <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+ </natures>
+</projectDescription>
diff --git a/shared-services/formtags-shared-services-war/.settings/.jsdtscope b/shared-services/formtags-shared-services-war/.settings/.jsdtscope
new file mode 100644
index 0000000..8fbc6ca
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/.settings/.jsdtscope
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject"/>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
+ <classpathentry kind="output" path=""/>
+</classpath>
diff --git a/shared-services/formtags-shared-services-war/.settings/org.eclipse.jdt.core.prefs b/shared-services/formtags-shared-services-war/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..cb7f697
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Thu May 22 10:16:08 BST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/shared-services/formtags-shared-services-war/.settings/org.eclipse.jst.common.project.facet.core.prefs b/shared-services/formtags-shared-services-war/.settings/org.eclipse.jst.common.project.facet.core.prefs
new file mode 100644
index 0000000..50d7f87
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/.settings/org.eclipse.jst.common.project.facet.core.prefs
@@ -0,0 +1,4 @@
+#Thu Jun 11 16:55:56 BST 2009
+classpath.helper/org.eclipse.jdt.launching.JRE_CONTAINER\:\:org.eclipse.jdt.internal.launching.macosx.MacOSXType\:\:JVM\ 1.6.0/owners=jst.java\:5.0
+classpath.helper/org.eclipse.jst.server.core.container\:\:com.springsource.server.ide.server.core.runtime.classpath\:\:SpringSource\ dm\ Server\ (Runtime)\ v2.0/owners=jst.web\:2.4
+eclipse.preferences.version=1
diff --git a/shared-services/formtags-shared-services-war/.settings/org.eclipse.wst.common.component b/shared-services/formtags-shared-services-war/.settings/org.eclipse.wst.common.component
new file mode 100644
index 0000000..e508df3
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-modules id="moduleCoreId" project-version="1.5.0">
+ <wb-module deploy-name="formtags-shared-services-war">
+ <wb-resource deploy-path="/" source-path="/src/main/webapp" />
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java" />
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources" />
+ <property name="java-output-path" value="build/classes" />
+ <property name="context-root" value="formtags-shared-services-war" />
+ </wb-module>
+</project-modules>
\ No newline at end of file
diff --git a/shared-services/formtags-shared-services-war/.settings/org.eclipse.wst.common.project.facet.core.xml b/shared-services/formtags-shared-services-war/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..8899e70
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <runtime name="SpringSource dm Server (Runtime) v2.0"/>
+ <fixed facet="jst.java"/>
+ <fixed facet="jst.web"/>
+ <installed facet="jst.java" version="5.0"/>
+ <installed facet="jst.web" version="2.4"/>
+ <installed facet="com.springsource.server.bundle" version="1.0"/>
+</faceted-project>
diff --git a/shared-services/formtags-shared-services-war/.settings/org.eclipse.wst.jsdt.ui.superType.container b/shared-services/formtags-shared-services-war/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 0000000..3bd5d0a
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/shared-services/formtags-shared-services-war/.settings/org.eclipse.wst.jsdt.ui.superType.name b/shared-services/formtags-shared-services-war/.settings/org.eclipse.wst.jsdt.ui.superType.name
new file mode 100644
index 0000000..05bd71b
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/.settings/org.eclipse.wst.jsdt.ui.superType.name
@@ -0,0 +1 @@
+Window
\ No newline at end of file
diff --git a/shared-services/formtags-shared-services-war/.springBeans b/shared-services/formtags-shared-services-war/.springBeans
new file mode 100644
index 0000000..3949aa3
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+ <version>1</version>
+ <pluginVersion><![CDATA[2.0.5.v200805202005]]></pluginVersion>
+ <configSuffixes>
+ <configSuffix><![CDATA[xml]]></configSuffix>
+ </configSuffixes>
+ <enableImports><![CDATA[false]]></enableImports>
+ <configs>
+ </configs>
+ <configSets>
+ </configSets>
+</beansProjectDescription>
diff --git a/shared-services/formtags-shared-services-war/build.xml b/shared-services/formtags-shared-services-war/build.xml
new file mode 100644
index 0000000..167776c
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/build.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="formtags-shared-services-war">
+
+ <property file="${basedir}/../../build.properties" />
+ <property file="${basedir}/../../build.versions" />
+ <import file="${basedir}/../../build-formtags/package-bundle.xml" />
+ <import file="${basedir}/../../virgo-build/war/default.xml" />
+
+</project>
diff --git a/shared-services/formtags-shared-services-war/ivy.xml b/shared-services/formtags-shared-services-war/ivy.xml
new file mode 100644
index 0000000..245358f
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/ivy.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="http://ivyrep.jayasoft.org/ivy-doc.xsl"?>
+<ivy-module
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://incubator.apache.org/ivy/schemas/ivy.xsd"
+ version="1.3">
+
+ <info organisation="org.eclipse.virgo.samples" module="${ant.project.name}" />
+
+ <configurations>
+ <include file="${virgo.build.dir}/common/default-ivy-configurations.xml"/>
+ </configurations>
+
+ <publications>
+ <artifact name="${ant.project.name}" type="war" ext="war"/>
+ <artifact name="${ant.project.name}-sources" type="src" ext="jar"/>
+ </publications>
+
+ <dependencies>
+ <dependency org="org.eclipse.virgo.samples" name="formtags-shared-services-service" rev="latest.integration" conf="provided->compile"/>
+
+ <dependency org="org.springframework" name="org.springframework.spring-library" rev="${org.springframework.spring}" conf="provided->compile"/>
+ <dependency org="javax.servlet" name="com.springsource.javax.servlet" rev="2.5.0" conf="provided->compile"/>
+ <dependency org="org.apache.taglibs" name="com.springsource.org.apache.taglibs.standard" rev="1.1.2" conf="provided->compile"/>
+ </dependencies>
+
+</ivy-module>
diff --git a/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/validation/CountryValidator.java b/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/validation/CountryValidator.java
new file mode 100644
index 0000000..c4a591c
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/validation/CountryValidator.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.validation;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.util.StringUtils;
+
+import org.springframework.validation.Errors;
+
+import org.springframework.validation.Validator;
+
+
+
+/**
+
+ * Simple {@link Validator} implementation for {@link Country} instances.
+
+ *
+
+
+ */
+
+public class CountryValidator implements Validator {
+
+
+
+
+
+ public static final String DEFAULT_BAD_PLACEHOLDER_CODE = "-";
+
+
+
+
+
+ private String badPlaceholderCode = DEFAULT_BAD_PLACEHOLDER_CODE;
+
+
+
+
+
+ public void setBadPlaceholderCode(String badPlaceholderCode) {
+
+ this.badPlaceholderCode = StringUtils.hasText(badPlaceholderCode)
+
+ ? badPlaceholderCode : DEFAULT_BAD_PLACEHOLDER_CODE;
+
+ }
+
+
+
+
+
+ public boolean supports(Class candidate) {
+
+ return Country.class.isAssignableFrom(candidate);
+
+ }
+
+
+
+ public void validate(Object object, Errors errors) {
+
+ Country country = (Country) object;
+
+ if (country.getCode() == this.badPlaceholderCode) {
+
+ errors.rejectValue("bad.country.selected", "Please select a valid country");
+
+ }
+
+ }
+
+
+
+}
+
diff --git a/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/validation/UserValidator.java b/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/validation/UserValidator.java
new file mode 100644
index 0000000..88e8aad
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/validation/UserValidator.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.validation;
+
+
+
+import org.springframework.showcase.formtags.domain.User;
+
+import org.springframework.validation.Errors;
+
+import org.springframework.validation.ValidationUtils;
+
+import org.springframework.validation.Validator;
+
+
+
+/**
+
+ * Simple {@link Validator} implementation for {@link User} instances.
+
+ *
+
+
+ */
+
+public class UserValidator implements Validator {
+
+
+
+ public boolean supports(Class candidate) {
+
+ return User.class.isAssignableFrom(candidate);
+
+ }
+
+
+
+ public void validate(Object obj, Errors errors) {
+
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "required", "Field is required.");
+
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "required", "Field is required.");
+
+ }
+
+
+
+}
+
diff --git a/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/web/CountryEditor.java b/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/web/CountryEditor.java
new file mode 100644
index 0000000..6c098e1
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/web/CountryEditor.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.web;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.service.UserManager;
+
+
+
+import java.beans.PropertyEditorSupport;
+
+
+
+/**
+
+ * Simple {@link java.beans.PropertyEditor} for the {@link org.springframework.showcase.formtags.domain.Country} class.
+
+ *
+
+
+ */
+
+public class CountryEditor extends PropertyEditorSupport {
+
+
+
+ private UserManager userManager;
+
+
+
+
+
+ /**
+
+ * Creates a new instance of the {@link org.springframework.showcase.formtags.web.CountryEditor} class.
+
+ *
+
+ * @param userManager the service object that is to be used to resolve country codes
+
+ */
+
+ public CountryEditor(UserManager userManager) {
+
+ this.userManager = userManager;
+
+ }
+
+
+
+
+
+ public void setAsText(String text) throws IllegalArgumentException {
+
+ setValue(this.userManager.findCountry(text));
+
+ }
+
+
+
+ public String getAsText() {
+
+ if (getValue() == null) {
+
+ return "";
+
+ }
+
+ return ((Country) getValue()).getCode();
+
+ }
+
+
+
+}
+
diff --git a/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/web/FormController.java b/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/web/FormController.java
new file mode 100644
index 0000000..70a82f0
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/web/FormController.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.web;
+
+
+
+import org.springframework.core.enums.StaticLabeledEnumResolver;
+
+import org.springframework.showcase.formtags.domain.Colour;
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.domain.User;
+
+import org.springframework.showcase.formtags.service.UserManager;
+
+import org.springframework.ui.ModelMap;
+
+import org.springframework.validation.Errors;
+
+import org.springframework.web.bind.ServletRequestDataBinder;
+
+import org.springframework.web.bind.ServletRequestUtils;
+
+import org.springframework.web.servlet.mvc.SimpleFormController;
+
+
+
+import javax.servlet.http.HttpServletRequest;
+
+import java.beans.PropertyEditorSupport;
+
+import java.util.Map;
+
+
+
+/**
+
+ * The central form controller for this showcase application.
+
+ *
+
+
+ */
+
+public class FormController extends SimpleFormController {
+
+
+
+ private UserManager userManager;
+
+
+
+
+
+ /**
+
+ * Sets the {@link UserManager} to which this presentation component
+
+ * delegates in order to perform complex business logic.
+
+ * @param userManager the {@link UserManager} to which this presentation
+
+ * component delegatesin order to perform complex business logic
+
+ */
+
+ public void setUserManager(UserManager userManager) {
+
+ this.userManager = userManager;
+
+ }
+
+
+
+
+
+ protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
+
+ binder.registerCustomEditor(Country.class, new CountryEditor(this.userManager));
+
+ binder.registerCustomEditor(Colour.class, new PropertyEditorSupport() {
+
+ public void setAsText(String string) throws IllegalArgumentException {
+
+ Short code = new Short(string);
+
+ StaticLabeledEnumResolver resolver = new StaticLabeledEnumResolver();
+
+ setValue(resolver.getLabeledEnumByCode(Colour.class, code));
+
+ }
+
+ });
+
+ }
+
+
+
+ protected Map referenceData(HttpServletRequest request, Object command, Errors errors) throws Exception {
+
+ return new ModelMap(this.userManager.findAllCountries())
+
+ .addObject("skills", getSkills())
+
+ .addObject(this.userManager.findAll());
+
+ }
+
+
+
+ protected Object formBackingObject(HttpServletRequest request) throws Exception {
+
+ int id = ServletRequestUtils.getRequiredIntParameter(request, "id");
+
+ return this.userManager.findById(new Integer(id));
+
+ }
+
+
+
+ protected void doSubmitAction(Object managedResource) throws Exception {
+
+ this.userManager.save((User) managedResource);
+
+ }
+
+
+
+
+
+ private String[] getSkills() {
+
+ return new String[]{
+
+ "Potions",
+
+ "Herbology",
+
+ "Quidditch"
+
+ };
+
+ }
+
+
+
+}
+
diff --git a/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/web/ListController.java b/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/web/ListController.java
new file mode 100644
index 0000000..140d362
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/java/org/springframework/showcase/formtags/web/ListController.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.web;
+
+
+
+import org.springframework.showcase.formtags.service.UserManager;
+
+
+
+import javax.servlet.http.HttpServletRequest;
+
+import javax.servlet.http.HttpServletResponse;
+
+
+
+import org.springframework.web.servlet.ModelAndView;
+
+import org.springframework.web.servlet.mvc.AbstractController;
+
+
+
+/**
+
+ * Simple {@link org.springframework.web.servlet.mvc.Controller} implementation
+
+ * that pretty much locates (and thus allows a {@link org.springframework.web.servlet.View}
+
+ * to render a list) of all of the {@link org.springframework.showcase.formtags.domain.User Users}
+
+ * in the application.
+
+ *
+
+
+ */
+
+public class ListController extends AbstractController {
+
+
+
+
+
+ private UserManager userManager;
+
+ private String viewName;
+
+
+
+ public void setViewName(String viewName) {
+
+ this.viewName = viewName;
+
+ }
+
+
+
+ /**
+
+ * Sets the {@link UserManager} that to which this presentation component delegates
+
+ * in order to perform complex business logic.
+
+ *
+
+ * @param userManager the {@link UserManager} that to which this presentation component delegates
+
+ * in order to perform complex business logic
+
+ */
+
+ public void setUserManager(UserManager userManager) {
+
+ this.userManager = userManager;
+
+ }
+
+
+
+
+
+ protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ return new ModelAndView(viewName).addObject(this.userManager.findAll());
+
+ }
+
+
+
+}
+
diff --git a/shared-services/formtags-shared-services-war/src/main/resources/i18n.properties b/shared-services/formtags-shared-services-war/src/main/resources/i18n.properties
new file mode 100644
index 0000000..fa1de17
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/resources/i18n.properties
@@ -0,0 +1 @@
+form.title=Spring 2.0 form tag showcase application
\ No newline at end of file
diff --git a/shared-services/formtags-shared-services-war/src/main/resources/i18n_en_GB.properties b/shared-services/formtags-shared-services-war/src/main/resources/i18n_en_GB.properties
new file mode 100644
index 0000000..d597e96
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/resources/i18n_en_GB.properties
@@ -0,0 +1 @@
+form.title=Spring 2.0 form tag showcase application (Lovely Jubbly!)
\ No newline at end of file
diff --git a/shared-services/formtags-shared-services-war/src/main/webapp/META-INF/MANIFEST.MF b/shared-services/formtags-shared-services-war/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9287ba7
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: FormTags Shared Services WAR
+Bundle-SymbolicName: org.springframework.showcase.formtags.web_shared_services
+Bundle-Version: 2.0.1
+Import-Package: javax.servlet.http,
+ org.springframework.showcase.formtags.domain,
+ org.springframework.showcase.formtags.service,
+ org.eclipse.virgo.web.dm;version="[1.0,2.2)",
+ javax.servlet.jsp.jstl.core;version="[1.1.2,1.2.0)"
+Import-Library: org.springframework.spring;version="[2.5.6.A,4.0.0)"
+Import-Bundle: com.springsource.org.apache.taglibs.standard;version="1.1.2"
+
diff --git a/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/applicationContext.xml b/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/applicationContext.xml
new file mode 100644
index 0000000..da193ea
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/applicationContext.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+ <reference id="userManager" interface="org.springframework.showcase.formtags.service.UserManager" />
+
+</beans:beans>
\ No newline at end of file
diff --git a/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/formtags-servlet.xml b/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/formtags-servlet.xml
new file mode 100644
index 0000000..6ce5a48
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/formtags-servlet.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
+ "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
+<beans>
+
+ <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+ <property name="prefix" value="/WEB-INF/jsp/"/>
+ <property name="suffix" value=".jsp"/>
+ </bean>
+
+ <bean name="/list.htm" class="org.springframework.showcase.formtags.web.ListController">
+ <property name="userManager" ref="userManager"/>
+ </bean>
+
+ <bean name="/form.htm" class="org.springframework.showcase.formtags.web.FormController">
+ <property name="formView" value="form"/>
+ <property name="successView" value="redirect:list.htm"/>
+ <property name="userManager" ref="userManager"/>
+ <property name="validators">
+ <bean id="userValidator" class="org.springframework.showcase.formtags.validation.UserValidator"/>
+ </property>
+ </bean>
+
+ <bean name="/about.htm" class="org.springframework.showcase.formtags.web.ListController">
+ <property name="userManager" ref="userManager"/>
+ <property name="viewName" value="about"/>
+ </bean>
+
+ <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
+ <property name="basename" value="i18n"/>
+ </bean>
+
+</beans>
diff --git a/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/jsp/about.jsp b/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/jsp/about.jsp
new file mode 100644
index 0000000..69bb766
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/jsp/about.jsp
@@ -0,0 +1,61 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title>Virgo Server, form tags showcase application</title>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+ <link rel="icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link rel="shortcut icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+
+ <link href="<c:url value="/css/style.css"/>" rel="stylesheet" type="text/css"/>
+
+ </head>
+
+<body>
+ <div id="main">
+
+ <div id="topmenu">
+ <a href="http://www.eclipse.org/virgo/">Virgo</a><a href="http://www.eclipse.org/forums/index.php?t=thread&frm_id=159">Virgo Forums</a><a href="http://forum.springframework.org">Spring forum</a><a href="http://www.dzone.com">Dzone.com</a><a href="http://www.infoq.com">Infoq.com</a>
+ </div>
+
+ <div id="header">
+ <span class="title">Virgo Server<span class="darktitle">2.0</span> form tags</span><br/>
+ </div>
+
+
+ <div id="content">
+ <div id="block">
+ <p>
+The Spring MVC form tags application showcases the new form
+tag library introduced in Spring 2.0.</p>
+
+<p>The web application is *very* simplistic, because the intent is
+to convey the essence of the new form tags themselves and nothing
+else.</p>
+
+ </div>
+
+ </div>
+
+ <div class="lefty">
+ <div class="menu">
+ <c:forEach items="${userList}" var="user">
+ <a href="form.htm?id=<c:out value="${user.id}"/>"><c:out value="${user.lastName}"/>, <c:out value="${user.firstName}"/></a>
+ </c:forEach>
+
+ </div>
+ <p>New JSP tags in Spring 2.0 make building forms with Spring MVC much easier</p>
+ <div class="menu">
+ <a href="<c:url value="/list.htm"/>">Home</a>
+ </div>
+ </div>
+
+</div>
+
+</body>
+</html>
diff --git a/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/jsp/form.jsp b/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/jsp/form.jsp
new file mode 100644
index 0000000..7b67053
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/jsp/form.jsp
@@ -0,0 +1,229 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
+<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title><spring:message code="form.title"/></title>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+ <link rel="icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link rel="shortcut icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link href="<c:url value="/css/style.css"/>" rel="stylesheet" type="text/css"/>
+ </head>
+
+<body>
+ <div id="main">
+
+ <div id="topmenu">
+ <a href="http://www.eclipse.org/virgo/">Virgo</a><a href="http://www.eclipse.org/forums/index.php?t=thread&frm_id=159">Virgo Forums</a><a href="http://forum.springframework.org">Spring forum</a><a href="http://www.dzone.com">Dzone.com</a><a href="http://www.infoq.com">Infoq.com</a>
+ </div>
+
+ <div id="header">
+ <span class="title">Virgo Server <span class="darktitle">2.0</span> form tags</span><br/>
+ </div>
+
+ <div id="content">
+
+ <h1>Edit apprentice magician <c:out value="${command.firstName}"/> <c:out value="${command.lastName}" /></h1>
+ <form:form>
+ <form:errors path="*" cssClass="errorBox" />
+
+ <div class="first">
+ <form:label path="firstName">First Name:</form:label>
+ <form:input path="firstName" />
+ <form:errors path="firstName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="lastName">Last Name:</form:label>
+ <form:input path="lastName" disabled="true" />
+ <form:errors path="lastName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="country">Country:</form:label>
+ <form:select path="country">
+ <form:option value="" label="--Please Select"/>
+ <form:options items="${countryList}" itemValue="code" itemLabel="name"/>
+ </form:select>
+ <form:errors path="country" cssClass="error"/>
+ </div>
+
+ <div>
+ <form:label path="skills">Skills:</form:label>
+ <form:select path="skills" items="${skills}"/>
+ </div>
+
+ <div>
+ <form:label path="notes">Notes:</form:label>
+ <form:textarea path="notes" readonly="true" rows="3" cols="20" />
+ <form:errors path="notes" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="sex">Sex:</form:label>
+ Male: <form:radiobutton path="sex" value="M"/>
+ Female: <form:radiobutton path="sex" value="F"/>
+ </div>
+
+ <div>
+ <form:label path="house">House:</form:label>
+ <form:select path="house">
+ <form:option value="Gryffindor"/>
+ <form:option value="Hufflepuff"/>
+ <form:option value="Ravenclaw" disabled="true"/>
+ <form:option value="Slytherin"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="preferences.receiveNewsletter">Subscribe to newsletter?:</form:label>
+ <form:checkbox path="preferences.receiveNewsletter"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.interests">Interests:</form:label>
+ <span>Quidditch:</span> <form:checkbox path="preferences.interests" value="Quidditch"/><br/>
+ <span>Herbology:</span> <form:checkbox path="preferences.interests" value="Herbology"/><br/>
+ <span>Defence Against the Dark Arts:</span> <form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.favouriteWord">Favourite Word:</form:label>
+ <span>Magic:</span> <form:checkbox path="preferences.favouriteWord" value="Magic"/>
+ </div>
+
+ <div>
+ <form:label path="favouriteColour">Favourite Colour:</form:label>
+ <form:select path="favouriteColour">
+ <form:option value="0" label="RED"/>
+ <form:option value="1" label="GREEN"/>
+ <form:option value="2" label="BLUE"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="password">Password:</form:label>
+ <form:password path="password" showPassword="true" />
+ </div>
+
+ <div>
+ <input type="submit" value="Save Changes" />
+ </div>
+ </form:form>
+
+ <br/>
+
+ <h1>The JSP form tags:</h1>
+ <textarea rows="10" cols="55" class="showjspcode">
+<form:form>
+ <form:errors path="*" cssClass="errorBox" />
+
+ <div class="first">
+ <form:label path="firstName">First Name:</form:label>
+ <form:input path="firstName" />
+ <form:errors path="firstName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="lastName">Last Name:</form:label>
+ <form:input path="lastName" disabled="true" />
+ <form:errors path="lastName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="country">Country:</form:label>
+ <form:select path="country">
+ <form:option value="" label="--Please Select"/>
+ <form:options items="${countryList}" itemValue="code" itemLabel="name"/>
+ </form:select>
+ <form:errors path="country" cssClass="error"/>
+ </div>
+
+ <div>
+ <form:label path="skills">Skills:</form:label>
+ <form:select path="skills" items="${skills}"/>
+ </div>
+
+ <div>
+ <form:label path="notes">Notes:</form:label>
+ <form:textarea path="notes" readonly="true" rows="3" cols="20" />
+ <form:errors path="notes" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="sex">Sex:</form:label>
+ Male: <form:radiobutton path="sex" value="M"/>
+ Female: <form:radiobutton path="sex" value="F"/>
+ </div>
+
+ <div>
+ <form:label path="house">House:</form:label>
+ <form:select path="house">
+ <form:option value="Gryffindor"/>
+ <form:option value="Hufflepuff"/>
+ <form:option value="Ravenclaw"/>
+ <form:option value="Slytherin"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="preferences.receiveNewsletter">Subscribe to newsletter?:</form:label>
+ <form:checkbox path="preferences.receiveNewsletter"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.interests">Interests:</form:label>
+ <span>Quidditch:</span> <form:checkbox path="preferences.interests" value="Quidditch"/><br/>
+ <span>Herbology:</span> <form:checkbox path="preferences.interests" value="Herbology"/><br/>
+ <span>Defence Against the Dark Arts:</span> <form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.favouriteWord">Favourite Word:</form:label>
+ <span>Magic:</span> <form:checkbox path="preferences.favouriteWord" value="Magic"/>
+ </div>
+
+ <div>
+ <form:label path="favouriteColour">Favourite Colour:</form:label>
+ <form:select path="favouriteColour">
+ <form:option value="0" label="RED"/>
+ <form:option value="1" label="GREEN"/>
+ <form:option value="2" label="BLUE"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="password">Password:</form:label>
+ <form:password path="password" showPassword="true" />
+ </div>
+
+ <div>
+ <input type="submit" value="Save Changes" />
+ </div>
+</form:form>
+ </textarea>
+
+ </div>
+
+ <div class="lefty">
+ <div class="menu">
+ <c:forEach items="${userList}" var="user">
+ <a href="form.htm?id=<c:out value="${user.id}"/>"><c:out value="${user.lastName}"/>, <c:out value="${user.firstName}"/></a>
+ </c:forEach>
+
+ </div>
+ <p>New JSP tags in Spring 2.0 make building forms with Spring MVC much easier.</p>
+ <div class="menu">
+ <a href="<c:url value="/about.htm"/>">About</a>
+ <a href="<c:url value="/list.htm"/>">Home</a>
+ </div>
+ </div>
+
+</div>
+
+</body>
+</html>
diff --git a/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/jsp/list.jsp b/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/jsp/list.jsp
new file mode 100644
index 0000000..f311bcd
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/jsp/list.jsp
@@ -0,0 +1,59 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title>Virgo Server, form tags showcase application</title>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+ <link rel="icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link rel="shortcut icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+
+ <link href="<c:url value="/css/style.css"/>" rel="stylesheet" type="text/css"/>
+
+ </head>
+
+<body>
+ <div id="main">
+
+ <div id="topmenu">
+ <a href="http://www.eclipse.org/virgo/">Virgo</a><a href="http://www.eclipse.org/forums/index.php?t=thread&frm_id=159">Virgo Forums</a><a href="http://forum.springframework.org">Spring forum</a><a href="http://www.dzone.com">Dzone.com</a><a href="http://www.infoq.com">Infoq.com</a>
+ </div>
+
+ <div id="header">
+ <span class="title">Virgo Server<span class="darktitle">2.0</span> form tags</span><br/>
+ </div>
+
+
+ <div id="content">
+ <div id="block">
+ <p>Welcome to this Spring 2.0 showcase application that demonstrates
+ the use of new JSP tags for creating form elements.</p>
+
+ <p>Choose an apprentice magician on the left-hand side to continue.</p>
+
+
+ </div>
+
+ </div>
+
+ <div class="lefty">
+ <div class="menu">
+ <c:forEach items="${userList}" var="user">
+ <a href="form.htm?id=<c:out value="${user.id}"/>"><c:out value="${user.lastName}"/>, <c:out value="${user.firstName}"/></a>
+ </c:forEach>
+
+ </div>
+ <p>New JSP tags in Spring 2.0 make building forms with Spring MVC much easier</p>
+ <div class="menu">
+ <a href="<c:url value="/about.htm"/>">About</a>
+ </div>
+ </div>
+
+</div>
+
+</body>
+</html>
diff --git a/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/web.xml b/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..8f5f497
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+ <context-param>
+ <param-name>contextClass</param-name>
+ <param-value>org.eclipse.virgo.web.dm.ServerOsgiBundleXmlWebApplicationContext</param-value>
+ </context-param>
+
+ <listener>
+ <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+ </listener>
+
+ <servlet>
+ <servlet-name>formtags</servlet-name>
+ <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>formtags</servlet-name>
+ <url-pattern>*.htm</url-pattern>
+ </servlet-mapping>
+
+ <welcome-file-list>
+ <welcome-file>index.jsp</welcome-file>
+ </welcome-file-list>
+
+</web-app>
diff --git a/shared-services/formtags-shared-services-war/src/main/webapp/css/base.css b/shared-services/formtags-shared-services-war/src/main/webapp/css/base.css
new file mode 100644
index 0000000..4cafa80
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/webapp/css/base.css
@@ -0,0 +1,5 @@
+
+.errorBox {
+ border: red solid 1px;
+ background-color: tomato;
+}
diff --git a/shared-services/formtags-shared-services-war/src/main/webapp/css/style.css b/shared-services/formtags-shared-services-war/src/main/webapp/css/style.css
new file mode 100644
index 0000000..3b337a8
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/webapp/css/style.css
@@ -0,0 +1,239 @@
+body
+{
+ margin: 0;
+ margin: 0 auto;
+ background: #f4f4f4 url(images/bg.gif) top center repeat-y;
+}
+#header
+{
+ vertical-align: top;
+ padding-bottom: 11px;
+ padding-left: 18px;
+ font-family: Georgia, Lucida, Arial, sans-serif;
+ font-size: 11px;
+ font-weight: lighter;
+ color: #00008B;
+ border-bottom: 1px solid #efefef;
+}
+.title
+{
+ font-size: 24px;
+ font-style: italic;
+ font-weight: bold;
+ color: #90200A;
+}
+.darktitle
+{
+ font-size: 24px;
+ font-style: italic;
+ font-weight: bold;
+ color: #000000;
+}
+#main
+{
+ width: 780px;
+ height: auto;
+ border-left: 1px solid #efefef;
+ border-right: 1px solid #efefef;
+ margin: 0 auto 0 auto;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 11px;
+ font-weight: normal;
+ color: #A52A2A;
+}
+h1, h2
+{
+ font-size: 12px;
+ font-family: Verdana, Arial, sans-serif;
+ color: #191970;
+ font-weight: bold;
+ padding-left: 4px;
+}
+h3, h4
+{
+ font-size: 11px;
+ font-family: Verdana, Arial, sans-serif;
+ color: #2F4F4F;
+ font-weight: bold;
+ padding-left: 8px;
+}
+.menu
+{
+ width: 150px;
+ color: #00008B;
+ font-family: Verdana, Arial, sans-serif;
+}
+.menu a:link, .menu a:visited
+{
+ width: 150px;
+ margin: 1px 0 1px 0;
+ padding: 4px 3px 4px 8px;
+ background-color: transparent;
+ color: #003366;
+ text-decoration: none;
+ font-family: Verdana, Arial, sans-serif;
+ font-weight: normal;
+ display: block;
+}
+.menu a:hover
+{
+ color: #A52A2A;
+ text-decoration: none;
+}
+#topmenu
+{
+ text-align: right;
+ padding-top: 1em;
+ padding-right: 1em;
+ font-family: Verdana, Arial, sans-serif;
+ font-weight: bold;
+}
+#topmenu a:link, #topmenu a:visited
+{
+ color: #ffffff;
+ text-decoration: none;
+ background-color: #000000;
+ border: 1px solid #666666;
+ padding-top: .3em;
+ padding-bottom: .3em;
+ padding-left: .8em;
+ padding-right: .8em;
+}
+#topmenu a:hover
+{
+ color: #ffffff;
+ background-color: #90200A;
+ border: 1px solid #90200A;
+ text-decoration: none;
+ padding-top: .3em;
+ padding-bottom: .3em;
+ padding-left: .8em;
+ padding-right: .8em;
+}
+#lefty
+{
+ margin: 8px;
+ width: 150px;
+ height: auto;
+ color: #00008B;
+ font-family: Verdana, Arial, sans-serif;
+}
+#lefty p
+{
+ width: 94%;
+ padding: 12px;
+ font-family: Verdana, Arial, sans-serif;
+ background-color: #f9f9f9;
+ color: #607080;
+}
+#block
+{
+ padding: 12px;
+ font-family: Verdana, Arial, sans-serif;
+ background-color: #f9f9f9;
+ color: #607080;
+}
+#breadcrumb
+{
+ text-align: right;
+ color: #999999;
+ padding-bottom: 11px;
+}
+#breadcrumb a:link, #breadcrumb a:visited
+{
+ color: #999999;
+ text-decoration: none;
+}
+#breadcrumb a:hover
+{
+ color: #aaaaaa;
+ text-decoration: none;
+}
+a:link, a:visited
+{
+ color: #003366;
+ border-bottom: 1px solid #efefef;
+ font-family: Verdana, Arial, sans-serif;
+ text-decoration: none;
+}
+a:hover
+{
+ color: #A52A2A;
+ text-decoration: none;
+}
+#content
+{
+ float: right;
+ width: 570px;
+ text-align: left;
+ padding-top: 11px;
+ padding-bottom: 11px;
+ padding-left: 11px;
+ padding-right: 16px;
+ border-left: 1px solid #efefef;
+ font-family: Verdana, Arial, sans-serif;
+ line-height: 145%;
+ color: #607080;
+}
+#content h3, h4
+{
+ font-family: Verdana, Arial, sans-serif;
+ color: #2F4F4F;
+ font-weight: bold;
+ padding-left: 0px;
+}
+#footer
+{
+ text-align: center;
+ padding: 11px;
+ font-family: Verdana, Arial, sans-serif;
+ font-weight: lighter;
+ color: #cccccc;
+}
+hr
+{
+ border:0;
+ border-bottom: 1px solid #efefef;
+ height: 1px;
+}
+li
+{
+ list-style-type: none;
+ line-height: 160%;
+}
+form div label
+{
+ width: 14em;
+ float: left;
+ margin-left: -15em;
+}
+.first {
+ margin-top: 0em;
+ padding-top: 0em;
+ padding-left: 15em;
+ border-top: none;
+}
+form div
+{
+ margin-top: 0.5em;
+ padding-top: 0.5em;
+ padding-left: 15em;
+ border-top: 1px dashed gray;
+}
+form div span
+{
+ width: 20em;
+ float: left;
+}
+form div span.error
+{
+ width: 20em;
+ margin-left: 0.5em;
+ float: none;
+ color: red;
+}
+form span.errorBox
+{
+ color: red;
+}
+
diff --git a/shared-services/formtags-shared-services-war/src/main/webapp/favicon.ico b/shared-services/formtags-shared-services-war/src/main/webapp/favicon.ico
new file mode 100644
index 0000000..7e54ebd
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/webapp/favicon.ico
Binary files differ
diff --git a/shared-services/formtags-shared-services-war/src/main/webapp/index.jsp b/shared-services/formtags-shared-services-war/src/main/webapp/index.jsp
new file mode 100644
index 0000000..92d1b12
--- /dev/null
+++ b/shared-services/formtags-shared-services-war/src/main/webapp/index.jsp
@@ -0,0 +1,5 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
+
+<!-- simply redirects to the main switchboard page of the showcase web application -->
+
+<c:redirect url="/list.htm"/>
\ No newline at end of file
diff --git a/war/README.TXT b/war/README.TXT
new file mode 100644
index 0000000..1e8610e
--- /dev/null
+++ b/war/README.TXT
@@ -0,0 +1,36 @@
+================================================================================
+== Virgo Server - Form Tags - Standard WAR ==
+================================================================================
+
+@author Colin Yates
+@author Sam Brannen
+@author Christopher Frost
+
+--------------------------------------------------------------------------------
+
+This is a copy of the original Spring Form Tags showcase application which has
+been converted into a project format that is consistent with the adjacent
+Form Tags samples. It does not utilize any server-specific features and is a
+standard Java EE WAR which can be deployed to any standard Servlet container.
+
+--------------------------------------------------------------------------------
+
+BUILD AND DEPLOYMENT
+
+1) $> cd formtags-war
+
+2) $> ant jar
+
+3) Copy target/artifacts/formtags-war.war to the SERVER_HOME/pickup directory.
+
+--------------------------------------------------------------------------------
+
+URL: http://localhost:8080/formtags-war
+
+Note: the context path under which the web application is deployed is determined
+ by the file name of the WAR. Thus, if you deploy a distribution JAR named
+ 'formtags-war-2.0.1.RELEASE.war', you will need to use the following URL:
+
+ http://localhost:8080/formtags-war-1.0.0.RELEASE
+
+--------------------------------------------------------------------------------
diff --git a/war/formtags-war/.classpath b/war/formtags-war/.classpath
new file mode 100644
index 0000000..baa95c3
--- /dev/null
+++ b/war/formtags-war/.classpath
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src/main/java"/>
+ <classpathentry kind="src" path="src/main/resources"/>
+ <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
+ <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
+ <classpathentry kind="con" path="org.eclipse.jst.server.core.container/com.springsource.server.ide.server.core.runtime.classpath/SpringSource dm Server (Runtime) v2.0"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.launching.macosx.MacOSXType/JVM 1.6.0"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/war/formtags-war/.project b/war/formtags-war/.project
new file mode 100644
index 0000000..bf927a6
--- /dev/null
+++ b/war/formtags-war/.project
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>formtags-war</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.validation.validationbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.springframework.ide.eclipse.core.springbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.springframework.ide.eclipse.core.springnature</nature>
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+ <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+ <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+ </natures>
+</projectDescription>
diff --git a/war/formtags-war/.settings/.jsdtscope b/war/formtags-war/.settings/.jsdtscope
new file mode 100644
index 0000000..8fbc6ca
--- /dev/null
+++ b/war/formtags-war/.settings/.jsdtscope
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject"/>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
+ <classpathentry kind="output" path=""/>
+</classpath>
diff --git a/war/formtags-war/.settings/org.eclipse.jdt.core.prefs b/war/formtags-war/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..7974218
--- /dev/null
+++ b/war/formtags-war/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Thu May 22 10:41:37 BST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/war/formtags-war/.settings/org.eclipse.jst.common.project.facet.core.prefs b/war/formtags-war/.settings/org.eclipse.jst.common.project.facet.core.prefs
new file mode 100644
index 0000000..afd6530
--- /dev/null
+++ b/war/formtags-war/.settings/org.eclipse.jst.common.project.facet.core.prefs
@@ -0,0 +1,4 @@
+#Thu Jun 11 16:56:02 BST 2009
+classpath.helper/org.eclipse.jdt.launching.JRE_CONTAINER\:\:org.eclipse.jdt.internal.launching.macosx.MacOSXType\:\:JVM\ 1.6.0/owners=jst.java\:5.0
+classpath.helper/org.eclipse.jst.server.core.container\:\:com.springsource.server.ide.server.core.runtime.classpath\:\:SpringSource\ dm\ Server\ (Runtime)\ v2.0/owners=jst.web\:2.5
+eclipse.preferences.version=1
diff --git a/war/formtags-war/.settings/org.eclipse.wst.common.component b/war/formtags-war/.settings/org.eclipse.wst.common.component
new file mode 100644
index 0000000..50eb4af
--- /dev/null
+++ b/war/formtags-war/.settings/org.eclipse.wst.common.component
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project-modules id="moduleCoreId" project-version="1.5.0">
+<wb-module deploy-name="formtags-war">
+<wb-resource deploy-path="/" source-path="/src/main/webapp"/>
+<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
+<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
+<property name="context-root" value="formtags-war"/>
+<property name="java-output-path" value="build/classes"/>
+</wb-module>
+</project-modules>
diff --git a/war/formtags-war/.settings/org.eclipse.wst.common.project.facet.core.xml b/war/formtags-war/.settings/org.eclipse.wst.common.project.facet.core.xml
new file mode 100644
index 0000000..c6dc5ee
--- /dev/null
+++ b/war/formtags-war/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <runtime name="SpringSource dm Server (Runtime) v2.0"/>
+ <fixed facet="jst.web"/>
+ <fixed facet="jst.java"/>
+ <installed facet="jst.java" version="5.0"/>
+ <installed facet="jst.web" version="2.5"/>
+</faceted-project>
diff --git a/war/formtags-war/.settings/org.eclipse.wst.jsdt.ui.superType.container b/war/formtags-war/.settings/org.eclipse.wst.jsdt.ui.superType.container
new file mode 100644
index 0000000..3bd5d0a
--- /dev/null
+++ b/war/formtags-war/.settings/org.eclipse.wst.jsdt.ui.superType.container
@@ -0,0 +1 @@
+org.eclipse.wst.jsdt.launching.baseBrowserLibrary
\ No newline at end of file
diff --git a/war/formtags-war/.settings/org.eclipse.wst.jsdt.ui.superType.name b/war/formtags-war/.settings/org.eclipse.wst.jsdt.ui.superType.name
new file mode 100644
index 0000000..05bd71b
--- /dev/null
+++ b/war/formtags-war/.settings/org.eclipse.wst.jsdt.ui.superType.name
@@ -0,0 +1 @@
+Window
\ No newline at end of file
diff --git a/war/formtags-war/.springBeans b/war/formtags-war/.springBeans
new file mode 100644
index 0000000..3949aa3
--- /dev/null
+++ b/war/formtags-war/.springBeans
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beansProjectDescription>
+ <version>1</version>
+ <pluginVersion><![CDATA[2.0.5.v200805202005]]></pluginVersion>
+ <configSuffixes>
+ <configSuffix><![CDATA[xml]]></configSuffix>
+ </configSuffixes>
+ <enableImports><![CDATA[false]]></enableImports>
+ <configs>
+ </configs>
+ <configSets>
+ </configSets>
+</beansProjectDescription>
diff --git a/war/formtags-war/build.properties b/war/formtags-war/build.properties
new file mode 100644
index 0000000..d9c5710
--- /dev/null
+++ b/war/formtags-war/build.properties
@@ -0,0 +1,19 @@
+target.dir=${basedir}/target
+artifacts.dir=${target.dir}/artifacts
+war.output.file=${war.output.dir}/${ant.project.name}.war
+war.output.dir=${artifacts.dir}
+source-jar.output.file=${source-jar.output.dir}/${ant.project.name}-sources.jar
+source-jar.output.dir=${artifacts.dir}
+war.staging.dir=${target.dir}/war-expanded
+main.webapp.dir=${basedir}/src/main/webapp
+main.java.dir=${basedir}/src/main/java
+war.classes.dir=${war.staging.dir}/WEB-INF/classes
+main.resources.dir=${basedir}/src/main/resources
+source.version=1.5
+target.version=${source.version}
+compile.debug=true
+compile.debug.level=lines,vars,source
+package.dist.dir=${package.output.dir}/dist
+package.war.output.file=${ant.project.name}-${bundle.version}.war
+bundle.version=${version}.${build.stamp}
+build.stamp=BUILD-${timestamp}
\ No newline at end of file
diff --git a/war/formtags-war/build.xml b/war/formtags-war/build.xml
new file mode 100644
index 0000000..6b4afb9
--- /dev/null
+++ b/war/formtags-war/build.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="formtags-war" xmlns:ivy="antlib:org.apache.ivy.ant">
+
+ <property file="${basedir}/../../build.properties"/>
+ <property file="${basedir}/../../build.versions"/>
+ <property file="${basedir}/build.properties"/>
+
+ <tstamp>
+ <format property="timestamp" pattern="yyyyMMddHHmmss" timezone="GMT"/>
+ </tstamp>
+
+ <target name="clean"
+ description="Removes the target directory.">
+ <delete quiet="true" dir="${target.dir}"/>
+ </target>
+
+ <target name="clean-integration"
+ description="Removes the integration repository directory.">
+ <fail message="The 'integration.repo.dir' property must be set on this project.">
+ <condition>
+ <not>
+ <isset property="integration.repo.dir"/>
+ </not>
+ </condition>
+ </fail>
+ <delete quiet="true" dir="${integration.repo.dir}"/>
+ </target>
+
+ <target name="jar"
+ description="Creates a WAR file containing the output of a compilation of the source tree.">
+ <delete quiet="true" file="${war.output.file}"/>
+ <mkdir dir="${war.output.dir}"/>
+ <delete quiet="true" file="${source-jar.output.file}"/>
+ <mkdir dir="${source-jar.output.dir}"/>
+
+ <copy todir="${war.staging.dir}">
+ <fileset dir="${main.webapp.dir}"/>
+ </copy>
+
+ <path id="compile.classpath">
+ <fileset dir="${main.webapp.dir}/WEB-INF/lib"/>
+ </path>
+
+ <delete quiet="true" dir="${war.classes.dir}"/>
+ <mkdir dir="${war.classes.dir}"/>
+ <javac destdir="${war.classes.dir}" source="${source.version}" target="${target.version}"
+ debug="${compile.debug}" debugLevel="${compile.debug.level}">
+ <src path="${main.java.dir}"/>
+ <include name="**/*.java"/>
+ <include name="*.java"/>
+ <classpath refid="compile.classpath"/>
+ </javac>
+ <copy todir="${war.classes.dir}">
+ <fileset dir="${main.java.dir}">
+ <exclude name="**/*.java"/>
+ <exclude name="*.java"/>
+ </fileset>
+ </copy>
+ <copy todir="${war.classes.dir}">
+ <fileset dir="${main.resources.dir}"/>
+ </copy>
+
+ <jar destfile="${war.output.file}" basedir="${war.staging.dir}" index="true" filesetmanifest="merge"/>
+ <jar destfile="${source-jar.output.file}" basedir="${main.java.dir}" index="true"/>
+ </target>
+
+ <target name="package">
+ <mkdir dir="${package.dist.dir}"/>
+ <copy file="${war.output.file}" tofile="${package.dist.dir}/${package.war.output.file}"/>
+ </target>
+
+ <target name="report" description="Does nothing."/>
+
+ <target name="test.do" description="Does nothing."/>
+
+ <target name="clover.do" description="Does nothing."/>
+
+ <target name="findbugs.do" description="Does nothing."/>
+</project>
diff --git a/war/formtags-war/src/main/java/org/springframework/showcase/formtags/domain/Colour.java b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/domain/Colour.java
new file mode 100644
index 0000000..88e715e
--- /dev/null
+++ b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/domain/Colour.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+import org.springframework.core.enums.ShortCodedLabeledEnum;
+
+
+
+/**
+
+ * Simple enumeration for common colors.
+
+ *
+
+
+ */
+
+public class Colour extends ShortCodedLabeledEnum {
+
+
+
+
+
+ public static final Colour RED = new Colour(0, "RED");
+
+ public static final Colour GREEN = new Colour(1, "GREEN");
+
+ public static final Colour BLUE = new Colour(2, "BLUE");
+
+
+
+
+
+ private Colour(int code, String label) {
+
+ super(code, label);
+
+ }
+
+
+
+}
+
diff --git a/war/formtags-war/src/main/java/org/springframework/showcase/formtags/domain/Country.java b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/domain/Country.java
new file mode 100644
index 0000000..caf564c
--- /dev/null
+++ b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/domain/Country.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+/**
+
+ * Models a country.
+
+ *
+
+
+ */
+
+public class Country implements Comparable {
+
+
+
+
+
+ private String code;
+
+ private String name;
+
+
+
+
+
+ /**
+
+ * Creates a new instance of this {@link Country} class.
+
+ */
+
+ public Country() {
+
+ }
+
+
+
+ /**
+
+ * Creates a new instance of this {@link Country} class.
+
+ *
+
+ * @param code the country code
+
+ * @param name the name of the country
+
+ */
+
+ public Country(String code, String name) {
+
+ this.code = code;
+
+ this.name = name;
+
+ }
+
+
+
+
+
+ public String getCode() {
+
+ return code;
+
+ }
+
+
+
+ public String getName() {
+
+ return name;
+
+ }
+
+
+
+
+
+ public int compareTo(Object o) {
+
+ return this.code.compareTo(((Country) o).code);
+
+ }
+
+
+
+}
+
diff --git a/war/formtags-war/src/main/java/org/springframework/showcase/formtags/domain/Preferences.java b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/domain/Preferences.java
new file mode 100644
index 0000000..ab6c627
--- /dev/null
+++ b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/domain/Preferences.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+/**
+
+ * Models a {@link User User's} preferences.
+
+ *
+
+
+ */
+
+public class Preferences {
+
+
+
+
+
+ private boolean receiveNewsletter;
+
+ private String[] interests;
+
+ private String favouriteWord;
+
+
+
+
+
+ public boolean isReceiveNewsletter() {
+
+ return receiveNewsletter;
+
+ }
+
+
+
+ public void setReceiveNewsletter(boolean receiveNewsletter) {
+
+ this.receiveNewsletter = receiveNewsletter;
+
+ }
+
+
+
+ public String[] getInterests() {
+
+ return interests;
+
+ }
+
+
+
+ public void setInterests(String[] interests) {
+
+ this.interests = interests;
+
+ }
+
+
+
+ public String getFavouriteWord() {
+
+ return favouriteWord;
+
+ }
+
+
+
+ public void setFavouriteWord(String favouriteWord) {
+
+ this.favouriteWord = favouriteWord;
+
+ }
+
+
+
+}
+
diff --git a/war/formtags-war/src/main/java/org/springframework/showcase/formtags/domain/User.java b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/domain/User.java
new file mode 100644
index 0000000..925392f
--- /dev/null
+++ b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/domain/User.java
@@ -0,0 +1,268 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.domain;
+
+
+
+import java.util.ArrayList;
+
+import java.util.List;
+
+
+
+/**
+
+ * Models a user.
+
+ *
+
+
+ */
+
+public class User implements Cloneable {
+
+
+
+
+
+ private Integer id;
+
+ private String firstName;
+
+ private String lastName;
+
+ private String notes;
+
+ private String house;
+
+ private Country country = new Country();
+
+ private Colour favouriteColour = Colour.RED;
+
+ private List skills = new ArrayList();
+
+ private char sex;
+
+ private String password;
+
+ private Preferences preferences = new Preferences();
+
+ private String secretWord;
+
+
+
+
+
+ public Integer getId() {
+
+ return id;
+
+ }
+
+
+
+ public void setId(Integer id) {
+
+ this.id = id;
+
+ }
+
+
+
+ public String getFirstName() {
+
+ return firstName;
+
+ }
+
+
+
+ public void setFirstName(String firstName) {
+
+ this.firstName = firstName;
+
+ }
+
+
+
+ public String getLastName() {
+
+ return lastName;
+
+ }
+
+
+
+ public void setLastName(String lastName) {
+
+ this.lastName = lastName;
+
+ }
+
+
+
+ public String getNotes() {
+
+ return notes;
+
+ }
+
+
+
+ public void setNotes(String notes) {
+
+ this.notes = notes;
+
+ }
+
+
+
+ public String getHouse() {
+
+ return house;
+
+ }
+
+
+
+ public void setHouse(String house) {
+
+ this.house = house;
+
+ }
+
+
+
+ public Country getCountry() {
+
+ return country;
+
+ }
+
+
+
+ public void setCountry(Country country) {
+
+ this.country = country;
+
+ }
+
+
+
+ public Colour getFavouriteColour() {
+
+ return favouriteColour;
+
+ }
+
+
+
+ public void setFavouriteColour(Colour favouriteColour) {
+
+ this.favouriteColour = favouriteColour;
+
+ }
+
+
+
+ public char getSex() {
+
+ return sex;
+
+ }
+
+
+
+ public void setSex(char sex) {
+
+ this.sex = sex;
+
+ }
+
+
+
+ public Preferences getPreferences() {
+
+ return preferences;
+
+ }
+
+
+
+ public void setPreferences(Preferences preferences) {
+
+ this.preferences = preferences;
+
+ }
+
+
+
+ public List getSkills() {
+
+ return skills;
+
+ }
+
+
+
+ public void setSkills(List skills) {
+
+ this.skills = skills;
+
+ }
+
+
+
+ public String getPassword() {
+
+ return password;
+
+ }
+
+
+
+ public void setPassword(String password) {
+
+ this.password = password;
+
+ }
+
+
+
+ public String getSecretWord() {
+
+ return secretWord;
+
+ }
+
+
+
+ public void setSecretWord(String secretWord) {
+
+ this.secretWord = secretWord;
+
+ }
+
+
+
+
+
+ public Object clone() throws CloneNotSupportedException {
+
+ return super.clone();
+
+ }
+
+
+
+}
+
diff --git a/war/formtags-war/src/main/java/org/springframework/showcase/formtags/service/StubUserManager.java b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/service/StubUserManager.java
new file mode 100644
index 0000000..b9a321c
--- /dev/null
+++ b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/service/StubUserManager.java
@@ -0,0 +1,266 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.service;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.domain.User;
+
+
+
+import java.util.*;
+
+
+
+/**
+
+ * Stub {@link UserManager} implementation that maintains simple
+
+ * in-memory state for users and countries.
+
+ *
+
+
+ */
+
+public class StubUserManager implements UserManager {
+
+
+
+
+
+ private Map users = new TreeMap();
+
+ private Map countries = new TreeMap();
+
+
+
+
+
+ /**
+
+ * Creates a new instance of the {@link StubUserManager} class.
+
+ */
+
+ public StubUserManager() {
+
+ loadCountries();
+
+ loadUsers();
+
+ }
+
+
+
+
+
+ public void save(User user) {
+
+ // passed in should be a clone - simply replace
+
+ putUser(user);
+
+ }
+
+
+
+ public Collection findAllCountries() {
+
+ return this.countries.values();
+
+ }
+
+
+
+ public Country findCountry(String code) {
+
+ return (Country) this.countries.get(code);
+
+ }
+
+
+
+ public User findById(Integer id) {
+
+ User user = (User) this.users.get(id);
+
+
+
+ if (user != null) {
+
+ return cloneUser(user);
+
+ }
+
+
+
+ return null;
+
+ }
+
+
+
+ public Collection findAll() {
+
+ List userList = new ArrayList();
+
+ Iterator itr = this.users.values().iterator();
+
+ while (itr.hasNext()) {
+
+ User user = (User) itr.next();
+
+ userList.add(cloneUser(user));
+
+ }
+
+ return userList;
+
+ }
+
+
+
+
+
+ private void loadCountries() {
+
+ putCountry(new Country("AT", "Austria"));
+
+ putCountry(new Country("UK", "United Kingdom"));
+
+ putCountry(new Country("US", "United States"));
+
+ }
+
+
+
+ private void loadUsers() {
+
+ User u = new User();
+
+ u.setId(new Integer(1));
+
+ u.setFirstName("Harry");
+
+ u.setLastName("Potter");
+
+ u.setNotes("Promising Wizard...");
+
+ u.setCountry(findCountry("UK"));
+
+ u.setSex('M');
+
+ u.setHouse("Gryffindor");
+
+ u.getPreferences().setReceiveNewsletter(true);
+
+ u.getPreferences().setInterests(new String[]{"Quidditch"});
+
+ u.getPreferences().setFavouriteWord("Magic");
+
+ u.setPassword("password");
+
+
+
+ putUser(u);
+
+
+
+ u = new User();
+
+ u.setId(new Integer(2));
+
+ u.setFirstName("Ronald");
+
+ u.setLastName("Weasly");
+
+ u.setNotes("Friends with Harry Potter.");
+
+ u.setCountry(findCountry("UK"));
+
+ u.setSex('M');
+
+ u.setHouse("Gryffindor");
+
+ u.setPassword("password");
+
+
+
+ putUser(u);
+
+
+
+ u = new User();
+
+ u.setId(new Integer(3));
+
+ u.setFirstName("Hermione");
+
+ u.setLastName("Granger");
+
+ u.setNotes("Friends with Harry Potter.");
+
+ u.setCountry(findCountry("UK"));
+
+ u.setSex('F');
+
+ u.setHouse("Gryffindor");
+
+ u.setPassword("password");
+
+
+
+ putUser(u);
+
+ }
+
+
+
+ private void putUser(User user) {
+
+ this.users.put(user.getId(), user);
+
+ }
+
+
+
+ private void putCountry(Country country) {
+
+ this.countries.put(country.getCode(), country);
+
+ }
+
+
+
+ private User cloneUser(User user) {
+
+ try {
+
+ return (User) user.clone();
+
+ }
+
+ catch (CloneNotSupportedException e) {
+
+ throw new IllegalStateException("Unable to clone user.");
+
+ }
+
+ }
+
+
+
+}
+
diff --git a/war/formtags-war/src/main/java/org/springframework/showcase/formtags/service/UserManager.java b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/service/UserManager.java
new file mode 100644
index 0000000..5bcaa12
--- /dev/null
+++ b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/service/UserManager.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.service;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.domain.User;
+
+
+
+import java.util.Collection;
+
+
+
+/**
+
+ * Central service interface for the application.
+
+ *
+
+
+ */
+
+public interface UserManager {
+
+
+
+ /**
+
+ * Finds all of the {@link User Users} in the system.
+
+ *
+
+ * @return a {@link Collection} of all of the {@link User Users} in the system.
+
+ */
+
+ Collection findAll();
+
+
+
+ /**
+
+ * Finds the specific {@link User} identified by the supplied <code>id</code>.
+
+ *
+
+ * @param id the value uniquely identifying a {@link User}
+
+ * @return the located {@link User} or <code>null</code> if not found
+
+ */
+
+ User findById(Integer id);
+
+
+
+ /**
+
+ * Saves the supplied {@link User} to persistent storage.
+
+ *
+
+ * @param user the {@link User} to be so saved
+
+ */
+
+ void save(User user);
+
+
+
+ /**
+
+ * Finds all of the {@link Country Countries} in the system.
+
+ *
+
+ * @return all of the {@link Country Countries} in the system
+
+ */
+
+ Collection findAllCountries();
+
+
+
+ /**
+
+ * Finds the specific {@link Country} identified by the supplied (country) <code>code</code>.
+
+ *
+
+ * @param code the country code to be used to locate a specific {@link Country}
+
+ * @return the specific {@link Country} identified by the supplied (country) <code>code</code>
+
+ */
+
+ Country findCountry(String code);
+
+}
+
diff --git a/war/formtags-war/src/main/java/org/springframework/showcase/formtags/validation/CountryValidator.java b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/validation/CountryValidator.java
new file mode 100644
index 0000000..c4a591c
--- /dev/null
+++ b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/validation/CountryValidator.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.validation;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.util.StringUtils;
+
+import org.springframework.validation.Errors;
+
+import org.springframework.validation.Validator;
+
+
+
+/**
+
+ * Simple {@link Validator} implementation for {@link Country} instances.
+
+ *
+
+
+ */
+
+public class CountryValidator implements Validator {
+
+
+
+
+
+ public static final String DEFAULT_BAD_PLACEHOLDER_CODE = "-";
+
+
+
+
+
+ private String badPlaceholderCode = DEFAULT_BAD_PLACEHOLDER_CODE;
+
+
+
+
+
+ public void setBadPlaceholderCode(String badPlaceholderCode) {
+
+ this.badPlaceholderCode = StringUtils.hasText(badPlaceholderCode)
+
+ ? badPlaceholderCode : DEFAULT_BAD_PLACEHOLDER_CODE;
+
+ }
+
+
+
+
+
+ public boolean supports(Class candidate) {
+
+ return Country.class.isAssignableFrom(candidate);
+
+ }
+
+
+
+ public void validate(Object object, Errors errors) {
+
+ Country country = (Country) object;
+
+ if (country.getCode() == this.badPlaceholderCode) {
+
+ errors.rejectValue("bad.country.selected", "Please select a valid country");
+
+ }
+
+ }
+
+
+
+}
+
diff --git a/war/formtags-war/src/main/java/org/springframework/showcase/formtags/validation/UserValidator.java b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/validation/UserValidator.java
new file mode 100644
index 0000000..88e8aad
--- /dev/null
+++ b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/validation/UserValidator.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.validation;
+
+
+
+import org.springframework.showcase.formtags.domain.User;
+
+import org.springframework.validation.Errors;
+
+import org.springframework.validation.ValidationUtils;
+
+import org.springframework.validation.Validator;
+
+
+
+/**
+
+ * Simple {@link Validator} implementation for {@link User} instances.
+
+ *
+
+
+ */
+
+public class UserValidator implements Validator {
+
+
+
+ public boolean supports(Class candidate) {
+
+ return User.class.isAssignableFrom(candidate);
+
+ }
+
+
+
+ public void validate(Object obj, Errors errors) {
+
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "required", "Field is required.");
+
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "required", "Field is required.");
+
+ }
+
+
+
+}
+
diff --git a/war/formtags-war/src/main/java/org/springframework/showcase/formtags/web/CountryEditor.java b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/web/CountryEditor.java
new file mode 100644
index 0000000..6c098e1
--- /dev/null
+++ b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/web/CountryEditor.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.web;
+
+
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.service.UserManager;
+
+
+
+import java.beans.PropertyEditorSupport;
+
+
+
+/**
+
+ * Simple {@link java.beans.PropertyEditor} for the {@link org.springframework.showcase.formtags.domain.Country} class.
+
+ *
+
+
+ */
+
+public class CountryEditor extends PropertyEditorSupport {
+
+
+
+ private UserManager userManager;
+
+
+
+
+
+ /**
+
+ * Creates a new instance of the {@link org.springframework.showcase.formtags.web.CountryEditor} class.
+
+ *
+
+ * @param userManager the service object that is to be used to resolve country codes
+
+ */
+
+ public CountryEditor(UserManager userManager) {
+
+ this.userManager = userManager;
+
+ }
+
+
+
+
+
+ public void setAsText(String text) throws IllegalArgumentException {
+
+ setValue(this.userManager.findCountry(text));
+
+ }
+
+
+
+ public String getAsText() {
+
+ if (getValue() == null) {
+
+ return "";
+
+ }
+
+ return ((Country) getValue()).getCode();
+
+ }
+
+
+
+}
+
diff --git a/war/formtags-war/src/main/java/org/springframework/showcase/formtags/web/FormController.java b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/web/FormController.java
new file mode 100644
index 0000000..70a82f0
--- /dev/null
+++ b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/web/FormController.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.web;
+
+
+
+import org.springframework.core.enums.StaticLabeledEnumResolver;
+
+import org.springframework.showcase.formtags.domain.Colour;
+
+import org.springframework.showcase.formtags.domain.Country;
+
+import org.springframework.showcase.formtags.domain.User;
+
+import org.springframework.showcase.formtags.service.UserManager;
+
+import org.springframework.ui.ModelMap;
+
+import org.springframework.validation.Errors;
+
+import org.springframework.web.bind.ServletRequestDataBinder;
+
+import org.springframework.web.bind.ServletRequestUtils;
+
+import org.springframework.web.servlet.mvc.SimpleFormController;
+
+
+
+import javax.servlet.http.HttpServletRequest;
+
+import java.beans.PropertyEditorSupport;
+
+import java.util.Map;
+
+
+
+/**
+
+ * The central form controller for this showcase application.
+
+ *
+
+
+ */
+
+public class FormController extends SimpleFormController {
+
+
+
+ private UserManager userManager;
+
+
+
+
+
+ /**
+
+ * Sets the {@link UserManager} to which this presentation component
+
+ * delegates in order to perform complex business logic.
+
+ * @param userManager the {@link UserManager} to which this presentation
+
+ * component delegatesin order to perform complex business logic
+
+ */
+
+ public void setUserManager(UserManager userManager) {
+
+ this.userManager = userManager;
+
+ }
+
+
+
+
+
+ protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
+
+ binder.registerCustomEditor(Country.class, new CountryEditor(this.userManager));
+
+ binder.registerCustomEditor(Colour.class, new PropertyEditorSupport() {
+
+ public void setAsText(String string) throws IllegalArgumentException {
+
+ Short code = new Short(string);
+
+ StaticLabeledEnumResolver resolver = new StaticLabeledEnumResolver();
+
+ setValue(resolver.getLabeledEnumByCode(Colour.class, code));
+
+ }
+
+ });
+
+ }
+
+
+
+ protected Map referenceData(HttpServletRequest request, Object command, Errors errors) throws Exception {
+
+ return new ModelMap(this.userManager.findAllCountries())
+
+ .addObject("skills", getSkills())
+
+ .addObject(this.userManager.findAll());
+
+ }
+
+
+
+ protected Object formBackingObject(HttpServletRequest request) throws Exception {
+
+ int id = ServletRequestUtils.getRequiredIntParameter(request, "id");
+
+ return this.userManager.findById(new Integer(id));
+
+ }
+
+
+
+ protected void doSubmitAction(Object managedResource) throws Exception {
+
+ this.userManager.save((User) managedResource);
+
+ }
+
+
+
+
+
+ private String[] getSkills() {
+
+ return new String[]{
+
+ "Potions",
+
+ "Herbology",
+
+ "Quidditch"
+
+ };
+
+ }
+
+
+
+}
+
diff --git a/war/formtags-war/src/main/java/org/springframework/showcase/formtags/web/ListController.java b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/web/ListController.java
new file mode 100644
index 0000000..b98d743
--- /dev/null
+++ b/war/formtags-war/src/main/java/org/springframework/showcase/formtags/web/ListController.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.springframework.showcase.formtags.web;
+
+
+
+import org.springframework.showcase.formtags.service.UserManager;
+
+import org.springframework.web.servlet.ModelAndView;
+
+import org.springframework.web.servlet.mvc.AbstractController;
+
+
+
+import javax.servlet.http.HttpServletRequest;
+
+import javax.servlet.http.HttpServletResponse;
+
+
+
+/**
+
+ * Simple {@link org.springframework.web.servlet.mvc.Controller} implementation
+
+ * that pretty much locates (and thus allows a {@link org.springframework.web.servlet.View}
+
+ * to render a list) of all of the {@link org.springframework.showcase.formtags.domain.User Users}
+
+ * in the application.
+
+ *
+
+
+ */
+
+public class ListController extends AbstractController {
+
+
+
+
+
+ private UserManager userManager;
+
+ private String viewName;
+
+
+
+ public void setViewName(String viewName) {
+
+ this.viewName = viewName;
+
+ }
+
+
+
+ /**
+
+ * Sets the {@link UserManager} that to which this presentation component delegates
+
+ * in order to perform complex business logic.
+
+ *
+
+ * @param userManager the {@link UserManager} that to which this presentation component delegates
+
+ * in order to perform complex business logic
+
+ */
+
+ public void setUserManager(UserManager userManager) {
+
+ this.userManager = userManager;
+
+ }
+
+
+
+
+
+ protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ return new ModelAndView(viewName).addObject(this.userManager.findAll());
+
+ }
+
+
+
+}
+
diff --git a/war/formtags-war/src/main/resources/i18n.properties b/war/formtags-war/src/main/resources/i18n.properties
new file mode 100644
index 0000000..fa1de17
--- /dev/null
+++ b/war/formtags-war/src/main/resources/i18n.properties
@@ -0,0 +1 @@
+form.title=Spring 2.0 form tag showcase application
\ No newline at end of file
diff --git a/war/formtags-war/src/main/resources/i18n_en_GB.properties b/war/formtags-war/src/main/resources/i18n_en_GB.properties
new file mode 100644
index 0000000..d597e96
--- /dev/null
+++ b/war/formtags-war/src/main/resources/i18n_en_GB.properties
@@ -0,0 +1 @@
+form.title=Spring 2.0 form tag showcase application (Lovely Jubbly!)
\ No newline at end of file
diff --git a/war/formtags-war/src/main/webapp/META-INF/MANIFEST.MF b/war/formtags-war/src/main/webapp/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c20f14b
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.7.0
+Created-By: 1.5.0_13-119 (Apple Inc.)
+
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/applicationContext.xml b/war/formtags-war/src/main/webapp/WEB-INF/applicationContext.xml
new file mode 100644
index 0000000..6daba4b
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/applicationContext.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
+<beans>
+
+ <bean id="userManager" class="org.springframework.showcase.formtags.service.StubUserManager"/>
+
+</beans>
\ No newline at end of file
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/formtags-servlet.xml b/war/formtags-war/src/main/webapp/WEB-INF/formtags-servlet.xml
new file mode 100644
index 0000000..4e01c91
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/formtags-servlet.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
+<beans>
+
+ <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+ <property name="prefix" value="/WEB-INF/jsp/"/>
+ <property name="suffix" value=".jsp"/>
+ </bean>
+
+ <bean name="/list.htm" class="org.springframework.showcase.formtags.web.ListController">
+ <property name="userManager" ref="userManager"/>
+ </bean>
+
+ <bean name="/form.htm" class="org.springframework.showcase.formtags.web.FormController">
+ <property name="formView" value="form"/>
+ <property name="successView" value="redirect:list.htm"/>
+ <property name="userManager" ref="userManager"/>
+ <property name="validators">
+ <bean id="userValidator" class="org.springframework.showcase.formtags.validation.UserValidator"/>
+ </property>
+ </bean>
+
+ <bean name="/about.htm" class="org.springframework.showcase.formtags.web.ListController">
+ <property name="userManager" ref="userManager"/>
+ <property name="viewName" value="about"/>
+ </bean>
+
+ <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
+ <property name="basename" value="i18n"/>
+ </bean>
+
+</beans>
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/jsp/about.jsp b/war/formtags-war/src/main/webapp/WEB-INF/jsp/about.jsp
new file mode 100644
index 0000000..e9dee68
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/jsp/about.jsp
@@ -0,0 +1,61 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title>Virgo Server, form tags showcase application</title>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+ <link rel="icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link rel="shortcut icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+
+ <link href="<c:url value="/css/style.css"/>" rel="stylesheet" type="text/css"/>
+
+ </head>
+
+<body>
+ <div id="main">
+
+ <div id="topmenu">
+ <a href="http://www.eclipse.org/virgo/">Virgo</a><a href="http://www.eclipse.org/forums/index.php?t=thread&frm_id=159">Virgo Forums</a><a href="http://forum.springframework.org">Spring forum</a><a href="http://www.dzone.com">Dzone.com</a><a href="http://www.infoq.com">Infoq.com</a>
+ </div>
+
+ <div id="header">
+ <span class="title">Virgo Server<span class="darktitle">2.0</span> form tags</span><br/>
+ </div>
+
+
+ <div id="content">
+ <div id="block">
+ <p>
+The Spring MVC form tags application showcases the new form
+tag library introduced in Spring 2.0.</p>
+
+<p>The web application is *very* simplistic, because the intent is
+to convey the essence of the new form tags themselves and nothing
+else.</p>
+
+ </div>
+
+ </div>
+
+ <div class="lefty">
+ <div class="menu">
+ <c:forEach items="${userList}" var="user">
+ <a href="form.htm?id=<c:out value="${user.id}"/>"><c:out value="${user.lastName}"/>, <c:out value="${user.firstName}"/></a>
+ </c:forEach>
+
+ </div>
+ <p>New JSP tags in Spring 2.0 make building forms with Spring MVC much easier</p>
+ <div class="menu">
+ <a href="<c:url value="/list.htm"/>">Home</a>
+ </div>
+ </div>
+
+</div>
+
+</body>
+</html>
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/jsp/form.jsp b/war/formtags-war/src/main/webapp/WEB-INF/jsp/form.jsp
new file mode 100644
index 0000000..eb48441
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/jsp/form.jsp
@@ -0,0 +1,229 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
+<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title><spring:message code="form.title"/></title>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+ <link rel="icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link rel="shortcut icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link href="<c:url value="/css/style.css"/>" rel="stylesheet" type="text/css"/>
+ </head>
+
+<body>
+ <div id="main">
+
+ <div id="topmenu">
+ <a href="http://www.eclipse.org/virgo/">Virgo</a><a href="http://www.eclipse.org/forums/index.php?t=thread&frm_id=159">Virgo Forums</a><a href="http://forum.springframework.org">Spring forum</a><a href="http://www.dzone.com">Dzone.com</a><a href="http://www.infoq.com">Infoq.com</a>
+ </div>
+
+ <div id="header">
+ <span class="title">Virgo Server <span class="darktitle">2.0</span> form tags</span><br/>
+ </div>
+
+ <div id="content">
+
+ <h1>Edit apprentice magician <c:out value="${command.firstName}"/> <c:out value="${command.lastName}" /></h1>
+ <form:form>
+ <form:errors path="*" cssClass="errorBox" />
+
+ <div class="first">
+ <form:label path="firstName">First Name:</form:label>
+ <form:input path="firstName" />
+ <form:errors path="firstName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="lastName">Last Name:</form:label>
+ <form:input path="lastName" disabled="true" />
+ <form:errors path="lastName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="country">Country:</form:label>
+ <form:select path="country">
+ <form:option value="" label="--Please Select"/>
+ <form:options items="${countryList}" itemValue="code" itemLabel="name"/>
+ </form:select>
+ <form:errors path="country" cssClass="error"/>
+ </div>
+
+ <div>
+ <form:label path="skills">Skills:</form:label>
+ <form:select path="skills" items="${skills}"/>
+ </div>
+
+ <div>
+ <form:label path="notes">Notes:</form:label>
+ <form:textarea path="notes" readonly="true" rows="3" cols="20" />
+ <form:errors path="notes" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="sex">Sex:</form:label>
+ Male: <form:radiobutton path="sex" value="M"/>
+ Female: <form:radiobutton path="sex" value="F"/>
+ </div>
+
+ <div>
+ <form:label path="house">House:</form:label>
+ <form:select path="house">
+ <form:option value="Gryffindor"/>
+ <form:option value="Hufflepuff"/>
+ <form:option value="Ravenclaw" disabled="true"/>
+ <form:option value="Slytherin"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="preferences.receiveNewsletter">Subscribe to newsletter?:</form:label>
+ <form:checkbox path="preferences.receiveNewsletter"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.interests">Interests:</form:label>
+ <span>Quidditch:</span> <form:checkbox path="preferences.interests" value="Quidditch"/><br/>
+ <span>Herbology:</span> <form:checkbox path="preferences.interests" value="Herbology"/><br/>
+ <span>Defence Against the Dark Arts:</span> <form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.favouriteWord">Favourite Word:</form:label>
+ <span>Magic:</span> <form:checkbox path="preferences.favouriteWord" value="Magic"/>
+ </div>
+
+ <div>
+ <form:label path="favouriteColour">Favourite Colour:</form:label>
+ <form:select path="favouriteColour">
+ <form:option value="0" label="RED"/>
+ <form:option value="1" label="GREEN"/>
+ <form:option value="2" label="BLUE"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="password">Password:</form:label>
+ <form:password path="password" showPassword="true" />
+ </div>
+
+ <div>
+ <input type="submit" value="Save Changes" />
+ </div>
+ </form:form>
+
+ <br/>
+
+ <h1>The JSP form tags:</h1>
+ <textarea rows="10" cols="55" class="showjspcode">
+<form:form>
+ <form:errors path="*" cssClass="errorBox" />
+
+ <div class="first">
+ <form:label path="firstName">First Name:</form:label>
+ <form:input path="firstName" />
+ <form:errors path="firstName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="lastName">Last Name:</form:label>
+ <form:input path="lastName" disabled="true" />
+ <form:errors path="lastName" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="country">Country:</form:label>
+ <form:select path="country">
+ <form:option value="" label="--Please Select"/>
+ <form:options items="${countryList}" itemValue="code" itemLabel="name"/>
+ </form:select>
+ <form:errors path="country" cssClass="error"/>
+ </div>
+
+ <div>
+ <form:label path="skills">Skills:</form:label>
+ <form:select path="skills" items="${skills}"/>
+ </div>
+
+ <div>
+ <form:label path="notes">Notes:</form:label>
+ <form:textarea path="notes" readonly="true" rows="3" cols="20" />
+ <form:errors path="notes" cssClass="error" />
+ </div>
+
+ <div>
+ <form:label path="sex">Sex:</form:label>
+ Male: <form:radiobutton path="sex" value="M"/>
+ Female: <form:radiobutton path="sex" value="F"/>
+ </div>
+
+ <div>
+ <form:label path="house">House:</form:label>
+ <form:select path="house">
+ <form:option value="Gryffindor"/>
+ <form:option value="Hufflepuff"/>
+ <form:option value="Ravenclaw"/>
+ <form:option value="Slytherin"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="preferences.receiveNewsletter">Subscribe to newsletter?:</form:label>
+ <form:checkbox path="preferences.receiveNewsletter"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.interests">Interests:</form:label>
+ <span>Quidditch:</span> <form:checkbox path="preferences.interests" value="Quidditch"/><br/>
+ <span>Herbology:</span> <form:checkbox path="preferences.interests" value="Herbology"/><br/>
+ <span>Defence Against the Dark Arts:</span> <form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/>
+ </div>
+
+ <div>
+ <form:label path="preferences.favouriteWord">Favourite Word:</form:label>
+ <span>Magic:</span> <form:checkbox path="preferences.favouriteWord" value="Magic"/>
+ </div>
+
+ <div>
+ <form:label path="favouriteColour">Favourite Colour:</form:label>
+ <form:select path="favouriteColour">
+ <form:option value="0" label="RED"/>
+ <form:option value="1" label="GREEN"/>
+ <form:option value="2" label="BLUE"/>
+ </form:select>
+ </div>
+
+ <div>
+ <form:label path="password">Password:</form:label>
+ <form:password path="password" showPassword="true" />
+ </div>
+
+ <div>
+ <input type="submit" value="Save Changes" />
+ </div>
+</form:form>
+ </textarea>
+
+ </div>
+
+ <div class="lefty">
+ <div class="menu">
+ <c:forEach items="${userList}" var="user">
+ <a href="form.htm?id=<c:out value="${user.id}"/>"><c:out value="${user.lastName}"/>, <c:out value="${user.firstName}"/></a>
+ </c:forEach>
+
+ </div>
+ <p>New JSP tags in Spring 2.0 make building forms with Spring MVC much easier.</p>
+ <div class="menu">
+ <a href="<c:url value="/about.htm"/>">About</a>
+ <a href="<c:url value="/list.htm"/>">Home</a>
+ </div>
+ </div>
+
+</div>
+
+</body>
+</html>
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/jsp/list.jsp b/war/formtags-war/src/main/webapp/WEB-INF/jsp/list.jsp
new file mode 100644
index 0000000..f311bcd
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/jsp/list.jsp
@@ -0,0 +1,59 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+ <head>
+ <title>Virgo Server, form tags showcase application</title>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+ <link rel="icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+ <link rel="shortcut icon" href="<c:url value="/favicon.ico"/>" type="image/x-icon" />
+
+ <link href="<c:url value="/css/style.css"/>" rel="stylesheet" type="text/css"/>
+
+ </head>
+
+<body>
+ <div id="main">
+
+ <div id="topmenu">
+ <a href="http://www.eclipse.org/virgo/">Virgo</a><a href="http://www.eclipse.org/forums/index.php?t=thread&frm_id=159">Virgo Forums</a><a href="http://forum.springframework.org">Spring forum</a><a href="http://www.dzone.com">Dzone.com</a><a href="http://www.infoq.com">Infoq.com</a>
+ </div>
+
+ <div id="header">
+ <span class="title">Virgo Server<span class="darktitle">2.0</span> form tags</span><br/>
+ </div>
+
+
+ <div id="content">
+ <div id="block">
+ <p>Welcome to this Spring 2.0 showcase application that demonstrates
+ the use of new JSP tags for creating form elements.</p>
+
+ <p>Choose an apprentice magician on the left-hand side to continue.</p>
+
+
+ </div>
+
+ </div>
+
+ <div class="lefty">
+ <div class="menu">
+ <c:forEach items="${userList}" var="user">
+ <a href="form.htm?id=<c:out value="${user.id}"/>"><c:out value="${user.lastName}"/>, <c:out value="${user.firstName}"/></a>
+ </c:forEach>
+
+ </div>
+ <p>New JSP tags in Spring 2.0 make building forms with Spring MVC much easier</p>
+ <div class="menu">
+ <a href="<c:url value="/about.htm"/>">About</a>
+ </div>
+ </div>
+
+</div>
+
+</body>
+</html>
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/lib/com.springsource.javax.servlet-2.5.0.jar b/war/formtags-war/src/main/webapp/WEB-INF/lib/com.springsource.javax.servlet-2.5.0.jar
new file mode 100644
index 0000000..27d67da
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/lib/com.springsource.javax.servlet-2.5.0.jar
Binary files differ
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/lib/com.springsource.javax.servlet.jsp.jstl-1.1.2.jar b/war/formtags-war/src/main/webapp/WEB-INF/lib/com.springsource.javax.servlet.jsp.jstl-1.1.2.jar
new file mode 100644
index 0000000..aeb37d0
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/lib/com.springsource.javax.servlet.jsp.jstl-1.1.2.jar
Binary files differ
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/lib/com.springsource.org.apache.commons.logging-1.1.1.jar b/war/formtags-war/src/main/webapp/WEB-INF/lib/com.springsource.org.apache.commons.logging-1.1.1.jar
new file mode 100644
index 0000000..f50c78c
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/lib/com.springsource.org.apache.commons.logging-1.1.1.jar
Binary files differ
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/lib/com.springsource.org.apache.taglibs.standard-1.1.2.jar b/war/formtags-war/src/main/webapp/WEB-INF/lib/com.springsource.org.apache.taglibs.standard-1.1.2.jar
new file mode 100644
index 0000000..7c29d1e
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/lib/com.springsource.org.apache.taglibs.standard-1.1.2.jar
Binary files differ
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.asm-3.0.0.RELEASE.jar b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.asm-3.0.0.RELEASE.jar
new file mode 100644
index 0000000..a92d19b
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.asm-3.0.0.RELEASE.jar
Binary files differ
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.beans-3.0.0.RELEASE.jar b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.beans-3.0.0.RELEASE.jar
new file mode 100644
index 0000000..37b9abe
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.beans-3.0.0.RELEASE.jar
Binary files differ
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.context-3.0.0.RELEASE.jar b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.context-3.0.0.RELEASE.jar
new file mode 100644
index 0000000..7869adb
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.context-3.0.0.RELEASE.jar
Binary files differ
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.context.support-3.0.0.RELEASE.jar b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.context.support-3.0.0.RELEASE.jar
new file mode 100644
index 0000000..fdd4dc8
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.context.support-3.0.0.RELEASE.jar
Binary files differ
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.core-3.0.0.RELEASE.jar b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.core-3.0.0.RELEASE.jar
new file mode 100644
index 0000000..8f0134e
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.core-3.0.0.RELEASE.jar
Binary files differ
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.expression-3.0.0.RELEASE.jar b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.expression-3.0.0.RELEASE.jar
new file mode 100644
index 0000000..a34ef90
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.expression-3.0.0.RELEASE.jar
Binary files differ
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.web-3.0.0.RELEASE.jar b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.web-3.0.0.RELEASE.jar
new file mode 100644
index 0000000..928ea03
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.web-3.0.0.RELEASE.jar
Binary files differ
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.web.servlet-3.0.0.RELEASE.jar b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.web.servlet-3.0.0.RELEASE.jar
new file mode 100644
index 0000000..aa75c06
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/lib/org.springframework.web.servlet-3.0.0.RELEASE.jar
Binary files differ
diff --git a/war/formtags-war/src/main/webapp/WEB-INF/web.xml b/war/formtags-war/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..51b3e30
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
+
+ <listener>
+ <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+ </listener>
+
+ <servlet>
+ <servlet-name>formtags</servlet-name>
+ <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>formtags</servlet-name>
+ <url-pattern>*.htm</url-pattern>
+ </servlet-mapping>
+
+ <welcome-file-list>
+ <welcome-file>index.jsp</welcome-file>
+ </welcome-file-list>
+
+</web-app>
diff --git a/war/formtags-war/src/main/webapp/css/base.css b/war/formtags-war/src/main/webapp/css/base.css
new file mode 100644
index 0000000..4cafa80
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/css/base.css
@@ -0,0 +1,5 @@
+
+.errorBox {
+ border: red solid 1px;
+ background-color: tomato;
+}
diff --git a/war/formtags-war/src/main/webapp/css/style.css b/war/formtags-war/src/main/webapp/css/style.css
new file mode 100644
index 0000000..3b337a8
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/css/style.css
@@ -0,0 +1,239 @@
+body
+{
+ margin: 0;
+ margin: 0 auto;
+ background: #f4f4f4 url(images/bg.gif) top center repeat-y;
+}
+#header
+{
+ vertical-align: top;
+ padding-bottom: 11px;
+ padding-left: 18px;
+ font-family: Georgia, Lucida, Arial, sans-serif;
+ font-size: 11px;
+ font-weight: lighter;
+ color: #00008B;
+ border-bottom: 1px solid #efefef;
+}
+.title
+{
+ font-size: 24px;
+ font-style: italic;
+ font-weight: bold;
+ color: #90200A;
+}
+.darktitle
+{
+ font-size: 24px;
+ font-style: italic;
+ font-weight: bold;
+ color: #000000;
+}
+#main
+{
+ width: 780px;
+ height: auto;
+ border-left: 1px solid #efefef;
+ border-right: 1px solid #efefef;
+ margin: 0 auto 0 auto;
+ font-family: Verdana, Arial, sans-serif;
+ font-size: 11px;
+ font-weight: normal;
+ color: #A52A2A;
+}
+h1, h2
+{
+ font-size: 12px;
+ font-family: Verdana, Arial, sans-serif;
+ color: #191970;
+ font-weight: bold;
+ padding-left: 4px;
+}
+h3, h4
+{
+ font-size: 11px;
+ font-family: Verdana, Arial, sans-serif;
+ color: #2F4F4F;
+ font-weight: bold;
+ padding-left: 8px;
+}
+.menu
+{
+ width: 150px;
+ color: #00008B;
+ font-family: Verdana, Arial, sans-serif;
+}
+.menu a:link, .menu a:visited
+{
+ width: 150px;
+ margin: 1px 0 1px 0;
+ padding: 4px 3px 4px 8px;
+ background-color: transparent;
+ color: #003366;
+ text-decoration: none;
+ font-family: Verdana, Arial, sans-serif;
+ font-weight: normal;
+ display: block;
+}
+.menu a:hover
+{
+ color: #A52A2A;
+ text-decoration: none;
+}
+#topmenu
+{
+ text-align: right;
+ padding-top: 1em;
+ padding-right: 1em;
+ font-family: Verdana, Arial, sans-serif;
+ font-weight: bold;
+}
+#topmenu a:link, #topmenu a:visited
+{
+ color: #ffffff;
+ text-decoration: none;
+ background-color: #000000;
+ border: 1px solid #666666;
+ padding-top: .3em;
+ padding-bottom: .3em;
+ padding-left: .8em;
+ padding-right: .8em;
+}
+#topmenu a:hover
+{
+ color: #ffffff;
+ background-color: #90200A;
+ border: 1px solid #90200A;
+ text-decoration: none;
+ padding-top: .3em;
+ padding-bottom: .3em;
+ padding-left: .8em;
+ padding-right: .8em;
+}
+#lefty
+{
+ margin: 8px;
+ width: 150px;
+ height: auto;
+ color: #00008B;
+ font-family: Verdana, Arial, sans-serif;
+}
+#lefty p
+{
+ width: 94%;
+ padding: 12px;
+ font-family: Verdana, Arial, sans-serif;
+ background-color: #f9f9f9;
+ color: #607080;
+}
+#block
+{
+ padding: 12px;
+ font-family: Verdana, Arial, sans-serif;
+ background-color: #f9f9f9;
+ color: #607080;
+}
+#breadcrumb
+{
+ text-align: right;
+ color: #999999;
+ padding-bottom: 11px;
+}
+#breadcrumb a:link, #breadcrumb a:visited
+{
+ color: #999999;
+ text-decoration: none;
+}
+#breadcrumb a:hover
+{
+ color: #aaaaaa;
+ text-decoration: none;
+}
+a:link, a:visited
+{
+ color: #003366;
+ border-bottom: 1px solid #efefef;
+ font-family: Verdana, Arial, sans-serif;
+ text-decoration: none;
+}
+a:hover
+{
+ color: #A52A2A;
+ text-decoration: none;
+}
+#content
+{
+ float: right;
+ width: 570px;
+ text-align: left;
+ padding-top: 11px;
+ padding-bottom: 11px;
+ padding-left: 11px;
+ padding-right: 16px;
+ border-left: 1px solid #efefef;
+ font-family: Verdana, Arial, sans-serif;
+ line-height: 145%;
+ color: #607080;
+}
+#content h3, h4
+{
+ font-family: Verdana, Arial, sans-serif;
+ color: #2F4F4F;
+ font-weight: bold;
+ padding-left: 0px;
+}
+#footer
+{
+ text-align: center;
+ padding: 11px;
+ font-family: Verdana, Arial, sans-serif;
+ font-weight: lighter;
+ color: #cccccc;
+}
+hr
+{
+ border:0;
+ border-bottom: 1px solid #efefef;
+ height: 1px;
+}
+li
+{
+ list-style-type: none;
+ line-height: 160%;
+}
+form div label
+{
+ width: 14em;
+ float: left;
+ margin-left: -15em;
+}
+.first {
+ margin-top: 0em;
+ padding-top: 0em;
+ padding-left: 15em;
+ border-top: none;
+}
+form div
+{
+ margin-top: 0.5em;
+ padding-top: 0.5em;
+ padding-left: 15em;
+ border-top: 1px dashed gray;
+}
+form div span
+{
+ width: 20em;
+ float: left;
+}
+form div span.error
+{
+ width: 20em;
+ margin-left: 0.5em;
+ float: none;
+ color: red;
+}
+form span.errorBox
+{
+ color: red;
+}
+
diff --git a/war/formtags-war/src/main/webapp/favicon.ico b/war/formtags-war/src/main/webapp/favicon.ico
new file mode 100644
index 0000000..7e54ebd
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/favicon.ico
Binary files differ
diff --git a/war/formtags-war/src/main/webapp/index.jsp b/war/formtags-war/src/main/webapp/index.jsp
new file mode 100644
index 0000000..92d1b12
--- /dev/null
+++ b/war/formtags-war/src/main/webapp/index.jsp
@@ -0,0 +1,5 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
+
+<!-- simply redirects to the main switchboard page of the showcase web application -->
+
+<c:redirect url="/list.htm"/>
\ No newline at end of file