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>&lt;<EM>insert current release date here, e.g., June 5, 2007</EM>&gt;</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.&nbsp; 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">

+&lt;form:form&gt;

+   &lt;form:errors path="*" cssClass="errorBox" /&gt;

+

+   &lt;div class="first"&gt;

+	   &lt;form:label path="firstName"&gt;First Name:&lt;/form:label&gt;

+	   &lt;form:input path="firstName" /&gt;

+	   &lt;form:errors path="firstName" cssClass="error" /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="lastName"&gt;Last Name:&lt;/form:label&gt;

+	   &lt;form:input path="lastName" disabled="true" /&gt;

+	   &lt;form:errors path="lastName" cssClass="error"  /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="country"&gt;Country:&lt;/form:label&gt;

+	   &lt;form:select path="country"&gt;

+		   &lt;form:option value="" label="--Please Select"/&gt;

+		   &lt;form:options items="${countryList}" itemValue="code" itemLabel="name"/&gt;

+	   &lt;/form:select&gt;

+	   &lt;form:errors path="country" cssClass="error"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="skills"&gt;Skills:&lt;/form:label&gt;

+		&lt;form:select path="skills" items="${skills}"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="notes"&gt;Notes:&lt;/form:label&gt;

+	   &lt;form:textarea path="notes" readonly="true" rows="3" cols="20" /&gt;

+	   &lt;form:errors path="notes" cssClass="error" /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="sex"&gt;Sex:&lt;/form:label&gt;

+	   Male: &lt;form:radiobutton path="sex" value="M"/&gt;

+	   Female: &lt;form:radiobutton path="sex" value="F"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="house"&gt;House:&lt;/form:label&gt;

+	   &lt;form:select path="house"&gt;

+		   &lt;form:option value="Gryffindor"/&gt;

+		   &lt;form:option value="Hufflepuff"/&gt;

+		   &lt;form:option value="Ravenclaw"/&gt;

+		   &lt;form:option value="Slytherin"/&gt;

+	   &lt;/form:select&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="preferences.receiveNewsletter"&gt;Subscribe to newsletter?:&lt;/form:label&gt;

+	   &lt;form:checkbox path="preferences.receiveNewsletter"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="preferences.interests"&gt;Interests:&lt;/form:label&gt;

+	   &lt;span&gt;Quidditch:&lt;/span&gt; &lt;form:checkbox path="preferences.interests" value="Quidditch"/&gt;&lt;br/&gt;

+	   &lt;span&gt;Herbology:&lt;/span&gt; &lt;form:checkbox path="preferences.interests" value="Herbology"/&gt;&lt;br/&gt;

+	   &lt;span&gt;Defence Against the Dark Arts:&lt;/span&gt; &lt;form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="preferences.favouriteWord"&gt;Favourite Word:&lt;/form:label&gt;

+	   &lt;span&gt;Magic:&lt;/span&gt; &lt;form:checkbox path="preferences.favouriteWord" value="Magic"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="favouriteColour"&gt;Favourite Colour:&lt;/form:label&gt;

+	   &lt;form:select path="favouriteColour"&gt;

+		   &lt;form:option value="0" label="RED"/&gt;

+		   &lt;form:option value="1" label="GREEN"/&gt;

+		   &lt;form:option value="2" label="BLUE"/&gt;

+	   &lt;/form:select&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="password"&gt;Password:&lt;/form:label&gt;

+	   &lt;form:password path="password" showPassword="true" /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;input type="submit" value="Save Changes" /&gt;

+   &lt;/div&gt;

+&lt;/form:form&gt;

+       </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">

+&lt;form:form&gt;

+   &lt;form:errors path="*" cssClass="errorBox" /&gt;

+

+   &lt;div class="first"&gt;

+	   &lt;form:label path="firstName"&gt;First Name:&lt;/form:label&gt;

+	   &lt;form:input path="firstName" /&gt;

+	   &lt;form:errors path="firstName" cssClass="error" /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="lastName"&gt;Last Name:&lt;/form:label&gt;

+	   &lt;form:input path="lastName" disabled="true" /&gt;

+	   &lt;form:errors path="lastName" cssClass="error"  /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="country"&gt;Country:&lt;/form:label&gt;

+	   &lt;form:select path="country"&gt;

+		   &lt;form:option value="" label="--Please Select"/&gt;

+		   &lt;form:options items="${countryList}" itemValue="code" itemLabel="name"/&gt;

+	   &lt;/form:select&gt;

+	   &lt;form:errors path="country" cssClass="error"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="skills"&gt;Skills:&lt;/form:label&gt;

+		&lt;form:select path="skills" items="${skills}"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="notes"&gt;Notes:&lt;/form:label&gt;

