Author: laubai
Date: 2009-11-23 21:12:51 -0500 (Mon, 23 Nov 2009)
New Revision: 11655
Modified:
tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Concepts.xml
tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Configuration.xml
tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Conversations.xml
tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Events.xml
tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Groovy.xml
tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Jms.xml
tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Security.xml
tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Tutorial.xml
tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Webservices.xml
tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Xml.xml
Log:
Commented out visible TODO items for CP07 build.
Modified: tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Concepts.xml
===================================================================
--- tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Concepts.xml 2009-11-24
00:33:31 UTC (rev 11654)
+++ tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Concepts.xml 2009-11-24
02:12:51 UTC (rev 11655)
@@ -15,7 +15,7 @@
Let's start by describing the contexts built in to Seam.
</para>
- <sect1>
+ <section>
<title>Seam contexts</title>
<para> Seam contexts are created and destroyed by the framework. The
application does not control context
demarcation via explicit Java API calls. Context are usually implicit. In
some cases, however, contexts are
@@ -61,16 +61,16 @@
Let's look at each context in turn.
</para>
- <sect2>
+ <section>
<title>Stateless context</title>
<para>
Components which are truly stateless (stateless session beans, primarily)
always live in the
stateless context (this is really a non-context). Stateless components
are not very interesting, and are
arguably not very object-oriented. Nevertheless, they are important and
often useful.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Event context</title>
<para>
The event context is the "narrowest" stateful context, and is a
generalization of the notion of the
@@ -83,9 +83,9 @@
When you invoke a Seam component via RMI, or Seam Remoting, the event
context is created and
destroyed just for the invocation.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Page context</title>
<para>
The page context allows you to associate state with a particular instance
of a rendered page. You can
@@ -95,9 +95,9 @@
serialized to the client, so this construct is extremely robust with
respect to multi-window operation
and the back button.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Conversation context</title>
<para>
The conversation context is a truly central concept in Seam. A
<emphasis>conversation</emphasis> is a
@@ -145,9 +145,9 @@
<para>
Alternatively, Seam may be configured to keep conversational state in the
client browser.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Session context</title>
<para>
A session context holds state associated with the user login session.
While there are some cases
@@ -157,9 +157,9 @@
<para>
In a JSR-168 portal environment, the session context represents the
portlet session.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Business process context</title>
<para>
The business process context holds state associated with the long running
business process. This
@@ -169,18 +169,18 @@
business process is defined externally using a <emphasis>process
definition language</emphasis>, so
there are no special annotations for business process demarcation.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Application context</title>
<para>
The application context is the familiar servlet context from the servlet
spec. Application context is
mainly useful for holding static information such as configuration data,
reference data or metamodels.
For example, Seam stores its own configuration and metamodel in the
application context.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Context variables</title>
<para>
A context defines a namespace, a set of <emphasis>context
variables</emphasis>. These work much the
@@ -207,9 +207,9 @@
Usually, however, we obtain components from a context via injection, and
put component instances into
a context via outjection.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Context search priority</title>
<para>
Sometimes, as above, component instances are obtained from a particular
known scope. Other times, all
@@ -242,9 +242,9 @@
Whenever you access a component by name from a JSF page, a priority
search occurs.
</para>
- </sect2>
+ </section>
- <sect2 id="concurrency">
+ <section id="concurrency">
<title>Concurrency model</title>
<para>
Neither the servlet nor EJB specifications define any facilities for
managing concurrent requests
@@ -279,11 +279,11 @@
This concurrency model means that AJAX clients can safely use volatile
session and conversational
state, without the need for any special work on the part of the
developer.
</para>
- </sect2>
+ </section>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Seam components</title>
<para>
Seam components are POJOs (Plain Old Java Objects). In particular, they are
JavaBeans or EJB 3.0
@@ -310,7 +310,7 @@
</listitem>
</itemizedlist>
- <sect2>
+ <section>
<title>Stateless session beans</title>
<para>
Stateless session bean components are not able to hold state across
multiple invocations. Therefore,
@@ -334,9 +334,9 @@
or <literal>@In(create=true)</literal>. They should not be
directly instantiated via JNDI lookup
or the <literal>new</literal> operator.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Stateful session beans</title>
<para>
Stateful session bean components are able to hold state not only across
multiple invocations of the
@@ -364,9 +364,9 @@
or <literal>@In(create=true)</literal>. They should not be
directly instantiated via JNDI lookup
or the <literal>new</literal> operator.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Entity beans</title>
<para>
Entity beans may be bound to a context variable and function as a seam
component. Because entities
@@ -397,9 +397,9 @@
Seam entity bean components may be instantiated using
<literal>Component.getInstance()</literal>,
<literal>@In(create=true)</literal> or directly using the
<literal>new</literal> operator.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>JavaBeans</title>
<para>
Javabeans may be used just like a stateless or stateful session bean.
However, they do not provide
@@ -423,9 +423,9 @@
or <literal>@In(create=true)</literal>. They should not be
directly instantiated using the
<literal>new</literal> operator.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Message-driven beans</title>
<para>
Message-driven beans may function as a seam component. However,
message-driven beans are called quite
@@ -441,9 +441,9 @@
Message-driven beans are never instantiated by the application. They are
instantiated by the EJB
container when a message is received.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Interception</title>
<para>
In order to perform its magic (bijection, context demarcation,
validation, etc), Seam must intercept
@@ -476,9 +476,9 @@
</interceptor-binding>
</assembly-descriptor>]]></programlisting>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Component names</title>
<para>
All seam components need a name. We can assign a name to a component
using the
@@ -545,9 +545,9 @@
name by the <literal>components.xml</literal> file included
in the Seam jar.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Defining the component scope</title>
<para>
We can override the default scope (context) of a component using the
<literal>@Scope</literal>
@@ -566,9 +566,9 @@
<literal>org.jboss.seam.ScopeType</literal> defines an
enumeration of possible scopes.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Components with multiple roles</title>
<para>
Some Seam component classes can fulfill more than one role in the system.
For example, we often have
@@ -601,9 +601,9 @@
...
}]]></programlisting>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Built-in components</title>
<para>
Like many good frameworks, Seam eats its own dogfood and is implemented
mostly as a set of built-in
@@ -617,11 +617,11 @@
convenient static <literal>instance()</literal> methods:
</para>
<programlisting
role="JAVA"><![CDATA[FacesMessages.instance().add("Welcome back,
#{user.name}!");]]></programlisting>
- </sect2>
+ </section>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Bijection</title>
<para>
<emphasis>Dependency injection</emphasis> or
<emphasis>inversion of control</emphasis> is by now a familiar
@@ -795,9 +795,9 @@
...
}]]></programlisting>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Lifecycle methods</title>
<para>
@@ -831,9 +831,9 @@
specifying <literal>@Startup(depends={....})</literal>.
</para>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Conditional installation</title>
<para>
@@ -949,9 +949,9 @@
use it in your application.
</para>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Logging</title>
<para>
@@ -1024,9 +1024,9 @@
classpath, Seam with use it. If it is not, Seam will use JDK logging.
</para>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>The <literal>Mutable</literal> interface and
<literal>@ReadOnly</literal></title>
<para>
Many application servers feature an amazingly broken implementation of
<literal>HttpSession</literal>
@@ -1128,9 +1128,9 @@
of managing an entity bean instance using a Seam component.
</para>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Factory and manager components</title>
<para>
We often need to work with objects that are not Seam components. But we still
want to be able to inject
@@ -1240,6 +1240,6 @@
on every access, a consistent view is provided.
</para>
- </sect1>
+ </section>
</chapter>
Modified: tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Configuration.xml
===================================================================
---
tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Configuration.xml 2009-11-24
00:33:31 UTC (rev 11654)
+++
tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Configuration.xml 2009-11-24
02:12:51 UTC (rev 11655)
@@ -8,12 +8,12 @@
off by the following sections; you'll never need to type any of this stuff
yourself, since you can just copy and
paste from the example applications! </para>
- <sect1>
+ <section>
<title>Basic Seam configuration</title>
<para> First, let's look at the basic configuration that is needed
whenever we use Seam with JSF. </para>
- <sect2>
+ <section>
<title>Integrating Seam with JSF and your servlet
container</title>
<para> Of course, you need a faces servlet! </para>
@@ -67,9 +67,9 @@
<param-value>true</param-value>
</context-param>]]></programlisting>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Using facelets</title>
<para> If you want follow our advice and use facelets instead of JSP,
add the following lines to
@@ -86,9 +86,9 @@
<param-value>.xhtml</param-value>
</context-param>]]></programlisting>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Seam Resource Servlet</title>
<para> The Seam Resource Servlet provides resources used by Seam
Remoting, captchas (see the security
@@ -104,9 +104,9 @@
<servlet-name>Seam Resource Servlet</servlet-name>
<url-pattern>/seam/resource/*</url-pattern>
</servlet-mapping>]]></programlisting>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Seam servlet filters</title>
<para> Seam doesn't need any servlet filters for basic operation.
However, there are several features which
@@ -158,7 +158,7 @@
<para> Adding the master filter enables the following built-in filters.
</para>
- <sect3>
+ <section>
<title>Exception handling</title>
<para> This filter provides the exception mapping functionality in
<literal>pages.xml</literal> (almost
all applications will need this). It also takes care of rolling back
uncommitted transactions when
@@ -178,9 +178,9 @@
</components>]]></programlisting>
- </sect3>
+ </section>
- <sect3>
+ <section>
<title>Conversation propagation with redirects</title>
<para> This filter allows Seam to propagate the conversation
context across browser redirects. It
intercepts any browser redirects and adds a request parameter that
specifies the Seam conversation
@@ -190,9 +190,9 @@
in <literal>components.xml</literal>: </para>
<programlisting
role="XML"><![CDATA[<web:redirect-filter
url-pattern="*.seam"/>]]></programlisting>
- </sect3>
+ </section>
- <sect3>
+ <section>
<title>Multipart form submissions</title>
<para> This feature is necessary when using the Seam file upload
JSF control. It detects multipart form
requests and processes them according to the multipart/form-data
specification (RFC-2388). To
@@ -217,9 +217,9 @@
this value, the request will be aborted. The default setting
is 0 (no size limit). </para>
</listitem>
</itemizedlist>
- </sect3>
+ </section>
- <sect3>
+ <section>
<title>Character encoding</title>
<para> Sets the character encoding of submitted form data.
</para>
@@ -244,9 +244,9 @@
already specify an encoding. The default setting is
<literal>false</literal>. </para>
</listitem>
</itemizedlist>
- </sect3>
+ </section>
- <sect3>
+ <section>
<title>RichFaces</title>
<para>
@@ -292,9 +292,9 @@
</listitem>
</itemizedlist>
- </sect3>
+ </section>
- <sect3>
+ <section>
<title>Identity Logging</title>
<para>
@@ -312,9 +312,9 @@
<web:logging-filter url-pattern="*.seam"/>
</components>]]></programlisting>
- </sect3>
+ </section>
- <sect3>
+ <section>
<title>Context management for custom servlets</title>
<para> Requests sent direct to some servlet other than the JSF
servlet are not processed through the JSF
lifecycle, so Seam provides a servlet filter that can be applied to
any other servlet that needs
@@ -339,9 +339,9 @@
Seam exposes the conversation id as a property of the built in
component
<literal>conversation</literal>. </para>
- </sect3>
+ </section>
- <sect3>
+ <section>
<title>Adding custom filters</title>
<para> Seam can install your filters for you, allowing you to
specify <emphasis>where</emphasis> in the
chain your filter is placed (the servlet specification doesn't
provide a well defined order if you
@@ -360,10 +360,10 @@
should be further down the chain than the RichFaces filter
(<literal>(a)Filter(within="org.jboss.seam.web.ajax4jsfFilter")</literal>).
</para>
- </sect3>
- </sect2>
+ </section>
+ </section>
- <sect2>
+ <section>
<title>Integrating Seam with your EJB container</title>
<para> We need to apply the
<literal>SeamInterceptor</literal> to our Seam components. The simplest way
to
@@ -414,9 +414,9 @@
<programlisting
role="XML"><![CDATA[<transaction:ejb-transaction/>]]></programlisting>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Don't forget!</title>
<para> There is one final item you need to know about. You must place a
<literal>seam.properties</literal>,
@@ -436,11 +436,11 @@
component explicitly in <literal>components.xml</literal>,
just like some other competing frameworks do!
I think you'll like our way better. </para>
- </sect2>
+ </section>
- </sect1>
+ </section>
- <sect1 id="alt-jpa-providers">
+ <section id="alt-jpa-providers">
<title>Using Alternate JPA Providers</title>
<para> Seam comes packaged and configured with Hibernate as the default JPA
provider.
@@ -482,9 +482,9 @@
provider needs. Don't forget to package your new provider's jar
files in the
application if they are needed.
</para>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Configuring Seam in Java EE 5</title>
<mediaobject>
@@ -498,7 +498,7 @@
<para> If you're running in a Java EE 5 environment, this is all the
configuration required to start using Seam! </para>
- <sect2>
+ <section>
<title>Packaging</title>
<para> Once you've packaged all this stuff together into an EAR,
the archive structure will look something
@@ -564,11 +564,11 @@
only about a third of the way there. If you're too overwhelmed by all
this tedious configuration stuff,
feel free to skip over the rest of this section and come back to it
later. </para>
- </sect2>
+ </section>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Configuring Seam in J2EE</title>
<para> Seam is useful even if you're not yet ready to take the plunge
into EJB 3.0. In this case you would use
@@ -596,7 +596,7 @@
JavaBeans instead of EJB3, and another version that uses JPA and JavaBeans.
These example applications are
ready to deploy into any J2EE application server. </para>
- <sect2>
+ <section>
<title>Boostrapping Hibernate in Seam</title>
<para> Seam will bootstrap a Hibernate
<literal>SessionFactory</literal> from your
@@ -610,9 +610,9 @@
<programlisting
role="XML"><![CDATA[<persistence:managed-hibernate-session
name="hibernateSession"
session-factory="#{hibernateSessionFactory}"/>]]></programlisting>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Boostrapping JPA in Seam</title>
<para> Seam will bootstrap a JPA
<literal>EntityManagerFactory</literal> from your
@@ -626,9 +626,9 @@
<programlisting
role="XML"><![CDATA[<persistence:managed-persistence-context
name="entityManager"
entity-manager-factory="#{entityManagerFactory}"/>]]></programlisting>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Packaging</title>
<para> We can package our application as a WAR, in the following
structure: </para>
@@ -668,10 +668,10 @@
<para> If we want to deploy Hibernate in a non-EE environment like
TestNG, we need to do a little
bit more work. </para>
- </sect2>
- </sect1>
+ </section>
+ </section>
- <sect1>
+ <section>
<title>Configuring Seam in Java SE, without JBoss Embedded</title>
<para> It is possible to use Seam completely outside of an EE environment.
In this case, you need to tell Seam
@@ -685,9 +685,9 @@
<programlisting
role="XML"><![CDATA[<transaction:hibernate-transaction
session="#{session}"/>]]></programlisting>
<para> Of course, you'll also need to define a
datasource.</para>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Configuring jBPM in Seam</title>
<para> Seam's jBPM integration is not installed by default, so
you'll need to enable jBPM by installing a
built-in component. You'll also need to explicitly list your process and
pageflow definitions. In
@@ -732,7 +732,7 @@
<para> The most important thing to notice here is that jBPM transaction
control is disabled. Seam or EJB3 should
control the JTA transactions. </para>
- <sect2>
+ <section>
<title>Packaging</title>
<para> There is not yet any well-defined packaging format for jBPM
configuration and process/pageflow
@@ -782,11 +782,11 @@
approveDocument.jpdl.xml
documentLifecycle.jpdl.xml]]></programlisting>
- </sect2>
+ </section>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Configuring SFSB and Session Timeouts in JBoss AS</title>
<para> It is very important that the timeout for Stateful Session Beans is
set higher than the timeout for HTTP
@@ -829,9 +829,9 @@
<para> To override this value for your own application, simply include this
entry in your application's own
<literal>web.xml</literal>. </para>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Running Seam in a Portlet</title>
<para>
@@ -847,6 +847,6 @@
<para>Seam Integration with JBoss Portlet Bridge is marked as technology
preview, so standard support is not guaranteed.</para>
</note>
- </sect1>
+ </section>
</chapter>
Modified: tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Conversations.xml
===================================================================
---
tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Conversations.xml 2009-11-24
00:33:31 UTC (rev 11654)
+++
tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Conversations.xml 2009-11-24
02:12:51 UTC (rev 11655)
@@ -259,10 +259,10 @@
workspace management.
</para>
- <para>
+<!-- <para>
TODO: an example to show how a nested conversation prevents bad
stuff happening when you backbutton.
- </para>
+ </para>-->
<para>
Usually, if a component exists in a parent conversation of the
@@ -1243,4 +1243,4 @@
</itemizedlist>
</section>
</section>
-</chapter>
\ No newline at end of file
+</chapter>
Modified: tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Events.xml
===================================================================
--- tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Events.xml 2009-11-24
00:33:31 UTC (rev 11654)
+++ tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Events.xml 2009-11-24
02:12:51 UTC (rev 11655)
@@ -104,10 +104,10 @@
Furthermore, the view id mentioned in the
<literal><page></literal>
element need not correspond to a real JSP or Facelets page! So, we can
reproduce the functionality of a traditional action-oriented framework
- like Struts or WebWork using page actions. For example:
+ like Struts or WebWork using page actions.
</para>
- <programlisting><![CDATA[TODO: translate struts action into page
action]]></programlisting>
+<!-- <programlisting><![CDATA[TODO: translate struts action into page
action]]></programlisting>-->
<para>
Modified: tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Groovy.xml
===================================================================
--- tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Groovy.xml 2009-11-24
00:33:31 UTC (rev 11654)
+++ tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Groovy.xml 2009-11-24
02:12:51 UTC (rev 11655)
@@ -40,7 +40,7 @@
</listitem>
</itemizedlist>
- <para>TODO: write a quick overview of the Groovy syntax
add-on</para>
+<!-- <para>TODO: write a quick overview of the Groovy syntax
add-on</para>-->
</section>
<section>
Modified: tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Jms.xml
===================================================================
--- tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Jms.xml 2009-11-24
00:33:31 UTC (rev 11654)
+++ tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Jms.xml 2009-11-24
02:12:51 UTC (rev 11655)
@@ -31,7 +31,7 @@
</listitem>
</itemizedlist>
- <sect1>
+ <section>
<title>Asynchronicity</title>
<para>
@@ -69,7 +69,7 @@
same. They can just "plug and play" by adding a line to
<literal>components.xml</literal>.
</para>
- <sect2>
+ <section>
<title>Asynchronous methods</title>
<para>
@@ -219,9 +219,9 @@
Asynchronous methods cannot return any other value to the caller.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Asynchronous methods with the Quartz Dispatcher</title>
<para>
@@ -336,9 +336,9 @@
<para>The <literal>@IntervalDuration</literal>,
<literal>@IntervalCron</literal>, and
<literal>@IntervalNthBusinessDay</literal> annotations are mutually exclusive.
If they are used in the same method, a <literal>RuntimeException</literal>
will be thrown.</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Asynchronous events</title>
<para>
Component-driven events may also be asynchronous. To raise an event for
asynchronous
@@ -349,11 +349,11 @@
Components may observe asynchronous events in the usual way, but remember
that only the
business process context is propagated to the asynchronous thread.
</para>
- </sect2>
+ </section>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Messaging in Seam</title>
<para>
@@ -361,7 +361,7 @@
Seam components.
</para>
- <sect2>
+ <section>
<title>Configuration</title>
<para>
To configure Seam's infrastructure for sending JMS messages,
@@ -395,9 +395,9 @@
auto-create="true"
queue-jndi-name="queue/paymentQueue"/>]]></programlisting>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Sending messages</title>
<para>
Now, you can inject a JMS <literal>TopicPublisher</literal> and
@@ -438,24 +438,24 @@
}
}]]></programlisting>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Receiving messages using a message-driven bean</title>
<para>
You can process messages using any EJB3 message driven bean. Message-driven
beans may even be Seam components, in which case it is possible to inject
other event and application scoped Seam components.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Receiving messages in the client</title>
<para>
Seam Remoting lets you subscribe to a JMS topic from client-side JavaScript.
This is
described in <xref linkend="remoting"/>.
</para>
- </sect2>
+ </section>
- </sect1>
+ </section>
</chapter>
Modified: tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Security.xml
===================================================================
--- tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Security.xml 2009-11-24
00:33:31 UTC (rev 11654)
+++ tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Security.xml 2009-11-24
02:12:51 UTC (rev 11655)
@@ -8,7 +8,7 @@
for securing both domain and page resources within your Seam project.
</para>
- <sect1>
+ <section>
<title>Overview</title>
<para>
@@ -30,7 +30,7 @@
</listitem>
</itemizedlist>
- <sect2>
+ <section>
<title>Which mode is right for my application?</title>
<para>
@@ -44,10 +44,10 @@
If on the other hand, your application requires security checks based on
contextual state or complex business rules,
then you will require the features provided by the advanced mode.
</para>
- </sect2>
- </sect1>
+ </section>
+ </section>
- <sect1>
+ <section>
<title>Requirements</title>
<para>
@@ -79,9 +79,9 @@
</para>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Disabling Security</title>
<para>
@@ -104,9 +104,9 @@
<para>Page restrictions</para>
</listitem>
</itemizedlist>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Authentication</title>
<para>
@@ -115,7 +115,7 @@
authentication requirements Seam offers a much more simplified method of
authentication that hides the complexity of JAAS.
</para>
- <sect2>
+ <section>
<title>Configuration</title>
<para>
@@ -151,9 +151,9 @@
to authenticate the user.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Writing an authentication method</title>
<para>
@@ -205,7 +205,7 @@
authentication method returns <literal>false</literal> to indicate
the authentication failed.
</para>
- <sect3>
+ <section>
<title>Identity.addRole()</title>
<para>
@@ -228,9 +228,9 @@
</imageobject>
</mediaobject>
- </sect3>
+ </section>
- <sect3>
+ <section>
<title>Special Considerations</title>
<para>
@@ -257,11 +257,11 @@
userStats.setLastLoginDate(new Date());
userStats.incrementLoginCount();
}]]></programlisting>
- </sect3>
+ </section>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Writing a login form</title>
<para>
@@ -291,9 +291,9 @@
action will clear the security state of the currently authenticated user.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Simplified Configuration - Summary</title>
<para>
So to sum up, there are the three easy steps to configure authentication:
@@ -317,9 +317,9 @@
</listitem>
</itemizedlist>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Handling Security Exceptions</title>
<para>
@@ -375,9 +375,9 @@
Seam includes some special functionality for handling this problem.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Login Redirection</title>
<para>
@@ -420,9 +420,9 @@
the conversation in your <literal>authenticate()</literal> method.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>HTTP Authentication</title>
<para>
@@ -450,7 +450,7 @@
authentication realm that is presented to the user when they authenticate.
</para>
- <sect3>
+ <section>
<title>Writing a Digest Authenticator</title>
<para>
@@ -478,11 +478,11 @@
}
}
]]></programlisting>
- </sect3>
+ </section>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Advanced Authentication Features</title>
<para>
@@ -490,7 +490,7 @@
security requirements.
</para>
- <sect3>
+ <section>
<title>Using your container's JAAS configuration</title>
<para>
@@ -508,13 +508,13 @@
container your Seam application is deployed in. It merely instructs Seam
Security to authenticate
itself using the configured JAAS security policy.
</para>
- </sect3>
+ </section>
- </sect2>
+ </section>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Error Messages</title>
<para>
@@ -597,9 +597,9 @@
</tbody>
</tgroup>
</table>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Authorization</title>
<para>
@@ -610,7 +610,7 @@
above.
</para>
- <sect2>
+ <section>
<title>Core concepts</title>
<para>
@@ -628,9 +628,9 @@
for example <literal>customer:delete</literal>, or
<literal>customer:insert</literal>.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Securing components</title>
<para>
@@ -638,7 +638,7 @@
<literal>@Restrict</literal> annotation.
</para>
- <sect3>
+ <section>
<title>The @Restrict annotation</title>
<para>
@@ -718,9 +718,9 @@
in <literal>Identity</literal>, which in this case can then
determine if the user has the required
permission for modifying the specified <literal>Account</literal>
object.
</para>
- </sect3>
+ </section>
- <sect3>
+ <section>
<title>Inline restrictions</title>
<para>
Sometimes it might be desirable to perform a security check in code, without
using the
@@ -762,10 +762,10 @@
if (!Identity.instance().hasPermission("customer", "create", null))
throw new AuthorizationException("You may not create new
customers");]]></programlisting>
- </sect3>
- </sect2>
+ </section>
+ </section>
- <sect2>
+ <section>
<title>Security in the user interface</title>
<para>
@@ -826,9 +826,9 @@
</h:column>
</h:dataTable>]]></programlisting>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Securing pages</title>
<para>
Page security requires that the application is using a
<literal>pages.xml</literal> file, however is
@@ -859,9 +859,9 @@
<literal>admin</literal> role.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Securing Entities</title>
<para>
@@ -990,7 +990,7 @@
your JPA provider.
</para>
- <sect3>
+ <section>
<title>Entity security with JPA</title>
<para>
@@ -1014,9 +1014,9 @@
</entity-mappings>]]></programlisting>
- </sect3>
+ </section>
- <sect3>
+ <section>
<title>Entity security with a Managed Hibernate Session</title>
<para>
@@ -1025,13 +1025,13 @@
need to do anything special to use entity security.
</para>
- </sect3>
+ </section>
- </sect2>
+ </section>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Writing Security Rules</title>
<para>
@@ -1040,7 +1040,7 @@
checks are processed, and how to implement permission checks for a Seam
application.
</para>
- <sect2>
+ <section>
<title>Permissions Overview</title>
<para>
@@ -1051,9 +1051,9 @@
algorithms for evaluating large numbers of complex rules involving multiple
conditions.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Configuring a rules file</title>
<para>
@@ -1083,9 +1083,9 @@
<para>
Once the <literal>RuleBase</literal> component is configured,
it's time to write the security rules.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Creating a security rules file</title>
<para>
For this step you need to create a file called
<literal>security.drl</literal> in the
@@ -1215,7 +1215,7 @@
intended for.
</para>
- <sect3>
+ <section>
<title>Wildcard permission checks</title>
<para>
@@ -1237,13 +1237,13 @@
This rule allows users with the <literal>admin</literal> role to
perform <emphasis>any</emphasis> action for
any <literal>customer</literal> permission check.
</para>
- </sect3>
+ </section>
- </sect2>
+ </section>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>SSL Security</title>
<para>
@@ -1299,9 +1299,9 @@
sensitive data from pages using HTTPS to other pages using HTTP.
</para>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>CAPTCHA</title>
<para>
@@ -1311,7 +1311,7 @@
prevent automated processes from interacting with your application.
</para>
- <sect2>
+ <section>
<title>Configuring the CAPTCHA Servlet</title>
<para>
To get up and running, it is necessary to configure the Seam Resource Servlet,
which will provide the Captcha
@@ -1328,9 +1328,9 @@
<url-pattern>/seam/resource/*</url-pattern>
</servlet-mapping>]]></programlisting>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Adding a CAPTCHA to a form</title>
<para>
@@ -1349,9 +1349,9 @@
validated against the CAPTCHA when the form is submitted.
</para>
- </sect2>
+ </section>
- <sect2>
+ <section>
<title>Customising the CAPTCHA algorithm</title>
<para>
@@ -1378,11 +1378,11 @@
}
}]]></programlisting>
- </sect2>
+ </section>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Security Events</title>
<para>
@@ -1534,9 +1534,9 @@
</tgroup>
</table>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Run As</title>
<para>
@@ -1573,9 +1573,9 @@
<literal>RunAsOperation</literal>.
</para>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Extending the Identity component</title>
<para>
@@ -1621,6 +1621,6 @@
}
}]]></programlisting>
- </sect1>
+ </section>
</chapter>
Modified: tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Tutorial.xml
===================================================================
--- tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Tutorial.xml 2009-11-24
00:33:31 UTC (rev 11654)
+++ tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Tutorial.xml 2009-11-24
02:12:51 UTC (rev 11655)
@@ -163,12 +163,12 @@
</listitem>
<listitem>
<para>
- A Seam component must have a <emphasis>component
name</emphasis> specified by the <xref linkend="name-annotation" />
<literal>@Name</literal> annotation. This name must be unique within the Seam
application. When JSF asks Seam to resolve a currently undefined (null) context variable
whose name matches that of a Seam component, Seam will instantiate that component, and
bind the new instance to the context variable. In this case, Seam will instantiate a
<literal>User</literal> the first time JSF encounters a variable named
<literal>user</literal>.
+ A Seam component must have a <emphasis>component
name</emphasis> specified by the <xref linkend="name-annotation" />
annotation. This name must be unique within the Seam application. When JSF asks Seam to
resolve a currently undefined (null) context variable whose name matches that of a Seam
component, Seam will instantiate that component, and bind the new instance to the context
variable. In this case, Seam will instantiate a <literal>User</literal> the
first time JSF encounters a variable named <literal>user</literal>.
</para>
</listitem>
<listitem>
<para>
- Whenever Seam instantiates a component, it binds the new
instance to a context variable in the component's <emphasis>default
context</emphasis>. The default context is specified using the <xref
linkend="scope-annotation" /> <literal>@Scope</literal>
annotation. The <literal>User</literal> bean is a session scoped component.
+ Whenever Seam instantiates a component, it binds the new
instance to a context variable in the component's <emphasis>default
context</emphasis>. The default context is specified using the <xref
linkend="scope-annotation" /> annotation. The
<literal>User</literal> bean is a session scoped component.
</para>
</listitem>
<listitem>
@@ -271,7 +271,7 @@
</listitem>
<listitem>
<para>
- The <xref linkend="in-annotation" />
<literal>@In</literal> annotation marks an attribute of the bean as injected
by Seam. In this case, the attribute is injected from a context variable named
<literal>user</literal> (the instance variable name).
+ The <xref linkend="in-annotation" />
annotation marks an attribute of the bean as injected by Seam. In this case, the attribute
is injected from a context variable named <literal>user</literal> (the
instance variable name).
</para>
</listitem>
<listitem>
@@ -1059,48 +1059,60 @@
JavaBeans (There was no reason to use session beans, since they do not
access the database, or have any
other transactional behavior). Let's start with the process
definition: </para>
<!-- Can't use code hightlighting with callouts -->
- <example>
- <title></title>
- <programlisting>
-<process-definition name="todo">
+ <formalpara><title>todo.jpdl.xml Example</title>
+ <para>
+ <!-- <programlistingco> <areaspec> <area
id="todo-startstate" coords="3"/> <area
id="todo-tasknode" coords="7"/> <area id="todo-task"
coords="8"/> <area id="todo-assignment"
coords="9"/> <area id="todo-endstate" coords="14"/>
</areaspec> -->
+<programlisting><![CDATA[<process-definition name="todo">
+
+ <start-state name="start">
+ <transition to="todo"/>
+ </start-state>
+
+ <task-node name="todo">
+ <task name="todo" description="#{todoList.description}">
+ <assignment actor-id="#{actor.id}"/>
+ </task>
+ <transition to="done"/>
+ </task-node>
+
+ <end-state name="done"/>
-<start-state name="start">
-<transition to="todo"/>
-</start-state>
-
-<task-node name="todo">
-<task name="todo"
description="#{todoList.description}">
-<assignment actor-id="#{actor.id}"/>
-</task>
-<transition to="done"/>
-</task-node>
-
-<end-state name="done"/>
-
-</process-definition></programlisting>
-
- <para> The
<literal><start-state></literal> node represents the logical
start
- of the process. When the process starts, it immediately
transitions to the
- <literal>todo</literal> node. </para>
-
- <para> The
<literal><task-node></literal> node represents a
<emphasis>wait
- state</emphasis>, where business process
execution pauses, waiting for one or more
- tasks to be performed. </para>
-
- <para> The
<literal><task></literal> element defines a task to be performed
by
- a user. Since there is only one task defined on this
node, when it is complete,
- execution resumes, and we transition to the end state.
The task gets its description
- from a Seam component named
<literal>todoList</literal> (one of the JavaBeans). </para>
-
- <para> Tasks need to be assigned to a user or group of
users when they are created. In this
- case, the task is assigned to the current user, which we
get from a built-in Seam
- component named <literal>actor</literal>. Any
Seam component may be used to perform task
- assignment. </para>
-
- <para> The
<literal><end-state></literal> node defines the logical end of
the
- business process. When execution reaches this node, the
process instance is destroyed.
- </para>
- </example>
+</process-definition>]]>
+</programlisting>
+ </para>
+ </formalpara>
+ <formalpara><title>messages.jsp Explanatory
Notes</title>
+ <para>
+ <orderedlist>
+ <listitem>
+ <para>
+ The
<literal><![CDATA[<start-state>]]></literal> node represents the
logical beginning of the process. When the process begins, it immediately transitions to
the <literal>todo</literal> node.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The
<literal><![CDATA[<task-node>]]></literal> node represents a
<emphasis>wait state</emphasis>, where business process execution pauses,
waiting for one or more tasks to be performed.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The
<literal><![CDATA[<task>]]></literal> element defines a task to be
performed by a user. Since there is only one task defined on this node, when it is
complete, execution resumes, and we transition to the end state. The task receives its
description from the <literal>todoList</literal> JavaBean.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Tasks are assigned to a user or group of users when they are
created. Here, the task is assigned to the current user, retrieved from the built-in
<literal>actor</literal> Seam component. (Any Seam component may be used to
perform task assignment.)
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The
<literal><![CDATA[<end-state>]]></literal> node defines the
logical end of the business process. When execution reaches this node, the process
instance is destroyed.
+ </para>
+ </listitem>
+ </orderedlist>
+ </para>
+ </formalpara>
+
<para> If we view this process definition using the process definition
editor provided by JBossIDE, this is
@@ -1180,41 +1192,53 @@
<para> The second JavaBean is responsible for starting business process
instances, and ending tasks. </para>
<!-- Can't use code hightlighting with callouts -->
- <example>
- <title></title>
- <programlisting>
-@Name("todoList")
+ <formalpara><title>TodoList.java Example</title>
+ <para>
+<programlisting><![CDATA[@Name("todoList")
public class TodoList {
-
- private String description;
-
- public String getDescription()
- {
- return description;
- }
+ private String description;
+
+ public String getDescription() {
+ return description;
+ }
- public void setDescription(String description) {
- this.description = description;
- }
-
- @CreateProcess(definition="todo")
- public void createTodo() {}
-
- @StartTask @EndTask
- public void done() {}
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ @CreateProcess(definition="todo")
+ public void createTodo() {}
+
+ @StartTask @EndTask
+ public void done() {}
-}</programlisting>
-
- <para> The description property accepts user input form
the JSP page, and exposes it to the
- process definition, allowing the task description to be
set. </para>
-
- <para> The Seam
<literal>@CreateProcess</literal> annotation creates a new jBPM process
- instance for the named process definition. </para>
-
- <para> The Seam
<literal>@StartTask</literal> annotation starts work on a task. The
- <literal>@EndTask</literal> ends the
task, and allows the business process execution
- to resume. </para>
- </example>
+}]]>
+</programlisting>
+ </para>
+ </formalpara>
+ <!-- </example> -->
+ <formalpara><title>TodoList.java Explanatory
Notes</title>
+ <para>
+ <orderedlist>
+ <listitem>
+ <para>
+ The description property accepts user input from the JSP
page, and exposes it to the process definition, allowing the task description to be set.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The Seam <literal>@CreateProcess</literal>
annotation creates a new jBPM process instance for the named process definition.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The Seam <literal>@StartTask</literal> annotation
starts work on a task. The <literal>@EndTask</literal> ends the task, and
allows the business process execution to resume.
+ </para>
+ </listitem>
+ </orderedlist>
+ </para>
+ </formalpara>
+
<para> In a more realistic example,
<literal>@StartTask</literal> and <literal>@EndTask</literal>
would not
@@ -1379,10 +1403,10 @@
configuration and not very interesting. </para>
</section>
- <section>
+<!-- <section>
<title>How it works</title>
<para>TODO</para>
- </section>
+ </section>-->
</section>
@@ -1412,70 +1436,89 @@
<para> The example is implemented using one JavaBean, three JSP pages
and a jPDL pageflow definition. Let's
begin with the pageflow: </para>
<!-- Can't use code hightlighting with callouts -->
- <example>
- <title></title>
- <programlisting>
-<pageflow-definition
+ <formalpara><title>pageflow.jpdl.xml Example</title>
+ <para>
+<programlisting><![CDATA[<pageflow-definition
xmlns="http://jboss.com/products/seam/pageflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation="http://jboss.com/products/seam/pageflow
-
http://jboss.com/products/seam/pageflow-2.1.xsd"
- name="numberGuess">
+ xsi:schemaLocation=
+ "http://jboss.com/products/seam/pageflow
+
http://jboss.com/products/seam/pageflow-2.2.xsd"
+ name="numberGuess">
-<start-page name="displayGuess"
view-id="/numberGuess.jspx">
- <redirect/>
- <transition name="guess" to="evaluateGuess">
- <action expression="#{numberGuess.guess}"/>
- </transition>
- <transition name="giveup" to="giveup"/>
- </start-page>
+ <start-page name="displayGuess" view-id="/numberGuess.jspx">
+ <redirect/>
+ <transition name="guess" to="evaluateGuess">
+ <action expression="#{numberGuess.guess}"/>
+ </transition>
+ <transition name="giveup" to="giveup"/>
+ <transition name="cheat" to="cheat"/>
+ </start-page>
- <decision name="evaluateGuess"
expression="#{numberGuess.correctGuess}">
- <transition name="true" to="win"/>
- <transition name="false"
to="evaluateRemainingGuesses"/>
- </decision>
+ <decision name="evaluateGuess"
expression="#{numberGuess.correctGuess}">
+ <transition name="true" to="win"/>
+ <transition name="false" to="evaluateRemainingGuesses"/>
+ </decision>
- <decision name="evaluateRemainingGuesses"
expression="#{numberGuess.lastGuess}">
- <transition name="true" to="lose"/>
- <transition name="false" to="displayGuess"/>
- </decision>
+ <decision name="evaluateRemainingGuesses"
+ expression="#{numberGuess.lastGuess}">
+ <transition name="true" to="lose"/>
+ <transition name="false" to="displayGuess"/>
+ </decision>
- <page name="giveup" view-id="/giveup.jspx">
- <redirect/>
- <transition name="yes" to="lose"/>
- <transition name="no" to="displayGuess"/>
- </page>
+ <page name="giveup" view-id="/giveup.jspx">
+ <redirect/>
+ <transition name="yes" to="lose"/>
+ <transition name="no" to="displayGuess"/>
+ </page>
- <page name="win" view-id="/win.jspx">
- <redirect/>
- <end-conversation/>
- </page>
+ <process-state name="cheat">
+ <sub-process name="cheat"/>
+ <transition to="displayGuess"/>
+ </process-state>
- <page name="lose" view-id="/lose.jspx">
- <redirect/>
- <end-conversation/>
- </page>
+ <page name="win" view-id="/win.jspx">
+ <redirect/>
+ <end-conversation/>
+ </page>
-</pageflow-definition></programlisting>
-
- <para> The
<literal><page></literal> element defines a wait state where
the
- system displays a particular JSF view and waits for user
input. The
- <literal>view-id</literal> is the same JSF
view id used in plain JSF navigation rules.
- The <literal>redirect</literal> attribute
tells Seam to use post-then-redirect when
- navigating to the page. (This results in friendly browser
URLs.) </para>
-
- <para> The
<literal><transition></literal> element names a JSF outcome.
The
- transition is triggered when a JSF action results in that
outcome. Execution will then
- proceed to the next node of the pageflow graph, after
invocation of any jBPM transition
- actions. </para>
-
- <para> A transition
<literal><action></literal> is just like a JSF action,
- except that it occurs when a jBPM transition occurs. The
transition action can invoke
- any Seam component. </para>
-
- <para> A
<literal><decision></literal> node branches the pageflow, and
- determines the next node to execute by evaluating a JSF
EL expression. </para>
- </example>
+ <page name="lose" view-id="/lose.jspx">
+ <redirect/>
+ <end-conversation/>
+ </page>
+
+</pageflow-definition>]]>
+</programlisting>
+ </para>
+ </formalpara>
+ <!-- </example> -->
+ <formalpara><title>pageflow.jpdl.xml Explanatory
Notes.</title>
+ <para>
+ <orderedlist>
+ <listitem>
+ <para>
+ The
<literal><![CDATA[<page>]]></literal> element defines a wait
state, during which the system displays a particular JSF view and waits for user input.
The <literal>view-id</literal> is the same JSF view ID used in plain JSF
navigation rules. The <literal>redirect</literal> attribute tells Seam to use
post-then-redirect when navigating to the page. (This results in browser-friendly URLs.)
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The
<literal><![CDATA[<transition>]]></literal> element names a JSF
outcome. The transition itself is triggered when a JSF action results in the named
outcome. After any jBPM transition actions are invoked, execution will proceed to the next
node of the pageflow graph.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A transition
<literal><![CDATA[<action>]]></literal> is just like a JSF action,
except that it is triggered when a jBPM transition occurs. The transition action can
invoke any Seam component.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A
<literal><![CDATA[<decision>]]></literal> node branches the
pageflow, and determines the next node to be executed by evaluating a JSF EL expression.
+ </para>
+ </listitem>
+ </orderedlist>
+ </para>
+ </formalpara>
+
<para> Here is what the pageflow looks like in the JBoss Developer
Studio pageflow editor: </para>
@@ -1608,124 +1651,115 @@
<para> As is <literal>lose.jspx</literal> (which I
can't be bothered copy/pasting). Finally, the JavaBean
Seam component: </para>
<!-- Can't use code hightlighting with callouts -->
- <example>
- <title></title>
- <programlistingco>
- <areaspec>
- <area id="numberguess-create"
coords="13"/>
- </areaspec>
- <programlisting>
-@Name("numberGuess")
+ <formalpara><title>NumberGuess.java Example</title>
+ <para>
+<programlisting><![CDATA[@Name("numberGuess")
@Scope(ScopeType.CONVERSATION)
public class NumberGuess implements Serializable {
- private int randomNumber;
- private Integer currentGuess;
- private int biggest;
- private int smallest;
- private int guessCount;
- private int maxGuesses;
- private boolean cheated;
-
- @Create
- public void begin()
- {
- randomNumber = new Random().nextInt(100);
- guessCount = 0;
- biggest = 100;
- smallest = 1;
- }
-
- public void setCurrentGuess(Integer guess)
- {
- this.currentGuess = guess;
- }
-
- public Integer getCurrentGuess()
- {
- return currentGuess;
- }
-
- public void guess()
- {
- if (currentGuess>randomNumber)
- {
- biggest = currentGuess - 1;
- }
- if (currentGuess<randomNumber)
- {
- smallest = currentGuess + 1;
- }
- guessCount ++;
- }
-
- public boolean isCorrectGuess()
- {
- return currentGuess==randomNumber;
- }
-
- public int getBiggest()
- {
- return biggest;
- }
-
- public int getSmallest()
- {
- return smallest;
- }
-
- public int getGuessCount()
- {
- return guessCount;
- }
-
- public boolean isLastGuess()
- {
- return guessCount==maxGuesses;
- }
+ private int randomNumber;
+ private Integer currentGuess;
+ private int biggest;
+ private int smallest;
+ private int guessCount;
+ private int maxGuesses;
+ private boolean cheated;
+
+ @Create
+ public void begin() {
+ randomNumber = new Random().nextInt(100);
+ guessCount = 0;
+ biggest = 100;
+ smallest = 1;
+ }
+
+ public void setCurrentGuess(Integer guess) {
+ this.currentGuess = guess;
+ }
+
+ public Integer getCurrentGuess() {
+ return currentGuess;
+ }
+
+ public void guess() {
+ if (currentGuess>randomNumber) {
+ biggest = currentGuess - 1;
+ }
+ if (currentGuess<randomNumber) {
+ smallest = currentGuess + 1;
+ }
+ guessCount ++;
+ }
+
+ public boolean isCorrectGuess() {
+ return currentGuess==randomNumber;
+ }
+
+ public int getBiggest() {
+ return biggest;
+ }
+
+ public int getSmallest() {
+ return smallest;
+ }
+
+ public int getGuessCount() {
+ return guessCount;
+ }
+
+ public boolean isLastGuess() {
+ return guessCount==maxGuesses;
+ }
- public int getRemainingGuesses() {
- return maxGuesses-guessCount;
- }
+ public int getRemainingGuesses() {
+ return maxGuesses-guessCount;
+ }
- public void setMaxGuesses(int maxGuesses) {
- this.maxGuesses = maxGuesses;
- }
+ public void setMaxGuesses(int maxGuesses) {
+ this.maxGuesses = maxGuesses;
+ }
- public int getMaxGuesses() {
- return maxGuesses;
- }
+ public int getMaxGuesses() {
+ return maxGuesses;
+ }
- public int getRandomNumber() {
- return randomNumber;
- }
+ public int getRandomNumber() {
+ return randomNumber;
+ }
- public void cheated()
- {
- cheated = true;
- }
-
- public boolean isCheat() {
- return cheated;
- }
-
- public List<Integer> getPossibilities()
- {
- List<Integer> result = new ArrayList<Integer>();
- for(int i=smallest; i<=biggest; i++) result.add(i);
- return result;
- }
-
-}</programlisting>
- <calloutlist>
- <callout arearefs="numberguess-create">
- <para> The first time a JSP page asks for a
<literal>numberGuess</literal> component, Seam
- will create a new one for it, and the
<literal>@Create</literal> method will be invoked,
- allowing the component to initialize itself.
</para>
- </callout>
- </calloutlist>
- </programlistingco>
- </example>
+ public void cheated() {
+ cheated = true;
+ }
+
+ public boolean isCheat() {
+ return cheated;
+ }
+
+ public List<Integer> getPossibilities() {
+ List<Integer> result = new ArrayList<Integer>();
+ for(int i=smallest; i<=biggest; i++) result.add(i);
+ return result;
+ }
+
+}]]>
+</programlisting>
+ </para>
+ </formalpara>
+ <!-- </example> -->
+ <formalpara><title>NumberGuess.java Explanatory
Notes</title>
+ <para>
+ <orderedlist>
+ <listitem>
+ <para>
+ The first time a JSP page asks for a
<literal>numberGuess</literal> component, Seam creates a new component, and
the <literal>@Create</literal> method will be invoked, allowing the component
to initialize itself.
+ </para>
+ </listitem>
+ </orderedlist>
+ <!-- </programlistingco> -->
+ <!-- </example> -->
+ </para>
+ </formalpara>
+
@@ -1758,10 +1792,10 @@
</section>
- <section>
+<!-- <section>
<title>How it works</title>
<para>TODO</para>
- </section>
+ </section>-->
</section>
@@ -1937,208 +1971,216 @@
<para> The search functionality is implemented using a session-scope
stateful session bean, similar to the
one we saw in the message list example above. </para>
- <example>
- <title></title>
- <!-- Can't use code hightlighting with callouts -->
- <programlisting>
-@Stateful
+ <formalpara><title>HotelSearchingAction.java
Example</title>
+ <para>
+<!--<programlisting language="java"><xi:include
href="extras/booking.java" parse="text"
xmlns:xi="http://www.w3.org/2001/XInclude"></xi:include&g...
+ </example> -->
+<programlisting><![CDATA[@Stateful
@Name("hotelSearch")
@Scope(ScopeType.SESSION)
@Restrict("#{identity.loggedIn}")
-public class HotelSearchingAction implements HotelSearching
-{
+public class HotelSearchingAction implements HotelSearching {
- @PersistenceContext
- private EntityManager em;
-
- private String searchString;
- private int pageSize = 10;
- private int page;
-
- @DataModel
- private List<Hotel> hotels;
-
- public void find()
- {
- page = 0;
- queryHotels();
- }
- public void nextPage()
- {
- page++;
- queryHotels();
- }
-
- private void queryHotels()
- {
- hotels =
- em.createQuery("select h from Hotel h where lower(h.name) like #{pattern}
" +
- "or lower(h.city) like #{pattern} " +
- "or lower(h.zip) like #{pattern} " +
- "or lower(h.address) like #{pattern}")
+ @PersistenceContext
+ private EntityManager em;
+
+ private String searchString;
+ private int pageSize = 10;
+ private int page;
+
+ @DataModel
+ private List<Hotel> hotels;
+
+ public void find() {
+ page = 0;
+ queryHotels();
+ }
+ public void nextPage() {
+ page++;
+ queryHotels();
+ }
+
+ private void queryHotels() {
+ hotels = em.createQuery(
+ "select h from Hotel h where lower(h.name) like #{pattern}" +
+ "or lower(h.city) like #{pattern} " +
+ "or lower(h.zip) like #{pattern} " +
+ "or lower(h.address) like #{pattern}")
.setMaxResults(pageSize)
.setFirstResult( page * pageSize )
.getResultList();
- }
-
- public boolean isNextPageAvailable()
- {
- return hotels!=null && hotels.size()==pageSize;
- }
-
- public int getPageSize() {
- return pageSize;
- }
-
- public void setPageSize(int pageSize) {
- this.pageSize = pageSize;
- }
-
- @Factory(value="pattern", scope=ScopeType.EVENT)
- public String getSearchPattern()
- {
- return searchString==null ?
- "%" : '%' + searchString.toLowerCase().replace('*',
'%') + '%';
- }
-
- public String getSearchString()
- {
- return searchString;
- }
-
- public void setSearchString(String searchString)
- {
- this.searchString = searchString;
- }
-
- @Remove
- public void destroy() {}
-} </programlisting>
-
- <para> The EJB standard
<literal>@Stateful</literal> annotation identifies this class as a
- stateful session bean. Stateful session beans are scoped
to the conversation context by
- default. </para>
-
- <para> The <literal>@Restrict</literal>
annotation applies a security restriction to the
- component. It restricts access to the component allowing
only logged-in users. The
- security chapter explains more about security in Seam.
</para>
-
- <para> The
- <literal>@DataModel</literal>
- annotation exposes a <literal>List</literal>
as a JSF
- <literal>ListDataModel</literal>. This makes
it easy to implement clickable lists for
- search screens. In this case, the list of hotels is
exposed to the page as a
- <literal>ListDataModel</literal> in the
conversation variable named
- <literal>hotels</literal>. </para>
-
- <para> The EJB standard
<literal>@Remove</literal> annotation specifies that a stateful
- session bean should be removed and its state destroyed
after invocation of the annotated
- method. In Seam, all stateful session beans must define a
method with no parameters marked
- <literal>@Remove</literal>. This method
will be
- called when Seam destroys the session
context.</para>
- </example>
+ }
+
+ public boolean isNextPageAvailable() {
+ return hotels!=null && hotels.size()==pageSize;
+ }
+
+ public int getPageSize() {
+ return pageSize;
+ }
+
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+
+ @Factory(value="pattern", scope=ScopeType.EVENT)
+ public String getSearchPattern() {
+ return searchString==null ?
+ "%" : '%' + searchString.toLowerCase().replace('*',
'%') + '%';
+ }
+
+ public String getSearchString() {
+ return searchString;
+ }
+
+ public void setSearchString(String searchString) {
+ this.searchString = searchString;
+ }
+
+ @Remove
+ public void destroy() {}
+}]]>
+</programlisting>
+ </para>
+ </formalpara>
+ <formalpara><title>NumberGuess.java Explanatory
Notes</title>
+ <para>
+ <orderedlist>
+ <listitem>
+ <para>
+ The EJB standard <literal>@Stateful</literal>
annotation identifies this class as a stateful session bean. Stateful session beans are
scoped to the conversation context by default.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The <literal>@Restrict</literal> annotation
applies a security restriction to the component. It restricts access to the component,
allowing only logged-in users. The <!-- #retag: xref plz -->security chapter
explains more about security in Seam.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The <xref linkend="datamodel-annotation" />
annotation exposes a <literal>List</literal> as a JSF
<literal>ListDataModel</literal>. This makes it easy to implement clickable
lists for search screens. In this case, the list of hotels is exposed to the page as a
<literal>ListDataModel</literal> in the conversation variable named
<literal>hotels</literal>.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The EJB standard <literal>@Remove</literal>
annotation specifies that a stateful session bean should be removed and its state
destroyed after invocation of the annotated method. In Seam, all stateful session beans
must define a method <literal>@Remove</literal>, with no marked parameters.
This method will be called when Seam destroys the session context.
+ </para>
+ </listitem>
+ </orderedlist>
+ <!-- </programlistingco> -->
+ <!-- </example> -->
+ </para>
+ </formalpara>
+
<para> The main page of the application is a Facelets page. Let's
look at the fragment which relates to
searching for hotels: </para>
- <example>
- <title></title>
- <!-- Can't use code hightlighting with callouts -->
- <programlisting>
-<div class="section">
+ <formalpara><title>main.xhtml Example</title>
+ <para>
+<programlisting><![CDATA[<div class="section">
-<span class="errors">
- <h:messages globalOnly="true"/>
-</span>
+ <span class="errors">
+ <h:messages globalOnly="true"/>
+ </span>
-<h1>Search Hotels</h1>
+ <h1>Search Hotels</h1>
-<h:form id="searchCriteria">
-<fieldset>
- <h:inputText id="searchString"
value="#{hotelSearch.searchString}"
- style="width: 165px;">
- <a:support event="onkeyup"
actionListener="#{hotelSearch.find}"
- reRender="searchResults" />
- </h:inputText>
-  
- <a:commandButton id="findHotels" value="Find Hotels"
action="#{hotelSearch.find}"
- reRender="searchResults"/>
-  
- <a:status>
- <f:facet name="start">
- <h:graphicImage value="/img/spinner.gif"/>
- </f:facet>
- </a:status>
- <br/>
- <h:outputLabel for="pageSize">Maximum
results:</h:outputLabel> 
- <h:selectOneMenu value="#{hotelSearch.pageSize}"
id="pageSize">
- <f:selectItem itemLabel="5" itemValue="5"/>
- <f:selectItem itemLabel="10" itemValue="10"/>
- <f:selectItem itemLabel="20" itemValue="20"/>
- </h:selectOneMenu>
- </fieldset>
- </h:form>
+ <h:form id="searchCriteria">
+ <fieldset>
+ <h:inputText id="searchString"
value="#{hotelSearch.searchString}"
+ style="width: 165px;">
+ <a:support event="onkeyup"
actionListener="#{hotelSearch.find}"
+ reRender="searchResults" />
+ </h:inputText>
+  
+ <a:commandButton id="findHotels" value="Find Hotels"
+ action="#{hotelSearch.find}"
+ reRender="searchResults"/>
+  
+ <a:status>
+ <f:facet name="start">
+ <h:graphicImage value="/img/spinner.gif"/>
+ </f:facet>
+ </a:status>
+ <br/>
+ <h:outputLabel for="pageSize">Maximum
results:</h:outputLabel> 
+ <h:selectOneMenu value="#{hotelSearch.pageSize}"
id="pageSize">
+ <f:selectItem itemLabel="5" itemValue="5"/>
+ <f:selectItem itemLabel="10" itemValue="10"/>
+ <f:selectItem itemLabel="20" itemValue="20"/>
+ </h:selectOneMenu>
+ </fieldset>
+ </h:form>
- </div>
+</div>
- <a:outputPanel id="searchResults">
- <div class="section">
- <h:outputText value="No Hotels Found"
- rendered="#{hotels != null and hotels.rowCount==0}"/>
- <h:dataTable id="hotels" value="#{hotels}"
var="hot"
- rendered="#{hotels.rowCount>0}">
- <h:column>
- <f:facet name="header">Name</f:facet>
- #{hot.name}
- </h:column>
- <h:column>
- <f:facet name="header">Address</f:facet>
- #{hot.address}
- </h:column>
- <h:column>
- <f:facet name="header">City, State</f:facet>
- #{hot.city}, #{hot.state}, #{hot.country}
- </h:column>
- <h:column>
- <f:facet name="header">Zip</f:facet>
- #{hot.zip}
- </h:column>
- <h:column>
- <f:facet name="header">Action</f:facet>
- <s:link id="viewHotel" value="View Hotel"
- action="#{hotelBooking.selectHotel(hot)}"/>
- </h:column>
- </h:dataTable>
- <s:link value="More results" action="#{hotelSearch.nextPage}"
- rendered="#{hotelSearch.nextPageAvailable}"/>
- </div>
-</a:outputPanel>
+<a:outputPanel id="searchResults">
+ <div class="section">
+ <h:outputText value="No Hotels Found"
+ rendered="#{hotels != null and hotels.rowCount==0}"/>
+ <h:dataTable id="hotels" value="#{hotels}" var="hot"
+ rendered="#{hotels.rowCount>0}">
+ <h:column>
+ <f:facet name="header">Name</f:facet>
+ #{hot.name}
+ </h:column>
+ <h:column>
+ <f:facet name="header">Address</f:facet>
+ #{hot.address}
+ </h:column>
+ <h:column>
+ <f:facet name="header">City, State</f:facet>
+ #{hot.city}, #{hot.state}, #{hot.country}
+ </h:column>
+ <h:column>
+ <f:facet name="header">Zip</f:facet>
+ #{hot.zip}
+ </h:column>
+ <h:column>
+ <f:facet name="header">Action</f:facet>
+ <s:link id="viewHotel" value="View Hotel"
+ action="#{hotelBooking.selectHotel(hot)}"/>
+ </h:column>
+ </h:dataTable>
+ <s:link value="More results" action="#{hotelSearch.nextPage}"
+ rendered="#{hotelSearch.nextPageAvailable}"/>
+ </div>
+</a:outputPanel>]]>
</programlisting>
-
- <para> The RichFaces Ajax
<literal><a:support></literal> tag allows a JSF action
- event listener to be called by asynchronous
<literal>XMLHttpRequest</literal> when a
- JavaScript event like
<literal>onkeyup</literal> occurs. Even better, the
- <literal>reRender</literal> attribute
lets us render a fragment of the JSF page and
- perform a partial page update when the asynchronous
response is received. </para>
-
- <para> The RichFaces Ajax
<literal><a:status></literal> tag lets us display a cheesy
- annimated image while we wait for asynchronous requests
to return. </para>
-
- <para> The RichFaces Ajax
<literal><a:outputPanel></literal> tag defines a region of
- the page which can be re-rendered by an asynchronous
request. </para>
-
- <para> The Seam
<literal><s:link></literal> tag lets us attach a JSF action
- listener to an ordinary (non-JavaScript) HTML link. The
advantage of this over the
- standard JSF
<literal><h:commandLink></literal> is that it preserves the
- operation of "open in new window" and
"open in new tab". Also notice that we use a
- method binding with a parameter:
<literal>#{hotelBooking.selectHotel(hot)}</literal>.
- This is not possible in the standard Unified EL, but Seam
provides an extension to the
- EL that lets you use parameters on any method binding
expression. </para>
- <para> If you're wondering how navigation occurs,
- you can find all the rules in
<literal>WEB-INF/pages.xml</literal>;
- this is discussed in the navigation section of this book.
</para>
-
- </example>
+ </para>
+ </formalpara>
+ <formalpara><title>main.xhtml Explanatory
Notes</title>
+ <para>
+ <orderedlist>
+ <listitem>
+ <para>
+ The RichFaces Ajax
<literal><![CDATA[<a:support>]]></literal> tag allows a JSF action
event listener to be called by asynchronous <literal>XMLHttpRequest</literal>
when a JavaScript event such as <literal>onkeyup</literal> occurs. Even
better, the <literal>reRender</literal> attribute lets us render a fragment of
the JSF page and perform a partial page update when the asynchronous response is
received.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The RichFaces Ajax
<literal><![CDATA[<a:status>]]></literal> tag lets us display an
animated image while we wait for asynchronous requests to return.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The RichFaces Ajax
<literal><![CDATA[<a:outputPanel>]]></literal> tag defines a
region of the page which can be re-rendered by an asynchronous request.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The Seam
<literal><![CDATA[<s:link>]]></literal> tag lets us attach a JSF
action listener to an ordinary (non-JavaScript) HTML link. The advantage of this over the
standard JSF <literal><![CDATA[<h:commandLink>]]></literal> is
that it preserves the "open in new window" and "open in new tab"
operations. Also note that we use a method binding with a parameter:
<literal>#{hotelBooking.selectHotel(hot)}</literal>. This is not possible in
standard Unified EL, but Seam provides an extension to an EL that allows parameters on any
method binding expression.
+ </para>
+ <para>
+ Navigation rules can be found in
<literal>WEB-INF/pages.xml</literal>. These are discussed further in <xref
linkend="events.pageaction.navigation" />.
+ </para>
+ </listitem>
+ </orderedlist>
+ <!-- </programlistingco> -->
+ </para>
+ </formalpara>
+
<para> This page displays the search results dynamically as we type,
and lets us choose a hotel and pass it
@@ -2150,126 +2192,125 @@
achieve a natural cache of persistent data related to the conversation.
The following code example is
pretty long. But if you think of it as a list of scripted actions that
implement the various steps of
the conversation, it's understandable. Read the class from top to
bottom, as if it were a story. </para>
- <example>
- <title></title>
- <!-- Can't use code hightlighting with callouts -->
- <programlisting>
-@Stateful
+ <formalpara><title>HotelBookingAction.java
Example</title>
+ <para>
+<programlisting><![CDATA[@Stateful
@Name("hotelBooking")
@Restrict("#{identity.loggedIn}")
-public class HotelBookingAction implements HotelBooking
-{
+public class HotelBookingAction implements HotelBooking {
- @PersistenceContext(type=EXTENDED)
- private EntityManager em;
-
- @In
- private User user;
-
- @In(required=false) @Out
- private Hotel hotel;
-
- @In(required=false)
- @Out(required=false)
- private Booking booking;
-
- @In
- private FacesMessages facesMessages;
-
- @In
- private Events events;
-
- @Logger
- private Log log;
-
- private boolean bookingValid;
-
- @Begin
- public void selectHotel(Hotel selectedHotel)
- {
- hotel = em.merge(selectedHotel);
- }
-
- public void bookHotel()
- {
- booking = new Booking(hotel, user);
- Calendar calendar = Calendar.getInstance();
- booking.setCheckinDate( calendar.getTime() );
- calendar.add(Calendar.DAY_OF_MONTH, 1);
- booking.setCheckoutDate( calendar.getTime() );
- }
-
- public void setBookingDetails()
- {
- Calendar calendar = Calendar.getInstance();
- calendar.add(Calendar.DAY_OF_MONTH, -1);
- if ( booking.getCheckinDate().before( calendar.getTime() ) )
- {
- facesMessages.addToControl("checkinDate", "Check in date must be
a future date");
- bookingValid=false;
- }
- else if ( !booking.getCheckinDate().before( booking.getCheckoutDate() ) )
- {
- facesMessages.addToControl("checkoutDate",
- "Check out date must be later than check in
date");
- bookingValid=false;
- }
- else
- {
- bookingValid=true;
- }
- }
-
- public boolean isBookingValid()
- {
- return bookingValid;
- }
-
- @End
- public void confirm()
- {
- em.persist(booking);
- facesMessages.add("Thank you, #{user.name}, your confimation number " +
- " for #{hotel.name} is #{booki g.id}");
- log.info("New booking: #{booking.id} for #{user.username}");
- events.raiseTransactionSuccessEvent("bookingConfirmed");
- }
-
- @End
- public void cancel() {}
-
- @Remove
- public void destroy() {}
+ @PersistenceContext(type=EXTENDED)
+ private EntityManager em;
+
+ @In
+ private User user;
+
+ @In(required=false) @Out
+ private Hotel hotel;
+
+ @In(required=false)
+ @Out(required=false)
+ private Booking booking;
+
+ @In
+ private FacesMessages facesMessages;
+
+ @In
+ private Events events;
+
+ @Logger
+ private Log log;
+
+ private boolean bookingValid;
+
+ @Begin
+ public void selectHotel(Hotel selectedHotel) {
+ hotel = em.merge(selectedHotel);
+ }
+
+ public void bookHotel() {
+ booking = new Booking(hotel, user);
+ Calendar calendar = Calendar.getInstance();
+ booking.setCheckinDate( calendar.getTime() );
+ calendar.add(Calendar.DAY_OF_MONTH, 1);
+ booking.setCheckoutDate( calendar.getTime() );
+ }
+
+ public void setBookingDetails() {
+ Calendar calendar = Calendar.getInstance();
+ calendar.add(Calendar.DAY_OF_MONTH, -1);
+ if ( booking.getCheckinDate().before( calendar.getTime() ) ) {
+ facesMessages.addToControl("checkinDate",
+ "Check in date must be a future date");
+ bookingValid=false;
+ }
+ else if (!booking.getCheckinDate().before(booking.getCheckoutDate()))
+ {
+ facesMessages.addToControl("checkoutDate",
+ "Check out date must be later than check in date");
+ bookingValid=false;
+ }
+ else
+ {
+ bookingValid=true;
+ }
+ }
+
+ public boolean isBookingValid() {
+ return bookingValid;
+ }
+
+ @End
+ public void confirm() {
+ em.persist(booking);
+ facesMessages.add("Thank you, #{user.name}, " +
+ "your confimation number " +
+ "for #{hotel.name} is #{booki g.id}");
+ log.info("New booking: #{booking.id} for #{user.username}");
+ events.raiseTransactionSuccessEvent("bookingConfirmed");
+ }
+
+ @End
+ public void cancel() {}
+
+ @Remove
+ public void destroy() {}]]>
</programlisting>
-
- <para> This bean uses an EJB3 <emphasis>extended
persistence context</emphasis>, so that any
- entity instances remain managed for the whole lifecycle
of the stateful session bean.
- </para>
-
- <para> The
- <literal>@Out</literal>
- annotation declares that an attribute value is
<emphasis>outjected</emphasis> to
- a context variable after method invocations. In this
case, the context variable named
- <literal>hotel</literal> will be set to
the value of the <literal>hotel</literal>
- instance variable after every action listener invocation
completes. </para>
-
- <para> The
- <literal>@Begin</literal>
- annotation specifies that the annotated method begins a
<emphasis>long-running
- conversation</emphasis>, so the current
conversation context will not be destroyed
- at the end of the request. Instead, it will be
reassociated with every request from the
- current window, and destroyed either by timeout due to
conversation inactivity or
- invocation of a matching
<literal>@End</literal> method. </para>
-
- <para> The
- <literal>@End</literal>
- annotation specifies that the annotated method ends the
current long-running
- conversation, so the current conversation context will be
destroyed at the end of the
- request. </para>
-
- <para> This EJB remove method will be called when Seam
destroys the conversation context.
- Don't forget to define this method! </para>
- </example>
+ </para>
+ </formalpara>
+ <formalpara><title>HotelBookingAction.java Explanatory
Notes</title>
+ <para>
+ <orderedlist>
+ <listitem>
+ <para>
+ This bean uses an EJB3 <emphasis>extended persistence
context</emphasis>, so that entity instances remain managed for the whole lifecycle
of the stateful session bean.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The <xref linkend="out-annotation" />
annotation declares that an attribute value is "outjected" to a context variable
after method invocations. In this case, the context variable named
<literal>hotel</literal> will be set to the value of the
<literal>hotel</literal> instance variable after every action listener
invocation.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The <literal>@Begin</literal> annotation
specifies that the annotated method begins a <emphasis>long-running
conversation</emphasis>, so the current conversation context will not be destroyed
at the end of the request. Instead, it will be reassociated with every request from the
current window, and destroyed either by timeout due to conversation inactivity or
invocation of a matching <literal>@End</literal> method.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ The <xref linkend="end-annotation" />
annotation specifies that the annotated method ends the current long-running conversation,
so the current conversation context will be destroyed at the end of the request.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ This EJB remove method must be defined, and will be called
when Seam destroys the conversation context.
+ </para>
+ </listitem>
+ </orderedlist>
+ <!-- </programlistingco> -->
+ </para>
+ </formalpara>
+
<para>
@@ -2377,8 +2418,8 @@
</mediaobject>
</screenshot>
- <para>TODO</para>
- <para>Look in the <literal>dvdstore</literal>
directory.</para>
+<!-- <para>TODO</para>
+ <para>Look in the <literal>dvdstore</literal>
directory.</para>-->
</section>
<section id="hibernate">
@@ -2387,8 +2428,8 @@
<para> The Hibernate Booking demo is a straight port of the Booking demo to
an alternative architecture that
uses Hibernate for persistence and JavaBeans instead of session beans.
</para>
- <para>TODO</para>
- <para>Look in the <literal>hibernate</literal>
directory.</para>
+ <!--<para>TODO</para>
+ <para>Look in the <literal>hibernate</literal>
directory.</para>-->
</section>
<section id="blog">
Modified: tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Webservices.xml
===================================================================
--- tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Webservices.xml 2009-11-24
00:33:31 UTC (rev 11654)
+++ tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Webservices.xml 2009-11-24
02:12:51 UTC (rev 11655)
@@ -7,7 +7,7 @@
services to run within a Seam environment.
</para>
- <sect1>
+ <section>
<title>Configuration and Packaging</title>
<para>
To allow Seam to intercept web service requests so that the necessary Seam contexts
can be created for the request,
@@ -40,9 +40,9 @@
</endpoint-config>
</jaxws-config>]]></programlisting>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Conversational Web Services</title>
<para>
So how are conversations propagated between web service requests? Seam uses a SOAP
header element present
@@ -89,7 +89,7 @@
As you can see, the response message contains the same
<literal>conversationId</literal> element as the request.
</para>
- <sect2>
+ <section>
<title>A Recommended Strategy</title>
<para>
@@ -112,11 +112,11 @@
features to be used in the web service class itself.
</para>
- </sect2>
+ </section>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>An example web service</title>
<para>
@@ -196,7 +196,7 @@
and delegating the real work to a conversational Seam component.
</para>
- </sect1>
+ </section>
</chapter>
Modified: tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Xml.xml
===================================================================
--- tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Xml.xml 2009-11-24
00:33:31 UTC (rev 11654)
+++ tags/JBPAPP_4_3_CP07_FP_CR1a/doc/Seam_Reference_Guide/en-US/Xml.xml 2009-11-24
02:12:51 UTC (rev 11655)
@@ -11,7 +11,7 @@
properties file or in <literal>web.xml</literal>, and
configuration via <literal>components.xml</literal>.
</para>
- <sect1>
+ <section>
<title>Configuring components via property settings</title>
<para>
Seam components may be provided with configuration properties either via
servlet context parameters,
@@ -32,9 +32,9 @@
component named
<literal>org.jboss.seam.core.manager</literal> with a setter method named
<literal>setConversationTimeout()</literal>.)
</para>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Configuring components via
<literal>components.xml</literal></title>
<para>
@@ -241,9 +241,9 @@
(at development time). You'll see this approach used in the Seam
examples.
</para>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Fine-grained configuration files</title>
<para>
If you have a large number of components that need to be configured in
XML, it makes much more sense
@@ -282,9 +282,9 @@
Alternatively, you may put configuration for all classes in the
<literal>com.helloworld</literal>
package in <literal>com/helloworld/components.xml</literal>.
</para>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Configurable property types</title>
<para>
Properties of string, primitive or primitive wrapper type may be
configured just as you would expect:
@@ -347,9 +347,9 @@
<property name="ruleBase">#{policyPricingRules}</property>
</component>]]></programlisting>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Using XML Namespaces</title>
<para>
Throughout the examples, there have been two competing ways of declaring
components: with and without
@@ -536,7 +536,7 @@
</itemizedlist>
- </sect1>
+ </section>
</chapter>