JBoss Tools SVN: r2169 - trunk/tests.
by jbosstools-commits@lists.jboss.org
Author: max.andersen(a)jboss.com
Date: 2007-06-24 12:10:09 -0400 (Sun, 24 Jun 2007)
New Revision: 2169
Removed:
trunk/tests/.project
Log:
remove non project
Deleted: trunk/tests/.project
===================================================================
--- trunk/tests/.project 2007-06-22 23:40:31 UTC (rev 2168)
+++ trunk/tests/.project 2007-06-24 16:10:09 UTC (rev 2169)
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>jbosside-tests</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- </buildSpec>
- <natures>
- </natures>
-</projectDescription>
17 years, 6 months
JBoss Tools SVN: r2168 - trunk/core/plugins/org.jboss.ide.eclipse.archives.ui.
by jbosstools-commits@lists.jboss.org
Author: rob.stryker(a)jboss.com
Date: 2007-06-22 19:40:31 -0400 (Fri, 22 Jun 2007)
New Revision: 2168
Modified:
trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/build.properties
Log:
src should've been src/main
Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/build.properties
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/build.properties 2007-06-22 22:56:07 UTC (rev 2167)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.ui/build.properties 2007-06-22 23:40:31 UTC (rev 2168)
@@ -1,5 +1,7 @@
-source.. = src/
+source.. = src/main/
output.. = bin/
bin.includes = META-INF/,\
.,\
- plugin.xml
+ plugin.xml,\
+ icons/,\
+ schema/
17 years, 6 months
JBoss Tools SVN: r2167 - trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/views/server.
by jbosstools-commits@lists.jboss.org
Author: rob.stryker(a)jboss.com
Date: 2007-06-22 18:56:07 -0400 (Fri, 22 Jun 2007)
New Revision: 2167
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/views/server/JBossServerView.java
Log:
action removed from webtools, commented out here
Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/views/server/JBossServerView.java
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/views/server/JBossServerView.java 2007-06-22 22:55:20 UTC (rev 2166)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/views/server/JBossServerView.java 2007-06-22 22:56:07 UTC (rev 2167)
@@ -163,7 +163,7 @@
menu.add(new Separator());
menu.add(twiddleAction);
menu.add(editLaunchConfigAction);
- menu.add(actions[6]);
+ //menu.add(actions[6]);
menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
if( getSelectedServer() != null ) {
17 years, 6 months
JBoss Tools SVN: r2166 - trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server.
by jbosstools-commits@lists.jboss.org
Author: rob.stryker(a)jboss.com
Date: 2007-06-22 18:55:20 -0400 (Fri, 22 Jun 2007)
New Revision: 2166
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/JBossServerBehavior.java
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/JBossServerLaunchConfiguration.java
Log:
process termination now sets server state to stopped
Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/JBossServerBehavior.java
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/JBossServerBehavior.java 2007-06-22 22:40:40 UTC (rev 2165)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/JBossServerBehavior.java 2007-06-22 22:55:20 UTC (rev 2166)
@@ -24,6 +24,9 @@
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.debug.core.DebugEvent;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IDebugEventSetListener;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
@@ -87,6 +90,7 @@
// just terminate the processes. All of them
try {
ServerProcessModel.getDefault().getModel(getServer().getId()).clearAll();
+ process = null;
setServerStopped();
EventLogTreeItem tpe = new ForceShutdownEvent();
EventLogModel.markChanged(tpe.getEventRoot());
@@ -108,6 +112,33 @@
}
+ protected transient IProcess process;
+ protected transient IDebugEventSetListener processListener;
+ public void setProcess(final IProcess newProcess) {
+ if (process != null)
+ return;
+
+ process = newProcess;
+ if (processListener != null)
+ DebugPlugin.getDefault().removeDebugEventListener(processListener);
+ if (newProcess == null)
+ return;
+
+ processListener = new IDebugEventSetListener() {
+ public void handleDebugEvents(DebugEvent[] events) {
+ if (events != null) {
+ int size = events.length;
+ for (int i = 0; i < size; i++) {
+ if (process != null && process.equals(events[i].getSource()) && events[i].getKind() == DebugEvent.TERMINATE) {
+ DebugPlugin.getDefault().removeDebugEventListener(this);
+ forceStop();
+ }
+ }
+ }
+ }
+ };
+ DebugPlugin.getDefault().addDebugEventListener(processListener);
+ }
Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/JBossServerLaunchConfiguration.java
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/JBossServerLaunchConfiguration.java 2007-06-22 22:40:40 UTC (rev 2165)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/server/JBossServerLaunchConfiguration.java 2007-06-22 22:55:20 UTC (rev 2166)
@@ -225,6 +225,7 @@
if( action.equals(START)) {
processes = launchConfiguration(configuration, launch, monitor, mode);
processModel.add(processes, action, configuration);
+ jbossServerBehavior.setProcess(processes[0]);
jbossServerBehavior.serverStarting();
} else if( action.equals(STOP)) {
processes = launchConfiguration(configuration, launch, monitor, mode);
17 years, 6 months
JBoss Tools SVN: r2165 - trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/runtime/server.
by jbosstools-commits@lists.jboss.org
Author: rob.stryker(a)jboss.com
Date: 2007-06-22 18:40:40 -0400 (Fri, 22 Jun 2007)
New Revision: 2165
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/runtime/server/AbstractJBossServerRuntime.java
Log:
implemented setDefault to avoid NPE in webtools
Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/runtime/server/AbstractJBossServerRuntime.java
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/runtime/server/AbstractJBossServerRuntime.java 2007-06-22 17:45:28 UTC (rev 2164)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/runtime/server/AbstractJBossServerRuntime.java 2007-06-22 22:40:40 UTC (rev 2165)
@@ -22,10 +22,13 @@
package org.jboss.ide.eclipse.as.core.runtime.server;
import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.IVMInstallType;
import org.eclipse.jdt.launching.JavaRuntime;
+import org.eclipse.wst.server.core.IRuntimeType;
import org.eclipse.wst.server.core.IRuntimeWorkingCopy;
import org.eclipse.wst.server.core.internal.RuntimeWorkingCopy;
import org.eclipse.wst.server.core.model.RuntimeDelegate;
@@ -33,6 +36,10 @@
public abstract class AbstractJBossServerRuntime extends RuntimeDelegate implements IJBossServerRuntime {
+ public void setDefaults(IProgressMonitor monitor) {
+ getRuntimeWorkingCopy().setLocation(new Path(""));
+ }
+
public void setVMInstall(IVMInstall selectedVM) {
IRuntimeWorkingCopy copy = getRuntimeWorkingCopy();
if( copy instanceof RuntimeWorkingCopy ) {
17 years, 6 months
JBoss Tools SVN: r2164 - trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/packages.
by jbosstools-commits@lists.jboss.org
Author: rob.stryker(a)jboss.com
Date: 2007-06-22 13:45:28 -0400 (Fri, 22 Jun 2007)
New Revision: 2164
Modified:
trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/packages/ProjectArchiveStorer.java
Log:
static method became instance method
Modified: trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/packages/ProjectArchiveStorer.java
===================================================================
--- trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/packages/ProjectArchiveStorer.java 2007-06-22 17:44:44 UTC (rev 2163)
+++ trunk/as/plugins/org.jboss.ide.eclipse.as.core/jbosscore/org/jboss/ide/eclipse/as/core/packages/ProjectArchiveStorer.java 2007-06-22 17:45:28 UTC (rev 2164)
@@ -31,7 +31,7 @@
XbPackages packs = XMLBinding.unmarshal(s, new NullProgressMonitor());
if( packs != null && packs.getAllChildren().size() == 1 ) {
XbPackage pack = (XbPackage)packs.getAllChildren().get(0);
- IArchive node = (IArchive)ArchivesModel.createPackageNodeImpl(project.getLocation(), pack, null);
+ IArchive node = (IArchive)ArchivesModel.instance().createPackageNodeImpl(project.getLocation(), pack, null);
if( node != null ) {
cache.put(project, node);
}
17 years, 6 months
JBoss Tools SVN: r2163 - in trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model: internal/xb and 1 other directory.
by jbosstools-commits@lists.jboss.org
Author: rob.stryker(a)jboss.com
Date: 2007-06-22 13:44:44 -0400 (Fri, 22 Jun 2007)
New Revision: 2163
Modified:
trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModel.java
trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/xb/XMLBinding.java
Log:
fixed lack of compilation
Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModel.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModel.java 2007-06-22 16:31:35 UTC (rev 2162)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/ArchivesModel.java 2007-06-22 17:44:44 UTC (rev 2163)
@@ -257,7 +257,7 @@
}
}
- protected ArchiveNodeImpl createPackageNodeImpl (IPath project, XbPackageNode node, IArchiveNode parent) {
+ public ArchiveNodeImpl createPackageNodeImpl (IPath project, XbPackageNode node, IArchiveNode parent) {
if( node instanceof XbPackages ) {
ArchiveModelNode impl = (ArchiveModelNode)getRoot(project);
Modified: trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/xb/XMLBinding.java
===================================================================
--- trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/xb/XMLBinding.java 2007-06-22 16:31:35 UTC (rev 2162)
+++ trunk/core/plugins/org.jboss.ide.eclipse.archives.core/src/main/org/jboss/ide/eclipse/archives/core/model/internal/xb/XMLBinding.java 2007-06-22 17:44:44 UTC (rev 2163)
@@ -29,6 +29,7 @@
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
+import java.io.StringWriter;
import java.io.Writer;
import java.net.URL;
@@ -38,6 +39,8 @@
import org.eclipse.core.runtime.IProgressMonitor;
import org.jboss.ide.eclipse.archives.core.ArchivesCore;
import org.jboss.ide.eclipse.archives.core.Trace;
+import org.jboss.ide.eclipse.archives.core.model.IArchive;
+import org.jboss.ide.eclipse.archives.core.model.internal.ArchiveImpl;
import org.jboss.xb.binding.JBossXBException;
import org.jboss.xb.binding.Unmarshaller;
import org.jboss.xb.binding.UnmarshallerFactory;
@@ -115,7 +118,16 @@
return element;
}
- public static void marshal (final XbPackages element, final Writer writer, final IProgressMonitor monitor)
+ public static String marshall(IArchive topLevelArchive, IProgressMonitor monitor ) {
+ if( topLevelArchive.isTopLevel() && topLevelArchive instanceof ArchiveImpl ) {
+ XbPackages packs = (XbPackages)((ArchiveImpl)topLevelArchive).getNodeDelegate().getParent();
+ StringWriter sw = new StringWriter();
+ marshall(packs, sw, monitor);
+ return sw.toString();
+ }
+ return null;
+ }
+ public static void marshall (final XbPackages element, final Writer writer, final IProgressMonitor monitor)
{
if( !initialized) init();
binderSandbox(new Runnable() {
@@ -150,7 +162,7 @@
try {
ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(bytesOut);
- XMLBinding.marshal(packages, writer, monitor);
+ XMLBinding.marshall(packages, writer, monitor);
writer.close();
ByteArrayInputStream bytesIn = new ByteArrayInputStream(bytesOut.toByteArray());
@@ -173,7 +185,7 @@
try {
ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(bytesOut);
- XMLBinding.marshal(packages, writer, monitor);
+ XMLBinding.marshall(packages, writer, monitor);
writer.close();
return new String(bytesOut.toByteArray());
} catch( Exception e ) {
17 years, 6 months
JBoss Tools SVN: r2162 - trunk/seam/plugins/org.jboss.ide.seam.gen/src/org/jboss/ide/seam/gen/actions.
by jbosstools-commits@lists.jboss.org
Author: mculpepper(a)jboss.com
Date: 2007-06-22 12:31:35 -0400 (Fri, 22 Jun 2007)
New Revision: 2162
Modified:
trunk/seam/plugins/org.jboss.ide.seam.gen/src/org/jboss/ide/seam/gen/actions/SeamGenAction.java
Log:
removed a com.sun import
Modified: trunk/seam/plugins/org.jboss.ide.seam.gen/src/org/jboss/ide/seam/gen/actions/SeamGenAction.java
===================================================================
--- trunk/seam/plugins/org.jboss.ide.seam.gen/src/org/jboss/ide/seam/gen/actions/SeamGenAction.java 2007-06-22 11:26:54 UTC (rev 2161)
+++ trunk/seam/plugins/org.jboss.ide.seam.gen/src/org/jboss/ide/seam/gen/actions/SeamGenAction.java 2007-06-22 16:31:35 UTC (rev 2162)
@@ -55,8 +55,6 @@
import org.jboss.ide.seam.gen.QuestionDialog;
import org.jboss.ide.seam.gen.SeamGenPlugin;
-import com.sun.tools.corba.se.idl.som.cff.Messages;
-
public abstract class SeamGenAction implements IWorkbenchWindowActionDelegate {
private final class LaunchListener implements ILaunchesListener2 {
17 years, 6 months
JBoss Tools SVN: r2161 - trunk/documentation/GettingStartedGuide/docs/userguide/en/modules.
by jbosstools-commits@lists.jboss.org
Author: afedosik
Date: 2007-06-22 07:26:54 -0400 (Fri, 22 Jun 2007)
New Revision: 2161
Modified:
trunk/documentation/GettingStartedGuide/docs/userguide/en/modules/GettingStartedWithRHDS.xml
Log:
Running for the first time section deleted
Modified: trunk/documentation/GettingStartedGuide/docs/userguide/en/modules/GettingStartedWithRHDS.xml
===================================================================
--- trunk/documentation/GettingStartedGuide/docs/userguide/en/modules/GettingStartedWithRHDS.xml 2007-06-22 11:26:01 UTC (rev 2160)
+++ trunk/documentation/GettingStartedGuide/docs/userguide/en/modules/GettingStartedWithRHDS.xml 2007-06-22 11:26:54 UTC (rev 2161)
@@ -61,19 +61,7 @@
</section>
- <section id="RunningForTheFirstTime">
- <?dbhtml filename="RunningForTheFirstTime.html"?>
- <title>Running for the First Time</title>
- <itemizedlist>
- <listitem><para> Launch Eclipse</para></listitem>
- <listitem><para> Select Window/Open Perspective.../Other...</para></listitem>
- <listitem><para> Select Red Hat Developer Studio from the perspective list</para></listitem>
- </itemizedlist>
- <para>We recommend starting Eclipse with VM arguments to make more memory (heap) available for large-scale projects. Open the file <eclipse>\eclipse.ini and set the following:</para>
- <para>eclipse -clean -vmargs -Xms512m -Xmx512m -XX:MaxPermSize=128m</para>
- <para>This setting will allow the Java heap to grow to 512MB.</para>
- </section>
- <section id="Upgrading">
+ <section id="Upgrading">
<?dbhtml filename="Upgrading.html"?>
<title>Upgrading</title>
<para>To upgrade, just uninstall your current version and install the new version.</para>
17 years, 6 months
JBoss Tools SVN: r2160 - in trunk/documentation/GettingStartedGuide/docs/userguide/en: modules and 1 other directory.
by jbosstools-commits@lists.jboss.org
Author: afedosik
Date: 2007-06-22 07:26:01 -0400 (Fri, 22 Jun 2007)
New Revision: 2160
Added:
trunk/documentation/GettingStartedGuide/docs/userguide/en/modules/AjaxCRUDApplicationWithSeamAndRichFaces.xml
Removed:
trunk/documentation/GettingStartedGuide/docs/userguide/en/modules/AjaxCURDApplicationWithSeamAndRichFaces.xml
Modified:
trunk/documentation/GettingStartedGuide/docs/userguide/en/master.xml
Log:
CURD --> CRUD fixed
Modified: trunk/documentation/GettingStartedGuide/docs/userguide/en/master.xml
===================================================================
--- trunk/documentation/GettingStartedGuide/docs/userguide/en/master.xml 2007-06-22 10:23:27 UTC (rev 2159)
+++ trunk/documentation/GettingStartedGuide/docs/userguide/en/master.xml 2007-06-22 11:26:01 UTC (rev 2160)
@@ -4,7 +4,7 @@
[<!ENTITY GettingStartedWithRHDS SYSTEM "modules/GettingStartedWithRHDS.xml">
<!ENTITY GettingStartedGuideforJSFwithHibernate SYSTEM "modules/GettingStartedGuideforJSFwithHibernate.xml">
-<!ENTITY AjaxCURDApplicationWithSeamAndRichFaces SYSTEM "modules/AjaxCURDApplicationWithSeamAndRichFaces.xml">
+<!ENTITY AjaxCRUDApplicationWithSeamAndRichFaces SYSTEM "modules/AjaxCRUDApplicationWithSeamAndRichFaces.xml">
<!ENTITY BusinessProcessAndRulesApplication SYSTEM "modules/BusinessProcessAndRulesApplication.xml">
<!ENTITY GettingStartedGuideforJavaServerFaces SYSTEM "modules/GettingStartedGuideforJavaServerFaces.xml">
<!ENTITY GettingStartedForCreatingaJSFApplication SYSTEM "modules/GettingStartedForCreatingAJSFApplication.xml">
@@ -30,7 +30,7 @@
&GettingStartedWithRHDS;
&GettingStartedGuideforJSFwithHibernate;
-&AjaxCURDApplicationWithSeamAndRichFaces;
+&AjaxCRUDApplicationWithSeamAndRichFaces;
&BusinessProcessAndRulesApplication;
&GettingStartedForCreatingaJSFApplication;
&GettingStartedGuideforCreatingaStrutsApplication;
Added: trunk/documentation/GettingStartedGuide/docs/userguide/en/modules/AjaxCRUDApplicationWithSeamAndRichFaces.xml
===================================================================
--- trunk/documentation/GettingStartedGuide/docs/userguide/en/modules/AjaxCRUDApplicationWithSeamAndRichFaces.xml (rev 0)
+++ trunk/documentation/GettingStartedGuide/docs/userguide/en/modules/AjaxCRUDApplicationWithSeamAndRichFaces.xml 2007-06-22 11:26:01 UTC (rev 2160)
@@ -0,0 +1,681 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="AjaxCRUDApplicationWithSeamAndRichFaces" xreflabel="AjaxCRUDApplicationWithSeamAndRichFaces">
+ <?dbhtml filename="AjaxCRUDApplicationWithSeamAndRichFaces.html"?>
+ <chapterinfo>
+ <keywordset>
+ <keyword>Red Hat Developer Studio</keyword>
+ <keyword>Seam</keyword>
+ <keyword>JBoss</keyword>
+ <keyword>CRUD-application</keyword>
+ </keywordset>
+ </chapterinfo>
+
+ <title>Ajax CRUD-application with Seam and Rich Faces</title>
+<para>In this chapter we will see how easy it is to build Seam applications and integrate
+them with Ajax4jsf and Rich Faces. We will bootstrap the application using Seam Gen which is
+ a CRUD application generator. Seam Gen can be used from either the command line or via an
+ Eclipse Plugin. Unlike most application generators, Seam Gen can also be used to
+ incrementally add more functionality to an existing Seam application.</para>
+ <para>Seam is an incredibly flexible development framework that can be completely
+ integrated with a Java EE server or in a simple POJO environment like Tomcat. Seam is
+ also extremely portable, and has been tested on several popular containers like JBoss,
+ Tomcat, Weblogic, WebSphere. Seam uses JSF as its view layer and can use either JSP or
+ Faceless as the presentation layer.</para>
+ <para>Seam Gen generates all the required layers of an application. It uses JPA as the
+ persistence layer, POJO's (Plain Old Java Objects) as the business logic layer and
+ Facelets as the presentation layer.</para>
+ <para>We will perform the following steps in this chapter of the tutorial:</para>
+ <itemizedlist>
+ <listitem>Creating a Seam Project using Seam Gen</listitem>
+ <listitem>Generating a Seam application using Seam Gen</listitem>
+ <listitem>Running the Seam application</listitem>
+ <listitem>Customizing the generated Seam application</listitem>
+ <listitem>Adding AJAX features to automatically generated JSF Seam UI components</listitem>
+ <listitem>Replacing standard JSF UI components with AJAX enabled rich UI components
+ provided by the Red Hat Developer Studio</listitem>
+ <listitem>Using AJAX components to do live validation on web pages</listitem>
+ <listitem>Adding Rich Faces components to a Seam application</listitem>
+ </itemizedlist>
+<section id="CreatingASeamProjectUsingSeamGen">
+<?dbhtml filename="CreatingASeamProjectUsingSeamGen.html"?>
+<title>Creating a Seam Project using Seam Gen</title>
+<itemizedlist>
+<listitem>Stop your JBoss AS Server by clicking on the stop button as shown below. We are
+ doing this so that the generated application can be deployed properly when the server
+ starts.</listitem>
+ </itemizedlist>
+ <figure>
+<title>Stopping JBoss AS Server</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/StoppingServer.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<itemizedlist continuation="continues">
+<listitem>To create a Seam project, select Seam Gen -> Setup/Configuration -> Setup to
+launch the Seam Gen setup window as shown below. Note: </listitem>
+</itemizedlist>
+<note>
+ <title>Note:</title>
+ <para>If this is the first time you run
+Seam Gen a file dialog will be shown. In this you need to select <seam>/seam-gen/build.xml
+ so the plugin knows which seam-gen to use.</para>
+ </note>
+<para></para>
+
+ <figure>
+<title>Seam Gen Setup Window</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/SeamGenSetup.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<para>Fill the items in the dialog as shown below and select the OK button.</para>
+<table>
+ <title>Filling Project Items</title>
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Field Name</entry>
+ <entry>Field Value</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Project</entry>
+ <entry>EclipseCon</entry>
+ </row>
+ <row>
+ <entry>Seam project workspace</entry>
+ <entry><your project directory></entry>
+ </row>
+ <row>
+ <entry>JBoss AS Home directory</entry>
+ <entry><JBoss AS Home Dir></entry>
+ </row>
+ <row>
+ <entry>Driver Location</entry>
+ <entry><seam>/<seam-gen>/lib/hsqldb.jar</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ <para>The plug-in will initialize the Seam Gen ant tasks that simplify all key Seam
+ operations. We will invoke several of these ant tasks via the Seam Eclipse Plugin
+ throughout this tutorial.</para>
+ <para>The plug-in will also prompt you to create a project. Select "Yes" to create a
+ Project. This step will create not only an Eclipse project but also all the required
+ artifacts to get you started.</para>
+ <para>The plug-in will also prompt you create a database connection. Select
+ "Yes" to create a WTP Database connection that connects to the default HSQL DB
+ instance that we have set up. If you are using any other database then set up the
+ appropriate database settings in the Seam Gen setup window.</para>
+ <para>At the end of this step you will see an Eclipse project called "EclipseCon"
+ as shown below. This project has all the necessary elements required to deploy
+ a Seam application.</para>
+ <figure>
+<title>EclipseCon Project Structure</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/EclipseConProjectStructure.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<itemizedlist continuation="continues">
+<listitem>Start the application server. Open your favorite browser and point to the
+following URL http://localhost:8080/EclipseCon. You should see the following page:</listitem>
+</itemizedlist>
+<figure>
+<title>Created Project</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/CreatedProject.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<para>Congratulations! You have written your first Seam application.</para>
+<itemizedlist continuation="continues">
+<listitem>Let us take a look at the database connection that was created by the Eclipse
+ Plugin and browse the database provided. The database connection view should now have a
+ connection to our sample database as shown below.</listitem>
+ </itemizedlist>
+ <figure>
+<title>Connections View</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/ConnectionsView.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<para>Right click on the connection -> Reconnect. Just specify "sa" as the user id. The password
+ field should be blank.</para>
+ <para>You should now be able to browse the database and see the meta-data and query data using SQL.
+ Your meta-data should look like the following:</para>
+ <figure>
+<title>Meta-data View</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/Metadata.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+</section>
+<section id="GeneratingACRUDApplicationUsingSeamGen">
+<?dbhtml filename="GeneratingACRUDApplicationUsingSeamGen.html"?>
+<title>Generating a CRUD application using Seam Gen</title>
+<itemizedlist>
+<listitem>The next step in our exercise is to generate a full blown application using Seam Gen.
+This application will generate CRUD pages and Search pages for all the entities in the database.
+Click on Seam Gen -> Generate Entities. Seam Gen will connect to the database we defined in the
+ setup part of the application and generate all the required components.</listitem>
+ <listitem>Since Seam Gen is generating files on the file system that Eclipse does not know
+ about, right click on the project name on your project and choose the Refresh item. This will let
+ Eclipse know that there are new files and get them updated in the Eclipse project and deployed
+ in the JBoss instance.</listitem>
+ <listitem>Restart you application server, just in case those files have not been properly
+ synchronized with the application server.</listitem>
+ <listitem>Point your favorite browser to the following URL http://localhost:8080/EclipseCon.
+ You will see the following page:</listitem>
+ </itemizedlist>
+ <figure>
+<title>EclipseCon Project</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/CreatedProject.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<itemizedlist continuation="continues">
+<listitem>Let us now look at one of the entities and see what has been generated. Click on the
+ "Offices List" to see a search page that allows you to filter the list and the list of all the
+ offices in the database.</listitem>
+ <listitem>Type in USA in the country field and click on Search to get a list of offices in the
+ USA as shown below.</listitem>
+ </itemizedlist>
+ <figure>
+<title>Search Panel</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/SearchPanel.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+
+<itemizedlist continuation="continues">
+<listitem>Let us now check out the editing capability of the generated Seam application. Select
+ the first office code and click on the Edit button. You will be prompted for a userID and
+ password. Use "seamuser" for both user and password. You should at this point see the edit page
+ as shown below. Notice that the NOT NULL columns in the database table are automatically marked
+ with the red * to indicate that they are required.</listitem>
+ </itemizedlist>
+ <figure>
+<title>Generated Edit Page</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/GeneratedEditPage.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<itemizedlist continuation="continues">
+<listitem>Change a few things and save changes. This should update the record in the database.
+ There you have it. A simple and easy way to bootstrap your applications.</listitem>
+ <listitem>Let us look at how validations are done in Seam. Go back to and edit another office
+ record and this time leave the city blank and click on the Save button. You will see the default
+ Seam validations get triggered. In this case the "value required" validation is fired as shown
+ below.</listitem>
+ </itemizedlist>
+<figure>
+<title>Error Reporting</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/ValidationInEditPage.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+</section>
+<section id="CustomizingTheGeneratedApplication">
+<?dbhtml filename="CustomizingTheGeneratedApplication.html"?>
+<title>Customizing the generated application</title>
+<itemizedlist>
+<listitem>Let us look at a couple of simple things we can change in the generated application
+ to show you that the generated application can be customized. Let us start by changing the edit
+ page that we just saw. We will clean up the labels using the Facelet designer as shown below.
+ Open the view directory in your project and double click on the OfficeEdit.xhtml file.</listitem>
+</itemizedlist>
+<figure>
+<title>Facelet Designer</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/FaceletDesigner.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<para>Unlike other WYSIWYG editors which developers tend to hate, the visual designers in Red Hat
+ Developer Studio are designed for developers to rapidly find their way in a source file, while
+ still allowing them to visually look at a document.</para>
+
+<itemizedlist continuation="continues">
+<listitem>To change a label text, click on a label in the designer. This will position the
+ cursor at the correct location in the source view. Type the new label there. The designer does
+ not force the developer to use the WYSIWIG environment. Change all the labels for the edit page.</listitem>
+ </itemizedlist>
+ <para>Once you save the page, the IDE automatically rebuilds the application and re-deploys it.
+ So, just reload your browser and you should see an updated web page like the following. If for
+ some reason the re-deployment did not work, stop and restart the server normally resolves the issue.</para>
+ <figure>
+<title>Edit Page</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/EditPage.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+</section>
+<section id="UsingHibernateToolsToInteractWithTheJPAEntities">
+<?dbhtml filename="UsingHibernateToolsToInteractWithTheJPAEntities.html"?>
+<title>Using Hibernate tools to interact with the JPA Entities</title>
+<para>As part of generating the application, Seam Gen also generates JPA entities that are used
+ to interact with the database. Let us quickly take a look at Hibernate tools and see how we can
+ interact with the database using HQL and the Hibernate Criteria API.</para>
+ <itemizedlist>
+ <listitem>Open the Hibernate Configurations View. You should be able to open the console like
+ the other views we have seen so far in the tutorial. Your view should resemble the following:</listitem>
+ </itemizedlist>
+ <figure>
+<title>Hibernate Configurations View</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/HibernateConfigurationsView.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<itemizedlist continuation="continues">
+<listitem>Before we run the HQL, let us open up the "Hibernate Query Result" and the "Hibernate
+ Dynamic SQL Preview" views. You should be able to do that in a manner similar to other views we
+ have opened in this tutorial. Alternatively you can open the Hibernate Console Perspective where
+ these views are opened up by default.</listitem>
+ <listitem>Click on the "HQL" icon in the "Hibernate Configurations" view. This will open up
+ the HQL Designer view as shown below. Also, select "EclipseCon" from the drop down menu next to
+ the green "run" button.</listitem>
+ </itemizedlist>
+ <figure>
+<title>HQL Designer View</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/HQLDesignerView.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<itemizedlist continuation="continues">
+<listitem>Type in a simple query as shown above "from Offices o" and click on the green "run"
+ button. You should see the result of the HQL query in the "Hibernate Query Result" window as
+ shown below.</listitem>
+ </itemizedlist>
+ <figure>
+<title>Hibernate Query Result Window</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/HibernateQueryResultWindow.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<itemizedlist continuation="continues">
+<listitem>Click on any of the objects in the result and you should be able see the contents of
+ the objects in the Property view as shown below. If you don't have the view open in your
+ perspective, you can open this view like all other views in this tutorial.</listitem>
+ </itemizedlist>
+ <figure>
+<title>Property View</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/PropertyView.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<para>Select the "Hibernate Dynamic SQL Preview" view to the generated SQL. This is a great tool
+to see the SQL being generated by Hibernate for your HQL. Not only is this a great debugging tool,
+ it is also a great way to optimize your HQL queries.</para>
+ <figure>
+<title>Hibernate Dynamic SQL Preview</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/HibernateDynamicSQLPreview.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<itemizedlist continuation="continues">
+<listitem>Let us try a slightly more complex query. Type in the following query in the query
+window and see how the query result changes and the SQL Preview changes.</listitem>
+ </itemizedlist>
+ <programlisting role="JAVA"><![CDATA[select city, state, postalcode
+ from Offices o
+ where country = 'USA'
+]]></programlisting>
+<itemizedlist continuation="continues">
+<listitem>Let us try the Hibernate criteria APIs next. To use Hibernate Criteria APIs click on
+the "CRI" button in the Hibernate Configurations View. This will open the Criteria API designer
+view. Type in this simple criteria query as shown below and click on the green run button to see
+ the results. Also, select "EclipseCon" from the drop down menu next to the green "run" button.</listitem>
+ </itemizedlist>
+ <programlisting role="JAVA"><![CDATA[session.createCriteria(Offices.class)
+]]></programlisting>
+<para>The results will be very similar to the HQL query except that the criteria query does not
+generate the SQL in the "Hibernate Dynamic SQL Preview" view.</para>
+<itemizedlist continuation="continues">
+<listitem>Let us try something a little more complex. Let us filter all offices in the USA as
+shown below. The results of this query should be very similar to the results of the HQL.</listitem>
+ </itemizedlist>
+ <programlisting role="JAVA"><![CDATA[session.createCriteria(Offices.class)
+ .add(Restrictions.eq("country", "USA")) ;
+]]></programlisting>
+<itemizedlist continuation="continues">
+<listitem>Finally let us visually see the entity model of the generated JPA objects. Before we
+ do that, open the "Hibernate Entity Model" view and select the "Configurations" option in the
+ "Hibernate Configurations" view. The plug-in will show all the entities in a visual format.
+ You can either manually align your objects or click on the "Layout" button on the right of the
+ "Hibernate Entity Model" view to generate a default layout.</listitem>
+ </itemizedlist>
+ <figure>
+<title>Hibernate Entities</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/HibernateEntities.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+
+</section>
+<section id="AddingAJAXAndRichUIFeaturesToASeamApplication">
+<?dbhtml filename="AddingAJAXAndRichUIFeaturesToASeamApplication.html"?>
+<title>Adding AJAX and rich UI features to a Seam application</title>
+<para>A key feature of JBoss Seam and the Red Hat Developer Studio is that they make AJAX and rich
+ UI web applications a breeze to develop. In this section of the tutorial, we will show you how
+ to:</para>
+ <itemizedlist>
+ <listitem>Add AJAX features to automatically generated JSF Seam UI components</listitem>
+ <listitem>Replace standard JSF UI components with AJAX enabled rich UI components provided by the
+ Red Hat Developer Studio</listitem>
+ <listitem>Use AJAX components to do live validation on web pages</listitem>
+ </itemizedlist>
+ <section id="AddingAJAXFeaturesToGeneratedUIComponents">
+<?dbhtml filename="AddingAJAXFeaturesToGeneratedUIComponents.html"?>
+<title>Adding AJAX features to generated UI components</title>
+<para>Let us now try to add some AJAX features to the generated Seam application. Click on the
+ Payments List link on the top of the page. You will see a search page as shown below.</para>
+ <figure>
+<title>Search Page</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/SearchPage.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<para>You can search for any "checknumber" by typing in the number or by paging through the list
+ of payments. But what if you only knew a few of the digits/alphabets in the "checknumber"? It
+ would be very useful to filter the list based on that. AJAX provides very useful techniques to
+ build these types of applications and Ajax4Jsf provides the building blocks to simplify these
+ techniques.</para>
+ <para>Double Click on the PaymentsList.xhtml to open the visual facelet designer. You will
+ notice that in the beginning of the source, Seam Gen has already add the tag library references
+ to Ajax4Jsf and RichFaces as shown below.</para>
+ <programlisting role="JAVA"><![CDATA[<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
+ xmlns:rich="http://richfaces.ajax4jsf.org/rich"
+ template="layout/template.xhtml">
+]]></programlisting>
+<para>Next, locate the check number input field. We need to add AJAX to this field. Basically,
+as we type we want to update the table. Adding AJAX functionality usually requires two things:</para>
+<itemizedlist>
+<listitem>Letting the framework know on which event to send an AJAX request to the server.</listitem>
+<listitem>Specifying what component(s) to update with the output from the server.</listitem>
+</itemizedlist>
+<para>Ajax4Jsf provides a simple JSF component <emphasis role="bold"><property><aj4:support></property></emphasis> that simplifies this process. Let us
+take our example and add AJAX to it.</para>
+<itemizedlist>
+<listitem>Click on the checknumber field in the visual designer, it will position you at the
+correct location in the source. You will notice that the inputText tag does not have a closing
+tag. Let us add a closing tag to the input text field as shown below.</listitem>
+</itemizedlist>
+<programlisting role="JSP"><![CDATA[<h:inputText id="checknumber"
+ value="#{paymentsList.payments.checknumber}">
+ <a4j:support event="onkeyup" reRender="paymentsList"/>
+ </h:inputText>
+]]></programlisting>
+<itemizedlist continuation="continues">
+<listitem>Now let us add the AJAX support tag to let Ajax4Jsf know that when the user presses a
+ key we want to go to the server to get a list of payments that match the characters entered in
+ the checknumber text box. Add the tag that is highlighted below to the inputText tag.</listitem>
+</itemizedlist>
+<programlisting role="JSP"><![CDATA[<h:inputText id="checknumber"
+ value="#{paymentsList.payments.checknumber}">
+ <a4j:support event="onkeyup" reRender="paymentsList"/>
+ </h:inputText>
+]]></programlisting>
+<para>This tag is pretty self explanatory, it posts the server when a key is pressed and then
+ takes the response from the server and re-renders the section of the page that has an id of
+ "paymentList".</para>
+ <itemizedlist continuation="continues">
+<listitem>If you follow along in the page, you will see that the section that displays the
+results is in a div tag that has an id of "paymentsList"</listitem>
+</itemizedlist>
+<programlisting role="JSP"><![CDATA[<div class="results" id="paymentsList">
+ <h3>search results</h3>
+ <h:outputText value="No payments exists"
+ rendered="#{empty paymentsList.resultList}"/>
+ ...
+ </div>
+]]></programlisting>
+<itemizedlist continuation="continues">
+<listitem>Save the changes and refresh your browser. You will see that as you type characters
+in the checknumber field, all payments that begin with those characters will be displayed in the
+table automatically.</listitem>
+</itemizedlist>
+<figure>
+<title>Data Fields</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/DataFields.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<para>But there is still one more problem in this page, you will see that the "Next" and
+ "Previous" buttons will be displayed even for search results that are small as shown above.</para>
+ <itemizedlist continuation="continues">
+<listitem>The tag that we added in the previous step only updates the table. Let us add an AJAX
+region around the page buttons at the bottom of the table. This will allow Ajax4Jsf to update
+those buttons independently.</listitem>
+</itemizedlist>
+<programlisting role="JSP"><![CDATA[<a4j:outputPanel ajaxRendered="true">
+ <div class="tableControl">
+ ...
+ </div>
+ </a4j:outputPanel>
+]]></programlisting>
+<para>Add an <emphasis role="bold"><property><a4j:outputPanel></property></emphasis> tag around the page buttons as shown above and run the page again.
+ If the result list is small, you will see that the page buttons are no longer visible as shown
+ below.</para>
+ <figure>
+<title>Datatable With No Page Buttons</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/NoButtons.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<itemizedlist continuation="continues">
+<listitem>Let add one more thing to complete this part of the sample. When we type a character in
+ the "checknumber" field, there is no visual feedback to the user that there is a request being
+ made to the server.</listitem>
+ </itemizedlist>
+ <para>Ajax4Jsf has a pre-built tag <emphasis role="bold"><property><a4j:status></property></emphasis> that allows you to either render a text or an
+ image in response to an AJAX event. Add the following code, right after the end of the
+ <emphasis role="bold"><property><h:inputText></property></emphasis> tag.</para>
+ <programlisting role="JSP"><![CDATA[<a4j:status>
+ <f:facet name="start">
+ <h:graphicImage value="/img/ajax-loader.gif" style="border: 1px solid #E0E0E0"/>
+ </f:facet>
+ </a4j:status>
+]]></programlisting>
+<para>Save changes to the page and refresh the browser. You will see the image when the AJAX
+request is active. The image will disappear as soon as the response is received.</para>
+<itemizedlist continuation="continues">
+<listitem>Finally, let us place the image beside the "checknumber" text box. Place a
+<emphasis role="bold"><property><h:panelGroup></property></emphasis> around the <emphasis role="bold"><property><h:inputText></property></emphasis> and <emphasis role="bold"><property><a4j:status></property></emphasis> tags as shown below.
+Save changes and refresh the browser. You should see the image right next to the text box.</listitem>
+ </itemizedlist>
+ <programlisting role="JSP"><![CDATA[<h:panelGroup>
+ <h:inputText id="checknumber"
+ value="#{paymentsList.payments.checknumber}">
+ <a4j:support event="onkeyup"
+ reRender="paymentsList"/>
+ </h:inputText>
+ <a4j:status>
+ <f:facet name="start">
+ <h:graphicImage value="/img/ajax-loader.gif"
+ style="border: 1px solid #E0E0E0"/>
+ </f:facet>
+ </a4j:status>
+ </h:panelGroup>
+]]></programlisting>
+<para>Although this example was a bit long, it shows how easy it is to add AJAX capabilities to
+an existing Seam application.</para>
+</section>
+<section id="AddingRichfacesComponentsToaSeamApplication">
+<?dbhtml filename="AddingRichfacesComponentsToaSeamApplication.html"?>
+<title>Adding RichFaces components to a Seam application</title>
+<para>Now that we have seen how AJAX can bring interactivity to an application, let us add rich
+controls that will improve the user experience. RichFaces provides numerous rich controls that
+can be added to an application. In this section we will add spinner and slider controls that
+allow users to change numerical values without using the keyboard.</para>
+<para>Double Click on the OrderdetailsEdit.xhtml to open the visual facelet designer. You will
+ notice that in the beginning of the source, Seam Gen has already included the tag library
+ references to Ajax4Jsf and RichFaces as shown below.</para>
+ <programlisting role="JSP"><![CDATA[<ui:composition xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:s="http://jboss.com/products/seam/taglib"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
+ xmlns:rich="http://richfaces.ajax4jsf.org/rich"
+ template="layout/template.xhtml">
+]]></programlisting>
+<para>In this page, we are going to replace the "quantityordered" text box with the spinner
+ control.</para>
+ <itemizedlist>
+ <listitem>In the visual view of the page, click on the "quantityordered" text box, this will
+ select the appropriate markup in the source view. Delete the selected markup.</listitem>
+ </itemizedlist>
+ <figure>
+<title>Deleting Selected Markup</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/DeletingSelectedMarkup.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<para>We will replace the <emphasis role="bold"><property><h:inputText></property></emphasis> tag with a pre-built <emphasis role="bold"><property><rich:inputNumberSpinner></property></emphasis> tag.
+ The spinner control tag is very simple to use and like all other JSF controls, it has a value
+ attribute that can be bound to any JSF Managed Bean or Seam component. The designer allows you
+ to visually find all the beans available as shown below. Right
+ click on the <emphasis role="bold"><property><rich:inputNumberSpinner></property></emphasis> input field and select "<emphasis role="bold"><property><rich:inputNumberSpinner></property></emphasis> Attributes".</para>
+ <figure>
+<title>Replacing Tags</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/ReplacingTags.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<para>The minValue and maxValue are self explanatory, they represent the minimum and maximum
+ values for the spinner. Place the following tag in your page.</para>
+ <programlisting role="JSP"><![CDATA[<rich:inputNumberSpinner
+ value="#{orderdetailsHome.definedInstance.quantityordered}"
+ inputStyle="width:30px; height:20px"
+ minValue="0"
+ maxValue="100"
+ required="true"/>
+]]></programlisting>
+
+<itemizedlist continuation="continues">
+<listitem>Save changes and refresh the browser page. Your output page should look like this:</listitem>
+</itemizedlist>
+<figure>
+<title>Output Page</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/OutputPage.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<itemizedlist continuation="continues">
+<listitem>Although this is not the best situation to use a slider, let us take a quick look at
+another RichFaces control <emphasis role="bold"><property><rich:inputNumberSlider></property></emphasis>. The slider control is similar to the the
+spinner control; it is bound to the same object. Replace the spinner with the following markup.
+Save the page and refresh your browser window.</listitem>
+</itemizedlist>
+<programlisting role="JSP"><![CDATA[<rich:inputNumberSlider
+ value="#{orderdetailsHome.definedInstance.quantityordered}"
+ styleClass="slider"
+ width="200"/>
+]]></programlisting>
+<figure>
+<title>InputNumberSlider Settings</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/InputNumberSliderSettings.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<itemizedlist continuation="continues">
+<listitem>Seam Gen also generates a date picker control for all date fields in an edit page.
+ Click on "Order List" and edit one of the orders to see an example of the date picker control
+ that is bundled with Seam.</listitem>
+</itemizedlist>
+
+<figure>
+<title>Order List</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/OrderedList.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+
+</section>
+<section id="ValidatingTheAJAXWay(LiveValidations)">
+<?dbhtml filename="ValidatingTheAJAXWay(LiveValidations).html"?>
+<title>Validating the AJAX way (Live Validations)</title>
+<para>Seam Gen also generates field validation code that leverages AJAX techniques, by providing
+ immediate feedback to users who use these applications. To see an example of this, go back to
+ the Office Edit page and leave the city blank and tab out of the field. Seam will immediately
+ validate the field and tell you that the value is required.</para>
+ <figure>
+<title>Office Edit Page</title>
+<mediaobject>
+ <imageobject>
+ <imagedata fileref="images/OfficeEditPage.png"/>
+ </imageobject>
+</mediaobject>
+</figure>
+<para>To provide this functionality for every required field in the page Seam generates the
+ following markup:</para>
+<programlisting role="JSP"><![CDATA[<s:decorate id="cityDecoration">
+<h:inputText id="city"
+ required="true"
+ size="50"
+ maxlength="50"
+ value="#{officesHome.instance.city}">
+ <a:support event="onblur" reRender="cityDecoration"/>
+ </h:inputText>
+ </s:decorate>
+]]></programlisting>
+<para>Seam uses Ajax4Jsf to make a server side call to validate the field.</para>
+</section>
+</section>
+</chapter>
Deleted: trunk/documentation/GettingStartedGuide/docs/userguide/en/modules/AjaxCURDApplicationWithSeamAndRichFaces.xml
===================================================================
--- trunk/documentation/GettingStartedGuide/docs/userguide/en/modules/AjaxCURDApplicationWithSeamAndRichFaces.xml 2007-06-22 10:23:27 UTC (rev 2159)
+++ trunk/documentation/GettingStartedGuide/docs/userguide/en/modules/AjaxCURDApplicationWithSeamAndRichFaces.xml 2007-06-22 11:26:01 UTC (rev 2160)
@@ -1,681 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="AjaxCURDApplicationWithSeamAndRichFaces" xreflabel="AjaxCURDApplicationWithSeamAndRichFaces">
- <?dbhtml filename="AjaxCURDApplicationWithSeamAndRichFaces.html"?>
- <chapterinfo>
- <keywordset>
- <keyword>Red Hat Developer Studio</keyword>
- <keyword>Seam</keyword>
- <keyword>JBoss</keyword>
- <keyword>CURD-application</keyword>
- </keywordset>
- </chapterinfo>
-
- <title>Ajax CURD-application with Seam and Rich Faces</title>
-<para>In this chapter we will see how easy it is to build Seam applications and integrate
-them with Ajax4jsf and Rich Faces. We will bootstrap the application using Seam Gen which is
- a CRUD application generator. Seam Gen can be used from either the command line or via an
- Eclipse Plugin. Unlike most application generators, Seam Gen can also be used to
- incrementally add more functionality to an existing Seam application.</para>
- <para>Seam is an incredibly flexible development framework that can be completely
- integrated with a Java EE server or in a simple POJO environment like Tomcat. Seam is
- also extremely portable, and has been tested on several popular containers like JBoss,
- Tomcat, Weblogic, WebSphere. Seam uses JSF as its view layer and can use either JSP or
- Faceless as the presentation layer.</para>
- <para>Seam Gen generates all the required layers of an application. It uses JPA as the
- persistence layer, POJO's (Plain Old Java Objects) as the business logic layer and
- Facelets as the presentation layer.</para>
- <para>We will perform the following steps in this chapter of the tutorial:</para>
- <itemizedlist>
- <listitem>Creating a Seam Project using Seam Gen</listitem>
- <listitem>Generating a Seam application using Seam Gen</listitem>
- <listitem>Running the Seam application</listitem>
- <listitem>Customizing the generated Seam application</listitem>
- <listitem>Adding AJAX features to automatically generated JSF Seam UI components</listitem>
- <listitem>Replacing standard JSF UI components with AJAX enabled rich UI components
- provided by the Red Hat Developer Studio</listitem>
- <listitem>Using AJAX components to do live validation on web pages</listitem>
- <listitem>Adding Rich Faces components to a Seam application</listitem>
- </itemizedlist>
-<section id="CreatingASeamProjectUsingSeamGen">
-<?dbhtml filename="CreatingASeamProjectUsingSeamGen.html"?>
-<title>Creating a Seam Project using Seam Gen</title>
-<itemizedlist>
-<listitem>Stop your JBoss AS Server by clicking on the stop button as shown below. We are
- doing this so that the generated application can be deployed properly when the server
- starts.</listitem>
- </itemizedlist>
- <figure>
-<title>Stopping JBoss AS Server</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/StoppingServer.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<itemizedlist continuation="continues">
-<listitem>To create a Seam project, select Seam Gen -> Setup/Configuration -> Setup to
-launch the Seam Gen setup window as shown below. Note: </listitem>
-</itemizedlist>
-<note>
- <title>Note:</title>
- <para>If this is the first time you run
-Seam Gen a file dialog will be shown. In this you need to select <seam>/seam-gen/build.xml
- so the plugin knows which seam-gen to use.</para>
- </note>
-<para></para>
-
- <figure>
-<title>Seam Gen Setup Window</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/SeamGenSetup.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<para>Fill the items in the dialog as shown below and select the OK button.</para>
-<table>
- <title>Filling Project Items</title>
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Field Name</entry>
- <entry>Field Value</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>Project</entry>
- <entry>EclipseCon</entry>
- </row>
- <row>
- <entry>Seam project workspace</entry>
- <entry><your project directory></entry>
- </row>
- <row>
- <entry>JBoss AS Home directory</entry>
- <entry><JBoss AS Home Dir></entry>
- </row>
- <row>
- <entry>Driver Location</entry>
- <entry><seam>/<seam-gen>/lib/hsqldb.jar</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- <para>The plug-in will initialize the Seam Gen ant tasks that simplify all key Seam
- operations. We will invoke several of these ant tasks via the Seam Eclipse Plugin
- throughout this tutorial.</para>
- <para>The plug-in will also prompt you to create a project. Select "Yes" to create a
- Project. This step will create not only an Eclipse project but also all the required
- artifacts to get you started.</para>
- <para>The plug-in will also prompt you create a database connection. Select
- "Yes" to create a WTP Database connection that connects to the default HSQL DB
- instance that we have set up. If you are using any other database then set up the
- appropriate database settings in the Seam Gen setup window.</para>
- <para>At the end of this step you will see an Eclipse project called "EclipseCon"
- as shown below. This project has all the necessary elements required to deploy
- a Seam application.</para>
- <figure>
-<title>EclipseCon Project Structure</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/EclipseConProjectStructure.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<itemizedlist continuation="continues">
-<listitem>Start the application server. Open your favorite browser and point to the
-following URL http://localhost:8080/EclipseCon. You should see the following page:</listitem>
-</itemizedlist>
-<figure>
-<title>Created Project</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/CreatedProject.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<para>Congratulations! You have written your first Seam application.</para>
-<itemizedlist continuation="continues">
-<listitem>Let us take a look at the database connection that was created by the Eclipse
- Plugin and browse the database provided. The database connection view should now have a
- connection to our sample database as shown below.</listitem>
- </itemizedlist>
- <figure>
-<title>Connections View</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/ConnectionsView.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<para>Right click on the connection -> Reconnect. Just specify "sa" as the user id. The password
- field should be blank.</para>
- <para>You should now be able to browse the database and see the meta-data and query data using SQL.
- Your meta-data should look like the following:</para>
- <figure>
-<title>Meta-data View</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/Metadata.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-</section>
-<section id="GeneratingACRUDApplicationUsingSeamGen">
-<?dbhtml filename="GeneratingACRUDApplicationUsingSeamGen.html"?>
-<title>Generating a CRUD application using Seam Gen</title>
-<itemizedlist>
-<listitem>The next step in our exercise is to generate a full blown application using Seam Gen.
-This application will generate CRUD pages and Search pages for all the entities in the database.
-Click on Seam Gen -> Generate Entities. Seam Gen will connect to the database we defined in the
- setup part of the application and generate all the required components.</listitem>
- <listitem>Since Seam Gen is generating files on the file system that Eclipse does not know
- about, right click on the project name on your project and choose the Refresh item. This will let
- Eclipse know that there are new files and get them updated in the Eclipse project and deployed
- in the JBoss instance.</listitem>
- <listitem>Restart you application server, just in case those files have not been properly
- synchronized with the application server.</listitem>
- <listitem>Point your favorite browser to the following URL http://localhost:8080/EclipseCon.
- You will see the following page:</listitem>
- </itemizedlist>
- <figure>
-<title>EclipseCon Project</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/CreatedProject.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<itemizedlist continuation="continues">
-<listitem>Let us now look at one of the entities and see what has been generated. Click on the
- "Offices List" to see a search page that allows you to filter the list and the list of all the
- offices in the database.</listitem>
- <listitem>Type in USA in the country field and click on Search to get a list of offices in the
- USA as shown below.</listitem>
- </itemizedlist>
- <figure>
-<title>Search Panel</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/SearchPanel.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-
-<itemizedlist continuation="continues">
-<listitem>Let us now check out the editing capability of the generated Seam application. Select
- the first office code and click on the Edit button. You will be prompted for a userID and
- password. Use "seamuser" for both user and password. You should at this point see the edit page
- as shown below. Notice that the NOT NULL columns in the database table are automatically marked
- with the red * to indicate that they are required.</listitem>
- </itemizedlist>
- <figure>
-<title>Generated Edit Page</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/GeneratedEditPage.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<itemizedlist continuation="continues">
-<listitem>Change a few things and save changes. This should update the record in the database.
- There you have it. A simple and easy way to bootstrap your applications.</listitem>
- <listitem>Let us look at how validations are done in Seam. Go back to and edit another office
- record and this time leave the city blank and click on the Save button. You will see the default
- Seam validations get triggered. In this case the "value required" validation is fired as shown
- below.</listitem>
- </itemizedlist>
-<figure>
-<title>Error Reporting</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/ValidationInEditPage.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-</section>
-<section id="CustomizingTheGeneratedApplication">
-<?dbhtml filename="CustomizingTheGeneratedApplication.html"?>
-<title>Customizing the generated application</title>
-<itemizedlist>
-<listitem>Let us look at a couple of simple things we can change in the generated application
- to show you that the generated application can be customized. Let us start by changing the edit
- page that we just saw. We will clean up the labels using the Facelet designer as shown below.
- Open the view directory in your project and double click on the OfficeEdit.xhtml file.</listitem>
-</itemizedlist>
-<figure>
-<title>Facelet Designer</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/FaceletDesigner.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<para>Unlike other WYSIWYG editors which developers tend to hate, the visual designers in Red Hat
- Developer Studio are designed for developers to rapidly find their way in a source file, while
- still allowing them to visually look at a document.</para>
-
-<itemizedlist continuation="continues">
-<listitem>To change a label text, click on a label in the designer. This will position the
- cursor at the correct location in the source view. Type the new label there. The designer does
- not force the developer to use the WYSIWIG environment. Change all the labels for the edit page.</listitem>
- </itemizedlist>
- <para>Once you save the page, the IDE automatically rebuilds the application and re-deploys it.
- So, just reload your browser and you should see an updated web page like the following. If for
- some reason the re-deployment did not work, stop and restart the server normally resolves the issue.</para>
- <figure>
-<title>Edit Page</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/EditPage.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-</section>
-<section id="UsingHibernateToolsToInteractWithTheJPAEntities">
-<?dbhtml filename="UsingHibernateToolsToInteractWithTheJPAEntities.html"?>
-<title>Using Hibernate tools to interact with the JPA Entities</title>
-<para>As part of generating the application, Seam Gen also generates JPA entities that are used
- to interact with the database. Let us quickly take a look at Hibernate tools and see how we can
- interact with the database using HQL and the Hibernate Criteria API.</para>
- <itemizedlist>
- <listitem>Open the Hibernate Configurations View. You should be able to open the console like
- the other views we have seen so far in the tutorial. Your view should resemble the following:</listitem>
- </itemizedlist>
- <figure>
-<title>Hibernate Configurations View</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/HibernateConfigurationsView.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<itemizedlist continuation="continues">
-<listitem>Before we run the HQL, let us open up the "Hibernate Query Result" and the "Hibernate
- Dynamic SQL Preview" views. You should be able to do that in a manner similar to other views we
- have opened in this tutorial. Alternatively you can open the Hibernate Console Perspective where
- these views are opened up by default.</listitem>
- <listitem>Click on the "HQL" icon in the "Hibernate Configurations" view. This will open up
- the HQL Designer view as shown below. Also, select "EclipseCon" from the drop down menu next to
- the green "run" button.</listitem>
- </itemizedlist>
- <figure>
-<title>HQL Designer View</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/HQLDesignerView.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<itemizedlist continuation="continues">
-<listitem>Type in a simple query as shown above "from Offices o" and click on the green "run"
- button. You should see the result of the HQL query in the "Hibernate Query Result" window as
- shown below.</listitem>
- </itemizedlist>
- <figure>
-<title>Hibernate Query Result Window</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/HibernateQueryResultWindow.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<itemizedlist continuation="continues">
-<listitem>Click on any of the objects in the result and you should be able see the contents of
- the objects in the Property view as shown below. If you don't have the view open in your
- perspective, you can open this view like all other views in this tutorial.</listitem>
- </itemizedlist>
- <figure>
-<title>Property View</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/PropertyView.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<para>Select the "Hibernate Dynamic SQL Preview" view to the generated SQL. This is a great tool
-to see the SQL being generated by Hibernate for your HQL. Not only is this a great debugging tool,
- it is also a great way to optimize your HQL queries.</para>
- <figure>
-<title>Hibernate Dynamic SQL Preview</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/HibernateDynamicSQLPreview.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<itemizedlist continuation="continues">
-<listitem>Let us try a slightly more complex query. Type in the following query in the query
-window and see how the query result changes and the SQL Preview changes.</listitem>
- </itemizedlist>
- <programlisting role="JAVA"><![CDATA[select city, state, postalcode
- from Offices o
- where country = 'USA'
-]]></programlisting>
-<itemizedlist continuation="continues">
-<listitem>Let us try the Hibernate criteria APIs next. To use Hibernate Criteria APIs click on
-the "CRI" button in the Hibernate Configurations View. This will open the Criteria API designer
-view. Type in this simple criteria query as shown below and click on the green run button to see
- the results. Also, select "EclipseCon" from the drop down menu next to the green "run" button.</listitem>
- </itemizedlist>
- <programlisting role="JAVA"><![CDATA[session.createCriteria(Offices.class)
-]]></programlisting>
-<para>The results will be very similar to the HQL query except that the criteria query does not
-generate the SQL in the "Hibernate Dynamic SQL Preview" view.</para>
-<itemizedlist continuation="continues">
-<listitem>Let us try something a little more complex. Let us filter all offices in the USA as
-shown below. The results of this query should be very similar to the results of the HQL.</listitem>
- </itemizedlist>
- <programlisting role="JAVA"><![CDATA[session.createCriteria(Offices.class)
- .add(Restrictions.eq("country", "USA")) ;
-]]></programlisting>
-<itemizedlist continuation="continues">
-<listitem>Finally let us visually see the entity model of the generated JPA objects. Before we
- do that, open the "Hibernate Entity Model" view and select the "Configurations" option in the
- "Hibernate Configurations" view. The plug-in will show all the entities in a visual format.
- You can either manually align your objects or click on the "Layout" button on the right of the
- "Hibernate Entity Model" view to generate a default layout.</listitem>
- </itemizedlist>
- <figure>
-<title>Hibernate Entities</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/HibernateEntities.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-
-</section>
-<section id="AddingAJAXAndRichUIFeaturesToASeamApplication">
-<?dbhtml filename="AddingAJAXAndRichUIFeaturesToASeamApplication.html"?>
-<title>Adding AJAX and rich UI features to a Seam application</title>
-<para>A key feature of JBoss Seam and the Red Hat Developer Studio is that they make AJAX and rich
- UI web applications a breeze to develop. In this section of the tutorial, we will show you how
- to:</para>
- <itemizedlist>
- <listitem>Add AJAX features to automatically generated JSF Seam UI components</listitem>
- <listitem>Replace standard JSF UI components with AJAX enabled rich UI components provided by the
- Red Hat Developer Studio</listitem>
- <listitem>Use AJAX components to do live validation on web pages</listitem>
- </itemizedlist>
- <section id="AddingAJAXFeaturesToGeneratedUIComponents">
-<?dbhtml filename="AddingAJAXFeaturesToGeneratedUIComponents.html"?>
-<title>Adding AJAX features to generated UI components</title>
-<para>Let us now try to add some AJAX features to the generated Seam application. Click on the
- Payments List link on the top of the page. You will see a search page as shown below.</para>
- <figure>
-<title>Search Page</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/SearchPage.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<para>You can search for any "checknumber" by typing in the number or by paging through the list
- of payments. But what if you only knew a few of the digits/alphabets in the "checknumber"? It
- would be very useful to filter the list based on that. AJAX provides very useful techniques to
- build these types of applications and Ajax4Jsf provides the building blocks to simplify these
- techniques.</para>
- <para>Double Click on the PaymentsList.xhtml to open the visual facelet designer. You will
- notice that in the beginning of the source, Seam Gen has already add the tag library references
- to Ajax4Jsf and RichFaces as shown below.</para>
- <programlisting role="JAVA"><![CDATA[<ui:composition xmlns="http://www.w3.org/1999/xhtml"
- xmlns:s="http://jboss.com/products/seam/taglib"
- xmlns:ui="http://java.sun.com/jsf/facelets"
- xmlns:f="http://java.sun.com/jsf/core"
- xmlns:h="http://java.sun.com/jsf/html"
- xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
- xmlns:rich="http://richfaces.ajax4jsf.org/rich"
- template="layout/template.xhtml">
-]]></programlisting>
-<para>Next, locate the check number input field. We need to add AJAX to this field. Basically,
-as we type we want to update the table. Adding AJAX functionality usually requires two things:</para>
-<itemizedlist>
-<listitem>Letting the framework know on which event to send an AJAX request to the server.</listitem>
-<listitem>Specifying what component(s) to update with the output from the server.</listitem>
-</itemizedlist>
-<para>Ajax4Jsf provides a simple JSF component <emphasis role="bold"><property><aj4:support></property></emphasis> that simplifies this process. Let us
-take our example and add AJAX to it.</para>
-<itemizedlist>
-<listitem>Click on the checknumber field in the visual designer, it will position you at the
-correct location in the source. You will notice that the inputText tag does not have a closing
-tag. Let us add a closing tag to the input text field as shown below.</listitem>
-</itemizedlist>
-<programlisting role="JSP"><![CDATA[<h:inputText id="checknumber"
- value="#{paymentsList.payments.checknumber}">
- <a4j:support event="onkeyup" reRender="paymentsList"/>
- </h:inputText>
-]]></programlisting>
-<itemizedlist continuation="continues">
-<listitem>Now let us add the AJAX support tag to let Ajax4Jsf know that when the user presses a
- key we want to go to the server to get a list of payments that match the characters entered in
- the checknumber text box. Add the tag that is highlighted below to the inputText tag.</listitem>
-</itemizedlist>
-<programlisting role="JSP"><![CDATA[<h:inputText id="checknumber"
- value="#{paymentsList.payments.checknumber}">
- <a4j:support event="onkeyup" reRender="paymentsList"/>
- </h:inputText>
-]]></programlisting>
-<para>This tag is pretty self explanatory, it posts the server when a key is pressed and then
- takes the response from the server and re-renders the section of the page that has an id of
- "paymentList".</para>
- <itemizedlist continuation="continues">
-<listitem>If you follow along in the page, you will see that the section that displays the
-results is in a div tag that has an id of "paymentsList"</listitem>
-</itemizedlist>
-<programlisting role="JSP"><![CDATA[<div class="results" id="paymentsList">
- <h3>search results</h3>
- <h:outputText value="No payments exists"
- rendered="#{empty paymentsList.resultList}"/>
- ...
- </div>
-]]></programlisting>
-<itemizedlist continuation="continues">
-<listitem>Save the changes and refresh your browser. You will see that as you type characters
-in the checknumber field, all payments that begin with those characters will be displayed in the
-table automatically.</listitem>
-</itemizedlist>
-<figure>
-<title>Data Fields</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/DataFields.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<para>But there is still one more problem in this page, you will see that the "Next" and
- "Previous" buttons will be displayed even for search results that are small as shown above.</para>
- <itemizedlist continuation="continues">
-<listitem>The tag that we added in the previous step only updates the table. Let us add an AJAX
-region around the page buttons at the bottom of the table. This will allow Ajax4Jsf to update
-those buttons independently.</listitem>
-</itemizedlist>
-<programlisting role="JSP"><![CDATA[<a4j:outputPanel ajaxRendered="true">
- <div class="tableControl">
- ...
- </div>
- </a4j:outputPanel>
-]]></programlisting>
-<para>Add an <emphasis role="bold"><property><a4j:outputPanel></property></emphasis> tag around the page buttons as shown above and run the page again.
- If the result list is small, you will see that the page buttons are no longer visible as shown
- below.</para>
- <figure>
-<title>Datatable With No Page Buttons</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/NoButtons.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<itemizedlist continuation="continues">
-<listitem>Let add one more thing to complete this part of the sample. When we type a character in
- the "checknumber" field, there is no visual feedback to the user that there is a request being
- made to the server.</listitem>
- </itemizedlist>
- <para>Ajax4Jsf has a pre-built tag <emphasis role="bold"><property><a4j:status></property></emphasis> that allows you to either render a text or an
- image in response to an AJAX event. Add the following code, right after the end of the
- <emphasis role="bold"><property><h:inputText></property></emphasis> tag.</para>
- <programlisting role="JSP"><![CDATA[<a4j:status>
- <f:facet name="start">
- <h:graphicImage value="/img/ajax-loader.gif" style="border: 1px solid #E0E0E0"/>
- </f:facet>
- </a4j:status>
-]]></programlisting>
-<para>Save changes to the page and refresh the browser. You will see the image when the AJAX
-request is active. The image will disappear as soon as the response is received.</para>
-<itemizedlist continuation="continues">
-<listitem>Finally, let us place the image beside the "checknumber" text box. Place a
-<emphasis role="bold"><property><h:panelGroup></property></emphasis> around the <emphasis role="bold"><property><h:inputText></property></emphasis> and <emphasis role="bold"><property><a4j:status></property></emphasis> tags as shown below.
-Save changes and refresh the browser. You should see the image right next to the text box.</listitem>
- </itemizedlist>
- <programlisting role="JSP"><![CDATA[<h:panelGroup>
- <h:inputText id="checknumber"
- value="#{paymentsList.payments.checknumber}">
- <a4j:support event="onkeyup"
- reRender="paymentsList"/>
- </h:inputText>
- <a4j:status>
- <f:facet name="start">
- <h:graphicImage value="/img/ajax-loader.gif"
- style="border: 1px solid #E0E0E0"/>
- </f:facet>
- </a4j:status>
- </h:panelGroup>
-]]></programlisting>
-<para>Although this example was a bit long, it shows how easy it is to add AJAX capabilities to
-an existing Seam application.</para>
-</section>
-<section id="AddingRichfacesComponentsToaSeamApplication">
-<?dbhtml filename="AddingRichfacesComponentsToaSeamApplication.html"?>
-<title>Adding RichFaces components to a Seam application</title>
-<para>Now that we have seen how AJAX can bring interactivity to an application, let us add rich
-controls that will improve the user experience. RichFaces provides numerous rich controls that
-can be added to an application. In this section we will add spinner and slider controls that
-allow users to change numerical values without using the keyboard.</para>
-<para>Double Click on the OrderdetailsEdit.xhtml to open the visual facelet designer. You will
- notice that in the beginning of the source, Seam Gen has already included the tag library
- references to Ajax4Jsf and RichFaces as shown below.</para>
- <programlisting role="JSP"><![CDATA[<ui:composition xmlns="http://www.w3.org/1999/xhtml"
- xmlns:s="http://jboss.com/products/seam/taglib"
- xmlns:ui="http://java.sun.com/jsf/facelets"
- xmlns:f="http://java.sun.com/jsf/core"
- xmlns:h="http://java.sun.com/jsf/html"
- xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
- xmlns:rich="http://richfaces.ajax4jsf.org/rich"
- template="layout/template.xhtml">
-]]></programlisting>
-<para>In this page, we are going to replace the "quantityordered" text box with the spinner
- control.</para>
- <itemizedlist>
- <listitem>In the visual view of the page, click on the "quantityordered" text box, this will
- select the appropriate markup in the source view. Delete the selected markup.</listitem>
- </itemizedlist>
- <figure>
-<title>Deleting Selected Markup</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/DeletingSelectedMarkup.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<para>We will replace the <emphasis role="bold"><property><h:inputText></property></emphasis> tag with a pre-built <emphasis role="bold"><property><rich:inputNumberSpinner></property></emphasis> tag.
- The spinner control tag is very simple to use and like all other JSF controls, it has a value
- attribute that can be bound to any JSF Managed Bean or Seam component. The designer allows you
- to visually find all the beans available as shown below. Right
- click on the <emphasis role="bold"><property><rich:inputNumberSpinner></property></emphasis> input field and select "<emphasis role="bold"><property><rich:inputNumberSpinner></property></emphasis> Attributes".</para>
- <figure>
-<title>Replacing Tags</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/ReplacingTags.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<para>The minValue and maxValue are self explanatory, they represent the minimum and maximum
- values for the spinner. Place the following tag in your page.</para>
- <programlisting role="JSP"><![CDATA[<rich:inputNumberSpinner
- value="#{orderdetailsHome.definedInstance.quantityordered}"
- inputStyle="width:30px; height:20px"
- minValue="0"
- maxValue="100"
- required="true"/>
-]]></programlisting>
-
-<itemizedlist continuation="continues">
-<listitem>Save changes and refresh the browser page. Your output page should look like this:</listitem>
-</itemizedlist>
-<figure>
-<title>Output Page</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/OutputPage.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<itemizedlist continuation="continues">
-<listitem>Although this is not the best situation to use a slider, let us take a quick look at
-another RichFaces control <emphasis role="bold"><property><rich:inputNumberSlider></property></emphasis>. The slider control is similar to the the
-spinner control; it is bound to the same object. Replace the spinner with the following markup.
-Save the page and refresh your browser window.</listitem>
-</itemizedlist>
-<programlisting role="JSP"><![CDATA[<rich:inputNumberSlider
- value="#{orderdetailsHome.definedInstance.quantityordered}"
- styleClass="slider"
- width="200"/>
-]]></programlisting>
-<figure>
-<title>InputNumberSlider Settings</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/InputNumberSliderSettings.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<itemizedlist continuation="continues">
-<listitem>Seam Gen also generates a date picker control for all date fields in an edit page.
- Click on "Order List" and edit one of the orders to see an example of the date picker control
- that is bundled with Seam.</listitem>
-</itemizedlist>
-
-<figure>
-<title>Order List</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/OrderedList.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-
-</section>
-<section id="ValidatingTheAJAXWay(LiveValidations)">
-<?dbhtml filename="ValidatingTheAJAXWay(LiveValidations).html"?>
-<title>Validating the AJAX way (Live Validations)</title>
-<para>Seam Gen also generates field validation code that leverages AJAX techniques, by providing
- immediate feedback to users who use these applications. To see an example of this, go back to
- the Office Edit page and leave the city blank and tab out of the field. Seam will immediately
- validate the field and tell you that the value is required.</para>
- <figure>
-<title>Office Edit Page</title>
-<mediaobject>
- <imageobject>
- <imagedata fileref="images/OfficeEditPage.png"/>
- </imageobject>
-</mediaobject>
-</figure>
-<para>To provide this functionality for every required field in the page Seam generates the
- following markup:</para>
-<programlisting role="JSP"><![CDATA[<s:decorate id="cityDecoration">
-<h:inputText id="city"
- required="true"
- size="50"
- maxlength="50"
- value="#{officesHome.instance.city}">
- <a:support event="onblur" reRender="cityDecoration"/>
- </h:inputText>
- </s:decorate>
-]]></programlisting>
-<para>Seam uses Ajax4Jsf to make a server side call to validate the field.</para>
-</section>
-</section>
-</chapter>
17 years, 6 months