+	   &lt;form:textarea path="notes" readonly="true" rows="3" cols="20" /&gt;

+	   &lt;form:errors path="notes" cssClass="error" /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="sex"&gt;Sex:&lt;/form:label&gt;

+	   Male: &lt;form:radiobutton path="sex" value="M"/&gt;

+	   Female: &lt;form:radiobutton path="sex" value="F"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="house"&gt;House:&lt;/form:label&gt;

+	   &lt;form:select path="house"&gt;

+		   &lt;form:option value="Gryffindor"/&gt;

+		   &lt;form:option value="Hufflepuff"/&gt;

+		   &lt;form:option value="Ravenclaw"/&gt;

+		   &lt;form:option value="Slytherin"/&gt;

+	   &lt;/form:select&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="preferences.receiveNewsletter"&gt;Subscribe to newsletter?:&lt;/form:label&gt;

+	   &lt;form:checkbox path="preferences.receiveNewsletter"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="preferences.interests"&gt;Interests:&lt;/form:label&gt;

+	   &lt;span&gt;Quidditch:&lt;/span&gt; &lt;form:checkbox path="preferences.interests" value="Quidditch"/&gt;&lt;br/&gt;

+	   &lt;span&gt;Herbology:&lt;/span&gt; &lt;form:checkbox path="preferences.interests" value="Herbology"/&gt;&lt;br/&gt;

+	   &lt;span&gt;Defence Against the Dark Arts:&lt;/span&gt; &lt;form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="preferences.favouriteWord"&gt;Favourite Word:&lt;/form:label&gt;

+	   &lt;span&gt;Magic:&lt;/span&gt; &lt;form:checkbox path="preferences.favouriteWord" value="Magic"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="favouriteColour"&gt;Favourite Colour:&lt;/form:label&gt;

+	   &lt;form:select path="favouriteColour"&gt;

+		   &lt;form:option value="0" label="RED"/&gt;

+		   &lt;form:option value="1" label="GREEN"/&gt;

+		   &lt;form:option value="2" label="BLUE"/&gt;

+	   &lt;/form:select&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="password"&gt;Password:&lt;/form:label&gt;

+	   &lt;form:password path="password" showPassword="true" /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;input type="submit" value="Save Changes" /&gt;

+   &lt;/div&gt;

+&lt;/form:form&gt;

+       </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">

+&lt;form:form&gt;

+   &lt;form:errors path="*" cssClass="errorBox" /&gt;

+

+   &lt;div class="first"&gt;

+	   &lt;form:label path="firstName"&gt;First Name:&lt;/form:label&gt;

+	   &lt;form:input path="firstName" /&gt;

+	   &lt;form:errors path="firstName" cssClass="error" /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="lastName"&gt;Last Name:&lt;/form:label&gt;

+	   &lt;form:input path="lastName" disabled="true" /&gt;

+	   &lt;form:errors path="lastName" cssClass="error"  /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="country"&gt;Country:&lt;/form:label&gt;

+	   &lt;form:select path="country"&gt;

+		   &lt;form:option value="" label="--Please Select"/&gt;

+		   &lt;form:options items="${countryList}" itemValue="code" itemLabel="name"/&gt;

+	   &lt;/form:select&gt;

+	   &lt;form:errors path="country" cssClass="error"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="skills"&gt;Skills:&lt;/form:label&gt;

+		&lt;form:select path="skills" items="${skills}"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="notes"&gt;Notes:&lt;/form:label&gt;

+	   &lt;form:textarea path="notes" readonly="true" rows="3" cols="20" /&gt;

+	   &lt;form:errors path="notes" cssClass="error" /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="sex"&gt;Sex:&lt;/form:label&gt;

+	   Male: &lt;form:radiobutton path="sex" value="M"/&gt;

+	   Female: &lt;form:radiobutton path="sex" value="F"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="house"&gt;House:&lt;/form:label&gt;

+	   &lt;form:select path="house"&gt;

+		   &lt;form:option value="Gryffindor"/&gt;

+		   &lt;form:option value="Hufflepuff"/&gt;

+		   &lt;form:option value="Ravenclaw"/&gt;

+		   &lt;form:option value="Slytherin"/&gt;

+	   &lt;/form:select&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="preferences.receiveNewsletter"&gt;Subscribe to newsletter?:&lt;/form:label&gt;

+	   &lt;form:checkbox path="preferences.receiveNewsletter"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="preferences.interests"&gt;Interests:&lt;/form:label&gt;

+	   &lt;span&gt;Quidditch:&lt;/span&gt; &lt;form:checkbox path="preferences.interests" value="Quidditch"/&gt;&lt;br/&gt;

+	   &lt;span&gt;Herbology:&lt;/span&gt; &lt;form:checkbox path="preferences.interests" value="Herbology"/&gt;&lt;br/&gt;

+	   &lt;span&gt;Defence Against the Dark Arts:&lt;/span&gt; &lt;form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="preferences.favouriteWord"&gt;Favourite Word:&lt;/form:label&gt;

+	   &lt;span&gt;Magic:&lt;/span&gt; &lt;form:checkbox path="preferences.favouriteWord" value="Magic"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="favouriteColour"&gt;Favourite Colour:&lt;/form:label&gt;

+	   &lt;form:select path="favouriteColour"&gt;

+		   &lt;form:option value="0" label="RED"/&gt;

+		   &lt;form:option value="1" label="GREEN"/&gt;

+		   &lt;form:option value="2" label="BLUE"/&gt;

+	   &lt;/form:select&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="password"&gt;Password:&lt;/form:label&gt;

+	   &lt;form:password path="password" showPassword="true" /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;input type="submit" value="Save Changes" /&gt;

+   &lt;/div&gt;

+&lt;/form:form&gt;

+       </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">

+&lt;form:form&gt;

+   &lt;form:errors path="*" cssClass="errorBox" /&gt;

+

+   &lt;div class="first"&gt;

+	   &lt;form:label path="firstName"&gt;First Name:&lt;/form:label&gt;

+	   &lt;form:input path="firstName" /&gt;

+	   &lt;form:errors path="firstName" cssClass="error" /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="lastName"&gt;Last Name:&lt;/form:label&gt;

+	   &lt;form:input path="lastName" disabled="true" /&gt;

+	   &lt;form:errors path="lastName" cssClass="error"  /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="country"&gt;Country:&lt;/form:label&gt;

+	   &lt;form:select path="country"&gt;

+		   &lt;form:option value="" label="--Please Select"/&gt;

+		   &lt;form:options items="${countryList}" itemValue="code" itemLabel="name"/&gt;

+	   &lt;/form:select&gt;

+	   &lt;form:errors path="country" cssClass="error"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="skills"&gt;Skills:&lt;/form:label&gt;

+		&lt;form:select path="skills" items="${skills}"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="notes"&gt;Notes:&lt;/form:label&gt;

+	   &lt;form:textarea path="notes" readonly="true" rows="3" cols="20" /&gt;

+	   &lt;form:errors path="notes" cssClass="error" /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="sex"&gt;Sex:&lt;/form:label&gt;

+	   Male: &lt;form:radiobutton path="sex" value="M"/&gt;

+	   Female: &lt;form:radiobutton path="sex" value="F"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="house"&gt;House:&lt;/form:label&gt;

+	   &lt;form:select path="house"&gt;

+		   &lt;form:option value="Gryffindor"/&gt;

+		   &lt;form:option value="Hufflepuff"/&gt;

+		   &lt;form:option value="Ravenclaw"/&gt;

+		   &lt;form:option value="Slytherin"/&gt;

+	   &lt;/form:select&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="preferences.receiveNewsletter"&gt;Subscribe to newsletter?:&lt;/form:label&gt;

+	   &lt;form:checkbox path="preferences.receiveNewsletter"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="preferences.interests"&gt;Interests:&lt;/form:label&gt;

+	   &lt;span&gt;Quidditch:&lt;/span&gt; &lt;form:checkbox path="preferences.interests" value="Quidditch"/&gt;&lt;br/&gt;

+	   &lt;span&gt;Herbology:&lt;/span&gt; &lt;form:checkbox path="preferences.interests" value="Herbology"/&gt;&lt;br/&gt;

+	   &lt;span&gt;Defence Against the Dark Arts:&lt;/span&gt; &lt;form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="preferences.favouriteWord"&gt;Favourite Word:&lt;/form:label&gt;

+	   &lt;span&gt;Magic:&lt;/span&gt; &lt;form:checkbox path="preferences.favouriteWord" value="Magic"/&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="favouriteColour"&gt;Favourite Colour:&lt;/form:label&gt;

+	   &lt;form:select path="favouriteColour"&gt;

+		   &lt;form:option value="0" label="RED"/&gt;

+		   &lt;form:option value="1" label="GREEN"/&gt;

+		   &lt;form:option value="2" label="BLUE"/&gt;

+	   &lt;/form:select&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;form:label path="password"&gt;Password:&lt;/form:label&gt;

+	   &lt;form:password path="password" showPassword="true" /&gt;

+   &lt;/div&gt;

+

+   &lt;div&gt;

+	   &lt;input type="submit" value="Save Changes" /&gt;

+   &lt;/div&gt;

+&lt;/form:form&gt;

+       </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