[seam-commits] Seam SVN: r15057 - in branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US: images and 1 other directory.
seam-commits at lists.jboss.org
seam-commits at lists.jboss.org
Mon Aug 20 06:02:49 EDT 2012
Author: manaRH
Date: 2012-08-20 06:02:48 -0400 (Mon, 20 Aug 2012)
New Revision: 15057
Added:
branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/images/ee6.png
branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/images/hibernate-ee6.png
Modified:
branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Configuration.xml
branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Dependencies.xml
branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Elenhancements.xml
branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Jbpm.xml
branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Mail.xml
branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Testing.xml
branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Wicket.xml
branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/images/architecture.png
Log:
JBSEAM-5008
Modified: branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Configuration.xml
===================================================================
--- branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Configuration.xml 2012-08-17 11:30:51 UTC (rev 15056)
+++ branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Configuration.xml 2012-08-20 10:02:48 UTC (rev 15057)
@@ -8,12 +8,12 @@
off by the following sections; you'll never need to type any of this stuff yourself, since you can just use
seam-gen to start your application or you can 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>
@@ -57,7 +57,7 @@
<env-entry>
<env-entry-name>com.sun.faces.ClientStateSavingPassword</env-entry-name>
<env-entry-type>java.lang.String</env-entry-type>
- <env-entry-value>something</env-entry-value>
+ <env-entry-value>INSERT_YOUR_PASSWORD</env-entry-value>
</env-entry>]]></programlisting>
</para>
</warning>
@@ -79,9 +79,9 @@
<param-name>com.sun.faces.serializeServerState</param-name>
<param-value>true</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
@@ -97,9 +97,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
@@ -405,9 +405,9 @@
(<literal>@Filter(within="org.jboss.seam.web.ajax4jsfFilter")</literal>). </para>
</sect3>
- </sect2>
+ </section>
- <sect2 id="config.integration.ejb.container">
+ <section id="config.integration.ejb.container">
<title>Integrating Seam with your EJB container</title>
<para> In a Seam application, EJB components have a certain duality, as they are managed by both the EJB
@@ -594,9 +594,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>,
@@ -616,11 +616,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.
@@ -662,23 +662,23 @@
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 6</title>
<mediaobject>
<imageobject role="fo">
- <imagedata fileref="images/ee5.png" align="center"/>
+ <imagedata fileref="images/ee6.png" align="center"/>
</imageobject>
<imageobject role="html">
- <imagedata fileref="images/ee5.png" align="center"/>
+ <imagedata fileref="images/ee6.png" align="center"/>
</imageobject>
</mediaobject>
<para> If you're running in a Java EE 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
@@ -691,6 +691,7 @@
META-INF/
MANIFEST.MF
application.xml
+ jboss-deployment-structure.xml
my-application.war/
META-INF/
MANIFEST.MF
@@ -734,31 +735,35 @@
<literal>jboss-seam-debug.jar</literal> in the <literal>WEB-INF/lib</literal> directory of the WAR. </para>
<para> Seam ships with several example applications that are deployable in any Java EE container that
- supports EJB 3.0. </para>
+ supports EJB 3.1. </para>
+
+ <para><filename>faces-config.xml</filename> is not required in JSF 2, but if you want to set up something non-default
+ you need to place it in <filename>WAR/WEB-INF</filename>.</para>
<para> I really wish that was all there was to say on the topic of configuration but unfortunately we're
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>
- <title>Configuring Seam in Java EE</title>
+ <section>
+ <title>Configuring Seam without EJB</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
- Hibernate4 or JPA instead of EJB 3.0 persistence, and plain JavaBeans instead of session beans. You'll miss
- out on some of the nice features of session beans but it will be very easy to migrate to EJB 3.0 when you're
+ <para> Seam is useful even if you're not yet ready to take the plunge into EJB 3.1. In this case you would use
+ Hibernate 4 instead of EJB 3.1 persistence, and plain JavaBeans instead of session beans. You'll miss
+ out on some of the nice features of session beans but it will be very easy to migrate to EJB 3.1 when you're
ready and, in the meantime, you'll be able to take advantage of Seam's unique declarative state management
architecture. </para>
<mediaobject>
<imageobject role="fo">
- <imagedata fileref="images/hibernate-ee.png" align="center"/>
+ <imagedata fileref="images/hibernate-ee6.png" align="center"/>
</imageobject>
<imageobject role="html">
- <imagedata fileref="images/hibernate-ee.png" align="center"/>
+ <imagedata fileref="images/hibernate-ee6.png" align="center"/>
</imageobject>
</mediaobject>
@@ -772,7 +777,7 @@
JavaBeans instead of EJB, and another version that uses JPA and JavaBeans. These example applications are
ready to deploy into any Java EE application server. </para>
- <sect2>
+ <section>
<title>Boostrapping Hibernate in Seam</title>
<para> Seam will bootstrap a Hibernate <literal>SessionFactory</literal> from your
@@ -786,9 +791,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
@@ -802,9 +807,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>
@@ -812,6 +817,7 @@
<programlisting><![CDATA[my-application.war/
META-INF/
MANIFEST.MF
+ jboss-deployment-structure.xml
WEB-INF/
web.xml
components.xml
@@ -843,10 +849,10 @@
<para> If we want to deploy Hibernate in a non-EE environment like Tomcat or TestNG, we need to do a little
bit more work. </para>
- </sect2>
- </sect1>
+ </section>
+ </section>
- <sect1>
+ <section>
<title>Configuring Seam in Java SE</title>
<para> It is possible to use Seam completely outside of an EE environment. In this case, you need to tell Seam
@@ -861,9 +867,9 @@
<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
@@ -908,7 +914,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
@@ -924,6 +930,7 @@
META-INF/
MANIFEST.MF
application.xml
+ jboss-deployment-structure.xml
my-application.war/
META-INF/
MANIFEST.MF
@@ -957,11 +964,36 @@
approveDocument.jpdl.xml
documentLifecycle.jpdl.xml]]></programlisting>
- </sect2>
+ </section>
- </sect1>
+ </section>
+
+ <section>
+ <title>Deployment in JBoss AS 7</title>
+
+ <para>JBoss AS 7 is default deployment target for all examples in Seam 2.3 distribution.</para>
+
+ <para>Seam 2.3 requires to have setup special deployment metada file <filename>jboss-deployment-structure.xml</filename>
+ for correct initialization. Minimal content for EAR is:
+ <example>
+ <title>jboss-deployment-structure.xml</title>
+ <programlisting><![CDATA[<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
+ <deployment>
+ <dependencies>
+ <module name="org.dom4j" export="true"/>
+ <module name="org.apache.commons.collections" export="true"/>
+ <module name="javax.faces.api" export="true"/>
+ </dependencies>
+ </deployment>
+</jboss-deployment-structure>]]></programlisting>
+ </example>
+
+ More details about new AS 7 classloading can be found at
+ <ulink url="https://docs.jboss.org/author/display/AS7/Developer+Guide#DeveloperGuide-ClassloadinginJBossAS7">https://docs.jboss.org/author/display/AS7/Developer+Guide#DeveloperGuide-ClassloadinginJBossAS7</ulink>
+</para>
+ </section>
- <sect1>
+ <section>
<title>Configuring SFSB and Session Timeouts in JBoss AS 7</title>
<para> It is very important that the timeout for Stateful Session Beans is set higher than the timeout for HTTP
@@ -994,9 +1026,9 @@
<session-timeout>30</session-timeout>
</session-config>]]></programlisting>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Running Seam in a Portlet</title>
<para>
@@ -1007,9 +1039,9 @@
for more.
</para>
- </sect1>
+ </section>
- <sect1>
+ <section>
<title>Deploying custom resources</title>
<para>
@@ -1139,6 +1171,6 @@
}
}]]></programlisting>
- </sect1>
+ </section>
</chapter>
Modified: branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Dependencies.xml
===================================================================
--- branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Dependencies.xml 2012-08-17 11:30:51 UTC (rev 15056)
+++ branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Dependencies.xml 2012-08-20 10:02:48 UTC (rev 15057)
@@ -10,16 +10,16 @@
<para>
Seam does not work with JDK 1.4 and requires JDK 5 or above as it uses
annotations and other JDK 5.0 features. Seam has been thoroughly tested
- using Sun's JDKs. However there are no known issues specific to Seam with
+ using Oracle's JDKs and OpenJDKs. However there are no known issues specific to Seam with
other JDKs.
</para>
<section id="jdk6_dependencies">
- <title>Sun's JDK 6 Considerations</title>
+ <title>Oracle's JDK 6 Considerations</title>
<para>
- Earlier versions of Sun's JDK 6 contained an incompatible
+ Earlier versions of Oracle's JDK 6 contained an incompatible
version of JAXB and required overriding it using the "endorsed"
- directory. Sun's JDK6 Update 4 release upgraded to JAXB 2.1 and
+ directory. Oracle's JDK6 Update 4 release upgraded to JAXB 2.1 and
removed this requirement. When building, testing, or executing be
sure to use this version or higher.
</para>
@@ -410,7 +410,7 @@
<row>
<entry>
- <para><literal>mail-ra.jar</literal></para>
+ <para><literal>ironjacamar-mail.jar</literal></para>
</entry>
<entry align="center">
<para>compile only</para>
@@ -420,7 +420,7 @@
</entry>
<entry>
<para>Required for incoming mail support</para>
- <para>mail-ra.rar should be deployed to the application server
+ <para><filename>ironjacamar-mail.jar</filename> should be deployed to the application server
at runtime</para>
</entry>
</row>
Modified: branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Elenhancements.xml
===================================================================
--- branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Elenhancements.xml 2012-08-17 11:30:51 UTC (rev 15056)
+++ branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Elenhancements.xml 2012-08-20 10:02:48 UTC (rev 15057)
@@ -23,10 +23,10 @@
<para>You can still use JBoss EL instead of standard EL 2.2 from Java EE 6 by
setting up <literal>com.sun.faces.expressionFactory</literal> in <filename>web.xml</filename>:
- <programlisting role="XML"><![CDATA[<context-param>
+ <programlisting><![CDATA[<context-param>
<param-name>com.sun.faces.expressionFactory</param-name>
- <param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
-</context-param>]]> </programlisting>
+ <param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
+</context-param>]]></programlisting>
</para>
<para>
@@ -36,9 +36,10 @@
<programlisting role="XHTML"><![CDATA[<h:commandButton action="#{hotelBooking.bookHotel(hotel)}" value="Book Hotel"/>]]></programlisting>
<programlisting role="JAVA"><![CDATA[@Name("hotelBooking")
-public class HotelBooking {
-
- public String bookHotel(Hotel hotel) {
+public class HotelBooking
+{
+ public String bookHotel(Hotel hotel)
+ {
// Book the hotel
}
}]]></programlisting>
Modified: branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Jbpm.xml
===================================================================
--- branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Jbpm.xml 2012-08-17 11:30:51 UTC (rev 15056)
+++ branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Jbpm.xml 2012-08-20 10:02:48 UTC (rev 15057)
@@ -231,7 +231,7 @@
<listitem>
<para>
The jPDL makes the user interaction immediately understandable,
- without us needing to even look at the JSP or Java code.
+ without us needing to even look at the facelets template or Java code.
</para>
</listitem>
</itemizedlist>
Modified: branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Mail.xml
===================================================================
--- branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Mail.xml 2012-08-17 11:30:51 UTC (rev 15056)
+++ branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Mail.xml 2012-08-20 10:02:48 UTC (rev 15057)
@@ -321,6 +321,9 @@
</section>
<section>
<title>Receiving emails</title>
+
+
+ <warning>Please be reminded that this section is not updated for JBoss AS 7.x!</warning>
<para>
If you are using EJB then you can use a MDB (Message Driven Bean) to
Modified: branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Testing.xml
===================================================================
--- branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Testing.xml 2012-08-17 11:30:51 UTC (rev 15056)
+++ branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Testing.xml 2012-08-20 10:02:48 UTC (rev 15057)
@@ -29,7 +29,7 @@
@Scope(EVENT)
@Name("statementOfAccount")
public class StatementOfAccount {
-
+
@In(create=true) EntityManager entityManager
private double statementTotal;
@@ -64,8 +64,7 @@
the business logic of the component) as follows:
</para>
- <programlisting role="JAVA"><![CDATA[public class StatementOfAccountTest {
-
+ <programlisting role="JAVA"><![CDATA[public class StatementOfAccountTest {
@Test
public testCalculateTotal {
List<Invoice> invoices = generateTestInvoices(); // A test data generator
@@ -91,9 +90,10 @@
<section>
<title>Integration testing Seam components</title>
- <note>
- Using JBoss Embedded for integration testing was removed. See <xref linkend="testing.arquillian" />
- </note>
+ <warning>
+ <para>Using JBoss Embedded for integration testing was removed. Seam uses
+ Arquillian with JUnit. Right now TestNG is not recommended test framework with Arquillian.</para>
+ </warning>
<para>
Integration testing is slightly more difficult. In this case, we can't eliminate
@@ -110,13 +110,185 @@
together with the JBoss AS container)
</para>
-<programlisting role="JAVA"><![CDATA[public class RegisterTest extends SeamTest
+ <para>
+ Arquillian makes it possible to run integration tests inside a real container, even without <literal>SeamTest</literal>.
+ </para>
+
+ <example>
+ <title>RegisterTest.java</title>
+ <programlistingco>
+ <areaspec>
+ <area id="registration-test-runwith" coords="1"/>
+ <area id="registration-test-deployment" coords="4"/>
+ <area id="registration-test-overprotocol" coords="5"/>
+ <area id="registration-test-zipimporter" coords="8"/>
+ <area id="registration-test-addtestclass" coords="12"/>
+ <area id="registration-test-lifecycle" coords="19"/>
+ </areaspec>
+ <programlisting role="JAVA"><![CDATA[@RunWith(Arquillian)
+public class RegisterTest
{
+ @Deployment
+ @OverProtocol("Servlet 3.0")
+ public static Archive<?> createDeployment()
+ {
+ EnterpriseArchive er = ShrinkWrap.create(ZipImporter.class)
+ .importFrom(new File("../registration-ear/target/seam-registration.ear"))
+ .as(EnterpriseArchive.class);
+ WebArchive web = er.getAsType(WebArchive.class, "registration-web.war");
+ web.addClasses(RegisterTest.class);
+ return er;
+ }
+
+ @Before
+ public void before()
+ {
+ Lifecycle.beginCall();
+ }
+ @After
+ public void after(
+ {
+ Lifecycle.endCall();
+ }
+
+ protected void setValue(String valueExpression, Object value)
+ {
+ Expressions.instance().createValueExpression(valueExpression).setValue(value);
+ }
+
@Test
public void testRegisterComponent() throws Exception
{
-
+ setValue("#{user.username}", "1ovthafew");
+ setValue("#{user.name}", "Gavin King");
+ setValue("#{user.password}", "secret");
+ Register register = (Register)Component.getInstance("register");
+ Assert.assertEquals("success", register.register());
+ }
+
+ ...
+}]]></programlisting>
+ <calloutlist>
+ <callout arearefs="registration-test-runwith">
+ <para> The JUnit <literal>@RunWith</literal> annotation must be present to run our tests with Arquillian.
+ </para>
+ </callout>
+ <callout arearefs="registration-test-deployment">
+ <para> Since we want to run our test in a real container, we need to specify an archive that gets deployed.
+ </para>
+ </callout>
+ <callout arearefs="registration-test-overprotocol">
+ <para> <literal>@OverProtocol</literal> is an Arquillian annotation to specify the protocol used for running the tests.
+ The "Servlet 3.0" protocol is the recommended protocol for running Seam tests.
+ </para>
+ </callout>
+ <callout arearefs="registration-test-zipimporter">
+ <para> ShrinkWrap can be used to create the deployment archive. In this example, the whole EAR is imported, but we could also use
+ the ShrinkWrap API to create a WAR or an EAR from the scratch and put in just the artifacts that we need for the test.
+ </para>
+ </callout>
+ <callout arearefs="registration-test-addtestclass">
+ <para> The test class itself must be added to the web archive.
+ </para>
+ </callout>
+ <callout arearefs="registration-test-lifecycle">
+ <para> <literal>Lifecycle.beginCall()</literal> is needed to setup Seam contexts.
+ </para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+ </example>
+
+ <section>
+ <title>Configuration</title>
+
+ <para>
+ The Arquillian configuration depends on the specific container used. See Arquillian documentation for more information.
+ </para>
+
+ <para>
+ Assuming you are using Maven as your build tool and want run your tests on JBoss AS 7, you will need to put these dependencies into your <literal>pom.xml</literal>:
+ </para>
+
+ <programlisting role="XML"><![CDATA[<dependency>
+ <groupId>org.jboss.arquillian.junit</groupId>
+ <artifactId>arquillian-junit-container</artifactId>
+ <version>${version.arquillian}</version>
+ <scope>test</scope>
+</dependency>
+
+<dependency>
+ <groupId>org.jboss.as</groupId>
+ <artifactId>jboss-as-arquillian-container-managed</artifactId>
+ <version>${version.jboss.as7}</version>
+ <scope>test</scope>
+</dependency>]]></programlisting>
+
+ <para>
+ The Arquillian JBoss AS Managed Container will automatically start the application server,
+ provided the JBOSS_HOME environment property points to the JBoss AS 7 installation.
+ </para>
+
+ </section>
+
+ <section>
+ <title>Using JUnitSeamTest with Arquillian</title>
+
+ <para>
+ It is also possible to use the simulated JSF environment provided by <literal>SeamTest</literal> along with Arquillian.
+ This is useful especially if you are migrating from previous Seam releases and want to keep your existing testsuite mostly
+ unchanged.
+ </para>
+
+ <note>SeamTest was primary designated for TestNG integration tests. There are some glitches
+ so we recommend to use JUnitSeamTest which is the JUnit variant for SeamTest.
+ </note>
+
+ <para>
+ The following changes must be done to run a JUnitSeamTest with Arquillian:
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Create the <literal>@Deployment</literal> method.</para>
+ </listitem>
+ <listitem>
+ <para>Convert the test to JUnit. A <literal>JUnitSeamTest</literal>
+ class can now be used instead of the original <literal>SeamTest</literal>.</para>
+ </listitem>
+ <listitem>
+ <para>Replace the <literal>SeamListener</literal> with <literal>org.jboss.seam.mock.MockSeamListener</literal> in web.xml.</para>
+ </listitem>
+ </itemizedlist>
+
+
+ <example>
+ <title>RegisterTest.java</title>
+ <programlisting role="JAVA"><![CDATA[@RunWith(Arquillian)
+public class RegisterTest extends JUnitSeamTest
+{
+ @Deployment
+ @OverProtocol("Servlet 3.0")
+ public static Archive<?> createDeployment()
+ {
+ EnterpriseArchive er = ShrinkWrap.create(ZipImporter.class)
+ .importFrom(new File("../registration-ear/target/seam-registration.ear"))
+ .as(EnterpriseArchive.class);
+ WebArchive web = er.getAsType(WebArchive.class, "registration-web.war");
+ web.addClasses(RegisterTest.class);
+
+ // Replacing the SeamListener with MockSeamListener
+ web.delete("/WEB-INF/web.xml");
+ web.addAsWebInfResource("WEB-INF/mock-web.xml", "web.xml");
+
+ return er;
+ }
+
+ @Test
+ public void testRegisterComponent() throws Exception
+ {
+
new ComponentTest() {
protected void testComponents() throws Exception
@@ -129,16 +301,33 @@
assert getValue("#{user.name}").equals("Gavin King");
assert getValue("#{user.password}").equals("secret");
}
-
+
}.run();
-
+
}
...
-
}]]></programlisting>
+ </example>
+ <example>
+ <title>mock-web.xml</title>
+ <programlisting role="XML"><![CDATA[
+<?xml version="1.0" ?>
+<web-app version="3.0"
+ xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
+
+ <listener>
+ <listener-class>org.jboss.seam.mock.MockSeamListener</listener-class>
+ </listener>
+
+</web-app>
+]]></programlisting>
+ </example>
+
<section>
<title>Using mocks in integration tests</title>
@@ -189,7 +378,8 @@
</para>
<para>
- <literal>SeamTest</literal> lets you write <emphasis>scripted</emphasis> tests,
+ <literal>SeamTest</literal> or <literal>JUnitSeamTest</literal> lets you write
+ <emphasis>scripted</emphasis> tests,
in a simulated JSF environment. The role of a scripted test is to reproduce
the interaction between the view and the Seam components. In other words, you
get to pretend you are the JSF implementation!
@@ -234,17 +424,33 @@
<para>
We want to test the registration functionality of our application (the stuff
that happens when the user clicks the Register button). We'll reproduce the JSF
- request lifecycle in an automated TestNG test:
+ request lifecycle in an automated JUnit test:
</para>
-<programlisting role="JAVA"><![CDATA[public class RegisterTest extends SeamTest
+<programlisting role="JAVA"><![CDATA[@RunWith(Arquillian.class)
+public class RegisterTest extends JUnitSeamTest
{
+ @Deployment(name="RegisterTest")
+ @OverProtocol("Servlet 3.0")
+ public static Archive<?> createDeployment()
+ {
+ EnterpriseArchive er = ShrinkWrap.create(ZipImporter.class, "seam-registration.ear").importFrom(new File("../registration-ear/target/seam-registration.ear"))
+ .as(EnterpriseArchive.class);
+ WebArchive web = er.getAsType(WebArchive.class, "registration-web.war");
+ web.addClasses(RegisterTest.class);
+
+ // Install org.jboss.seam.mock.MockSeamListener
+ web.delete("/WEB-INF/web.xml");
+ web.addAsWebInfResource("web.xml");
+
+ return er;
+ }
@Test
- public void testRegister() throws Exception
+ public void testLogin() throws Exception
{
- new FacesRequest() {
+ new FacesRequest("/register.xhtml") {
@Override
protected void processValidations() throws Exception
@@ -266,31 +472,28 @@
@Override
protected void invokeApplication()
{
- assert invokeMethod("#{register.register}").equals("success");
+ assert invokeMethod("#{register.register}").equals("/registered.xhtml");
+ setOutcome("/registered.xhtml");
}
-
+
@Override
- protected void renderResponse()
+ protected void afterRequest()
{
- assert getValue("#{user.username}").equals("1ovthafew");
- assert getValue("#{user.name}").equals("Gavin King");
- assert getValue("#{user.password}").equals("secret");
+ assert isInvokeApplicationComplete();
+ assert !isRenderResponseBegun();
}
}.run();
- }
-
- ...
-
+ ...
}]]></programlisting>
<para>
- Notice that we've extended <literal>SeamTest</literal>, which provides a
+ Notice that we've extended <literal>JUnitSeamTest</literal>, which provides a
Seam environment for our components, and written our test script as an
- anonymous class that extends <literal>SeamTest.FacesRequest</literal>,
+ anonymous class that extends <literal>JUnitSeamTest.FacesRequest</literal>,
which provides an emulated JSF request lifecycle. (There is also a
- <literal>SeamTest.NonFacesRequest</literal> for testing GET requests.)
+ <literal>JUnitSeamTest.NonFacesRequest</literal> for testing GET requests.)
We've written our code in methods which are named for the various JSF
phases, to emulate the calls that JSF would make to our components. Then
we've thrown in various assertions.
@@ -302,16 +505,24 @@
these tests using Maven, or using the JUnit plugin for eclipse:
</para>
-<!-- TODO capture new JUnit screenshot -->
<mediaobject>
<imageobject role="fo">
+ <imagedata fileref="images/plugin-junit.png" align="center" scalefit="1"/>
+ </imageobject>
+ <imageobject role="html">
+ <imagedata fileref="images/plugin-junit.png" align="center"/>
+ </imageobject>
+ </mediaobject>
+<!--
+ <mediaobject>
+ <imageobject role="fo">
<imagedata fileref="images/plugin-testng.png" align="center" scalefit="1"/>
</imageobject>
<imageobject role="html">
<imagedata fileref="images/plugin-testng.png" align="center"/>
</imageobject>
</mediaobject>
-
+ -->
<section>
<title>Configuration</title>
@@ -333,7 +544,7 @@
And, of course you need to put your built project and tests onto
the classpath as well as jar for your test framework. Don't forget
to put all the correct configuration files for JPA and Seam onto
- the classpath as well.Seam asks Arquillian to deploy any
+ the classpath as well. Seam asks Arquillian to deploy any
resource (jar or directory) which has
<literal>seam.properties</literal> in it's root. Therefore, if you
don't assemble a directory structure that resembles a deployable
@@ -344,10 +555,10 @@
</section>
<section>
- <title>Using SeamTest with another test framework</title>
+ <title>Using JUnitSeamTest with another test framework</title>
<para>
- Seam provides JUnit and TestNG support out of the box, but you can also use
+ Seam provides JUnit support out of the box, but you can also use
another test framework, if you want.
</para>
@@ -463,7 +674,7 @@
<programlisting role="XML"><![CDATA[<parameter name="datasourceJndiName" value="java:/seamdiscsDatasource"/>]]></programlisting>
<para>
- DBUnitSeamTest and DBJUnitSeamTest have support for MySQL and HSQL - you need to tell it
+ DBUnitSeamTest or DBJUnitSeamTest have support for MySQL and HSQL - you need to tell it
which database is being used, otherwise it defaults to HSQL:
</para>
@@ -540,231 +751,6 @@
</section>
</section>
-
- <section id="testing.arquillian">
-
- <title>Testing Seam with Arquillian</title>
-
- <para>
- Arquillian makes it possible to run integration tests inside a real container, even without <literal>SeamTest</literal>.
- </para>
-
- <example>
- <title>RegisterTest.java</title>
- <programlistingco>
- <areaspec>
- <area id="registration-test-runwith" coords="1"/>
- <area id="registration-test-deployment" coords="4"/>
- <area id="registration-test-overprotocol" coords="5"/>
- <area id="registration-test-zipimporter" coords="8"/>
- <area id="registration-test-addtestclass" coords="12"/>
- <area id="registration-test-lifecycle" coords="19"/>
- </areaspec>
- <programlisting role="JAVA"><![CDATA[@RunWith(Arquillian)
-public class RegisterTest
-{
- @Deployment
- @OverProtocol("Servlet 3.0")
- public static Archive<?> createDeployment()
- {
- EnterpriseArchive er = ShrinkWrap.create(ZipImporter.class)
- .importFrom(new File("../registration-ear/target/seam-registration.ear"))
- .as(EnterpriseArchive.class);
- WebArchive web = er.getAsType(WebArchive.class, "registration-web.war");
- web.addClasses(RegisterTest.class);
- return er;
- }
-
- @Before
- public void before()
- {
- Lifecycle.beginCall();
- }
-
- @After
- public void after(
- {
- Lifecycle.endCall();
- }
-
- protected void setValue(String valueExpression, Object value)
- {
- Expressions.instance().createValueExpression(valueExpression).setValue(value);
- }
-
- @Test
- public void testRegisterComponent() throws Exception
- {
- setValue("#{user.username}", "1ovthafew");
- setValue("#{user.name}", "Gavin King");
- setValue("#{user.password}", "secret");
- Register register = (Register)Component.getInstance("register");
- Assert.assertEquals("success", register.register());
- }
-
- ...
-
-}]]></programlisting>
- <calloutlist>
- <callout arearefs="registration-test-runwith">
- <para> The JUnit <literal>@RunWith</literal> annotation must be present to run our tests with Arquillian.
- </para>
- </callout>
- <callout arearefs="registration-test-deployment">
- <para> Since we want to run our test in a real container, we need to specify an archive that gets deployed.
- </para>
- </callout>
- <callout arearefs="registration-test-overprotocol">
- <para> <literal>@OverProtocol</literal> is an Arquillian annotation to specify the protocol used for running the tests.
- The "Servlet 3.0" protocol is the recommended protocol for running Seam tests.
- </para>
- </callout>
- <callout arearefs="registration-test-zipimporter">
- <para> ShrinkWrap can be used to create the deployment archive. In this example, the whole EAR is imported, but we could also use
- the ShrinkWrap API to create a WAR or an EAR from the scratch and put in just the artifacts that we need for the test.
- </para>
- </callout>
- <callout arearefs="registration-test-addtestclass">
- <para> The test class itself must be added to the web archive.
- </para>
- </callout>
- <callout arearefs="registration-test-lifecycle">
- <para> <literal>Lifecycle.beginCall()</literal> is needed to setup Seam contexts.
- </para>
- </callout>
- </calloutlist>
- </programlistingco>
- </example>
-
- <section>
- <title>Configuration</title>
-
- <para>
- The Arquillian configuration depends on the specific container used. See Arquillian documentation for more information.
- </para>
-
- <para>
- Assuming you are using Maven as your build tool and want run your tests on JBoss AS 7, you will need to put these dependencies into your <literal>pom.xml</literal>:
- </para>
-
- <programlisting role="XML"><![CDATA[<dependency>
- <groupId>org.jboss.arquillian.junit</groupId>
- <artifactId>arquillian-junit-container</artifactId>
- <version>${version.arquillian}</version>
- <scope>test</scope>
-</dependency>
-
-<dependency>
- <groupId>org.jboss.as</groupId>
- <artifactId>jboss-as-arquillian-container-managed</artifactId>
- <version>${version.jboss.as7}</version>
- <scope>test</scope>
-</dependency>]]></programlisting>
-
- <para>
- The Arquillian JBoss AS Managed Container will automatically start the application server, provided the JBOSS_HOME environment property points to the JBoss AS 7 installation.
- </para>
-
- </section>
-
- <section>
- <title>Using SeamTest with Arquillian</title>
-
- <para>
- It is also possible to use the simulated JSF environment provided by <literal>SeamTest</literal> along with Arquillian.
- This is useful especially if you are migrating from previous Seam releases and want to keep your existing testsuite mostly
- unchanged.
- </para>
-
- <note>
- This feature currently only works with JUnit.
- </note>
-
- <para>
- The following changes must be done to run a SeamTest with Arquillian:
- </para>
-
- <itemizedlist>
- <listitem>
- <para>Create the <literal>@Deployment</literal> method.</para>
- </listitem>
- <listitem>
- <para>Convert the test to JUnit. A <literal>JUnitSeamTest</literal>
- class can now be used instead of the original <literal>SeamTest</literal>.</para>
- </listitem>
- <listitem>
- <para>Replace the <literal>SeamListener</literal> with <literal>org.jboss.seam.mock.MockSeamListener</literal> in web.xml.</para>
- </listitem>
- </itemizedlist>
-
-
- <example>
- <title>RegisterTest.java</title>
- <programlisting role="JAVA"><![CDATA[@RunWith(Arquillian)
-public class RegisterTest extends JUnitSeamTest
-{
- @Deployment
- @OverProtocol("Servlet 3.0")
- public static Archive<?> createDeployment()
- {
- EnterpriseArchive er = ShrinkWrap.create(ZipImporter.class)
- .importFrom(new File("../registration-ear/target/seam-registration.ear"))
- .as(EnterpriseArchive.class);
- WebArchive web = er.getAsType(WebArchive.class, "registration-web.war");
- web.addClasses(RegisterTest.class);
-
- // Replacing the SeamListener with MockSeamListener
- web.delete("/WEB-INF/web.xml");
- web.addAsWebInfResource("WEB-INF/mock-web.xml", "web.xml");
-
- return er;
- }
-
- @Test
- public void testRegisterComponent() throws Exception
- {
-
- new ComponentTest() {
-
- protected void testComponents() throws Exception
- {
- setValue("#{user.username}", "1ovthafew");
- setValue("#{user.name}", "Gavin King");
- setValue("#{user.password}", "secret");
- assert invokeMethod("#{register.register}").equals("success");
- assert getValue("#{user.username}").equals("1ovthafew");
- assert getValue("#{user.name}").equals("Gavin King");
- assert getValue("#{user.password}").equals("secret");
- }
-
- }.run();
-
- }
-
- ...
-
-}]]></programlisting>
- </example>
-
- <example>
- <title>mock-web.xml</title>
- <programlisting role="XML"><![CDATA[
-<?xml version="1.0" ?>
-<web-app version="3.0"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
-
- <listener>
- <listener-class>org.jboss.seam.mock.MockSeamListener</listener-class>
- </listener>
-
-</web-app>
-]]></programlisting>
-
- </example>
-
- </section>
</section>
Modified: branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Wicket.xml
===================================================================
--- branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Wicket.xml 2012-08-17 11:30:51 UTC (rev 15056)
+++ branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/Wicket.xml 2012-08-20 10:02:48 UTC (rev 15057)
@@ -3,141 +3,181 @@
]>
<chapter id="wicket">
- <title>Writing your presentation layer using Apache Wicket</title>
+ <title>Writing your presentation layer using Apache Wicket</title>
- <para>
- Seam supports Wicket as an alternative presentation layer to JSF. Take a
- look at the <code>wicket</code> example in Seam which shows the Booking
- Example ported to Wicket.
- </para>
+ <para>
+ Seam supports Wicket as an alternative presentation layer to
+ JSF. Take a
+ look at the
+ <code>wicket</code>
+ example in Seam which shows the Booking
+ Example ported to Wicket.
+ </para>
- <note>
- <para>
- Wicket support is new to Seam, so some features which are
- available in JSF are not yet available when you use Wicket
- (e.g. pageflow). You'll also notice that the documentation is
- very JSF-centric and needs reorganization to reflect the first
- class support for Wicket.
- </para>
- </note>
-
- <section>
- <title>Adding Seam to your wicket application</title>
-
- <para>
- The features added to your Wicket application can be split into two
- categories: bijection and orchestration; these are discussed in detail
- below.
- </para>
-
- <para>
- Extensive use of inner classes is common when building Wicket
- applications, with the component tree being built in the constructor.
- Seam fully supports the use of annotation based control in inner
- classes and constructors (unlike regular Seam components).
- </para>
-
- <para>
- Annotations are processed <emphasis>after</emphasis> any call to
- a superclass. This mean's that any injected attributes cannot be
- passed as an argument in a call to <code>this()</code> or
- <code>super()</code>.
- </para>
-
- <para>
- When a method is called in an inner class, bijection occurs for any
- class which encloses it. This allows you to place your bijected
- variables in the outer class, and refer to them in any inner class.
- </para>
-
- <section>
- <title>Bijection</title>
-
- <para>
- A Seam enabled Wicket application has full access to the all the
- standard Seam contexts (<code>EVENT</code>, <code>CONVERSATION</code>,
- <code>SESSION</code>, <code>APPLICATION</code> and
- <code>BUSINESS_PROCESS</code>).
- </para>
-
- <para>
- To access Seam component's from Wicket, you just need to inject it
- using <code>@In</code>:
- </para>
-
- <programlisting role="JAVA"><![CDATA[@In(create=true)
+ <note>
+ <para>
+ Wicket support is new to Seam, so some features which are
+ available in JSF are not yet available when you use Wicket
+ (e.g. pageflow). You'll also notice that the documentation is
+ very JSF-centric and needs reorganization to reflect the first
+ class support for Wicket.
+ </para>
+ </note>
+
+ <section>
+ <title>Adding Seam to your wicket application</title>
+
+ <para>
+ The features added to your Wicket application can be split into two
+ categories: bijection and orchestration; these are discussed
+ in detail
+ below.
+ </para>
+
+ <para>
+ Extensive use of inner classes is common when building Wicket
+ applications, with the component tree being built in the constructor.
+ Seam fully supports the use of annotation based control in inner
+ classes and constructors (unlike regular Seam components).
+ </para>
+
+ <para>
+ Annotations are processed
+ <emphasis>after</emphasis>
+ any call to
+ a superclass. This mean's that any injected attributes cannot be
+ passed as an argument in a call to
+ <code>this()</code>
+ or
+ <code>super()</code>
+ .
+ </para>
+
+ <para>
+ When a method is called in an inner class, bijection occurs for any
+ class which encloses it. This allows you to place your bijected
+ variables in the outer class, and refer to them in any inner class.
+ </para>
+
+ <section>
+ <title>Bijection</title>
+
+ <para>
+ A Seam enabled Wicket application has full access to the
+ all the
+ standard Seam contexts (
+ <code>EVENT</code>
+ ,
+ <code>CONVERSATION</code>
+ ,
+ <code>SESSION</code>
+ ,
+ <code>APPLICATION</code>
+ and
+ <code>BUSINESS_PROCESS</code>
+ ).
+ </para>
+
+ <para>
+ To access Seam component's from Wicket, you just need to
+ inject it
+ using
+ <code>@In</code>
+ :
+ </para>
+
+ <programlisting role="JAVA"><![CDATA[@In(create=true)
private HotelBooking hotelBooking;]]></programlisting>
- <tip>
+ <tip>
+ <para>
+ As your Wicket class isn't a full Seam component,
+ there is no
+ need to annotate it
+ <code>@Name</code>
+ .
+ </para>
+ </tip>
+
<para>
- As your Wicket class isn't a full Seam component, there is no
- need to annotate it <code>@Name</code>.
+ You can also outject an object into the Seam contexts from a Wicket
+ component:
</para>
- </tip>
-
- <para>
- You can also outject an object into the Seam contexts from a Wicket
- component:
- </para>
-
- <programlisting role="JAVA"><![CDATA[@Out(scope=ScopeType.EVENT, required=false)
+
+ <programlisting role="JAVA"><![CDATA[@Out(scope=ScopeType.EVENT, required=false)
private String verify;]]></programlisting>
- <para>
- TODO Make this more use case driven
- </para>
-
- </section>
-
- <section>
- <title>Orchestration</title>
-
- <para>
- You can secure a Wicket component by using the
- <code>@Restrict</code> annotation. This can be placed on the outer
- component or any inner components. If <code>@Restrict</code> is
- specified, the component will automatically be restricted to logged
- in users. You can optionally use an EL expression in the
- <code>value</code> attribute to specify a restriction to be applied.
- For more refer to the <xref linkend="security"/>.
- </para>
-
- <para>
- For example:
- </para>
-
- <programlisting role="JAVA"><![CDATA[@Restrict
-public class Main extends WebPage {
+ <para>
+ TODO Make this more use case driven
+ </para>
+ </section>
+
+ <section>
+ <title>Orchestration</title>
+
+ <para>
+ You can secure a Wicket component by using the
+ <code>@Restrict</code>
+ annotation. This can be placed on the outer
+ component or any inner components. If
+ <code>@Restrict</code>
+ is
+ specified, the component will automatically be restricted to logged
+ in users. You can optionally use an EL expression in the
+ <code>value</code>
+ attribute to specify a restriction to be applied.
+ For more refer to the
+ <xref linkend="security" />
+ .
+ </para>
+
+ <para>
+ For example:
+ </para>
+
+ <programlisting role="JAVA"><![CDATA[@Restrict
+public class Main extends WebPage
+{
...]]></programlisting>
-
- <tip>
+
+ <tip>
+ <para>
+ Seam will automatically apply the restriction to any nested
+ classes.
+ </para>
+ </tip>
+
<para>
- Seam will automatically apply the restriction to any nested
- classes.
+ You can demarcate conversations from within a Wicket
+ component
+ through the use of
+ <code>@Begin</code>
+ and
+ <code>@End</code>
+ . The
+ semantics for these annotations are the same as when used in a Seam
+ component. You can place
+ <code>@Begin</code>
+ and
+ <code>@End</code>
+ on any method.
</para>
- </tip>
-
- <para>
- You can demarcate conversations from within a Wicket component
- through the use of <code>@Begin</code> and <code>@End</code>. The
- semantics for these annotations are the same as when used in a Seam
- component. You can place <code>@Begin</code> and <code>@End</code>
- on any method.
- </para>
-
- <note>
+
+ <note>
+ <para>
+ The deprecated
+ <code>ifOutcome</code>
+ attribute is not supported.
+ </para>
+ </note>
+
<para>
- The deprecated <code>ifOutcome</code> attribute is not supported.
+ For example:
</para>
- </note>
-
- <para>
- For example:
- </para>
-
- <programlisting role="JAVA"><![CDATA[item.add(new Link("viewHotel") {
+ <programlisting role="JAVA"><![CDATA[item.add(new Link("viewHotel") {
+
@Override
@Begin
public void onClick() {
@@ -146,109 +186,166 @@
}
};]]></programlisting>
- <para>
- You may have pages in your application which can only be accessed
- when the user has a long-running conversation active. To enforce
- this you can use the <code>@NoConversationPage</code> annotation:
- </para>
-
- <programlisting><![CDATA[@Restrict
+ <para>
+ You may have pages in your application which can only be
+ accessed
+ when the user has a long-running conversation active. To enforce
+ this you can use the
+ <code>@NoConversationPage</code>
+ annotation:
+ </para>
+
+ <programlisting role="JAVA"><![CDATA[@Restrict
@NoConversationPage(Main.class)
-public class Hotel extends WebPage {]]></programlisting>
+public class Hotel extends WebPage
+{]]></programlisting>
- <para>
- If you want to further decouple your application classes, you can
- use Seam events. Of course, you can raise an event using
- <code>Events.instance().raiseEvent("foo")</code>. Alternatively, you
- can annotate a method <code>@RaiseEvent("foo")</code>; if the method
- returns a non-null outcome without exception, the event will be
- raised.
- </para>
-
- <para>
- You can also control tasks and processes in Wicket classes through
- the use of <code>@CreateProcess</code>, <code>@ResumeTask</code>,
- <code>@BeginTask</code>, <code>@EndTask</code>,
- <code>@StartTask</code> and <code>@Transition</code>.
- </para>
-
- <para>
- TODO - Implement BPM control - JBSEAM-3194
- </para>
- </section>
-
- </section>
+ <para>
+ If you want to further decouple your application
+ classes, you can
+ use Seam events. Of course, you can raise an event using
+ <code>Events.instance().raiseEvent("foo")</code>
+ . Alternatively, you
+ can annotate a method
+ <code>@RaiseEvent("foo")</code>
+ ; if the method
+ returns a non-null outcome without exception, the event will be
+ raised.
+ </para>
- <section>
- <title>Setting up your project</title>
-
- <para>
- Seam needs to instrument the bytecode of your Wicket classes to be able
- to intercept the annotations you use. The first decision to make is: do
- you want your code instrumented at runtime as your app is running, or
- at compile time? The former requires no integration
- with your build environment, but has a performance penalty when loading each
- instrumented class for the first time. The latter is faster, but requires
- you to integrate this instrumentation into your build environment.
- </para>
- <section>
- <title>Runtime instrumentation</title>
- <para>
- There are two ways to achieve runtime instrumentation. One relies on
- placing wicket components to be instrumented in a special folder in your WAR
- deployment. If this is not acceptable or possible, you can also use an
- instrumentation "agent," which you specify in the command line for launching
- your container.
- </para>
- <section>
- <title>Location-specific instrumentation</title>
- <para>
- Any classes placed in the <literal>WEB-INF/wicket</literal> folder within your
- WAR deployment will be automatically instrumented by the seam-wicket runtime.
- You can arrange to place your wicket pages and components here by specifying
- a separate output folder for those classes in your IDE, or through the use of
- ant scripts.
- </para>
- </section>
- <section>
- <title>Runtime instrumentation agent</title>
- <para>The jar file <literal>jboss-seam-wicket.jar</literal> can be used as an instrumentation
- agent through the Java Instrumentation api. This is accomplished through the following
- steps:</para>
- <itemizedlist>
- <listitem>
- <para>Arrange for the <literal>jboss-seam-wicket.jar</literal> file to live in a
- location for which you have an absolute path, as the Java Instrumentation API does
- not allow relative paths when specifying the location of an agent lib. </para>
- </listitem>
- <listitem>
- <para>Add <literal>javaagent:/path/to/jboss-seam-wicket.jar</literal> to the command line options
- when launching your webapp container:</para>
- </listitem>
- <listitem>
- <para> In addition, you will need to add an environment variable that specifies
- packages that the agent should instrument. This is accomplished by a comma separated
- list of package names:</para>
- <programlisting>-Dorg.jboss.seam.wicket.instrumented-packages=my.package.one,my.other.package</programlisting>
- <para>Note that if a package A is specified, classes in subpackages of A are also examined. The
- classes chosen for instrumentation can be further limited by specifying:
- <programlisting>-Dorg.jboss.seam.wicket.scanAnnotations=true</programlisting>
- and then marking instrumentable classes with the <literal>@SeamWicketComponent</literal>
- annotation, see <xref linkend="SeamWicketComponent"/>.</para>
- </listitem>
- </itemizedlist>
- </section>
- </section>
- <section>
- <title>Compile-time instrumentation</title>
- <para>
- Seam supports instrumentation at compile time through either Apache Ant or Apache Maven.</para>
- <section>
- <title> Instrumenting with ant</title>
- <para>
- Seam provides an ant task in the <literal>jboss-seam-wicket-ant.jar </literal>. This is used
- in the following manner:
- <programlisting role="XML"><![CDATA[<taskdef name="instrumentWicket"
+ <para>
+ You can also control tasks and processes in Wicket
+ classes through
+ the use of
+ <code>@CreateProcess</code>
+ ,
+ <code>@ResumeTask</code>
+ ,
+ <code>@BeginTask</code>
+ ,
+ <code>@EndTask</code>
+ ,
+ <code>@StartTask</code>
+ and
+ <code>@Transition</code>
+ .
+ </para>
+
+ <!-- <para> TODO - Implement BPM control - JBSEAM-3194 </para> -->
+ </section>
+
+ </section>
+
+ <section>
+ <title>Setting up your project</title>
+
+ <para>
+ Seam needs to instrument the bytecode of your Wicket classes to be able
+ to intercept the annotations you use. The first decision to
+ make is: do
+ you want your code instrumented at runtime as your app is running, or
+ at compile time? The former requires no integration
+ with your build environment, but has a performance penalty when loading
+ each
+ instrumented class for the first time. The latter is faster, but requires
+ you to integrate this instrumentation into your build environment.
+ </para>
+ <section>
+ <title>Runtime instrumentation</title>
+ <para>
+ There are two ways to achieve runtime instrumentation. One relies on
+ placing wicket components to be instrumented in a
+ special folder in your WAR
+ deployment. If this is not acceptable or possible, you can also use an
+ instrumentation "agent," which you specify in the
+ command line for launching
+ your container.
+ </para>
+ <section>
+ <title>Location-specific instrumentation</title>
+ <para>
+ Any classes placed in the
+ <literal>WEB-INF/wicket</literal>
+ folder within your
+ WAR deployment will be automatically instrumented by the seam-wicket
+ runtime.
+ You can arrange to place your wicket pages and components here by
+ specifying
+ a separate output folder for those classes in your IDE, or through
+ the use of
+ ant scripts.
+ </para>
+ </section>
+ <section>
+ <title>Runtime instrumentation agent</title>
+ <para>
+ The jar file
+ <literal>jboss-seam-wicket.jar</literal>
+ can be used as an instrumentation
+ agent through the Java Instrumentation api. This is accomplished through
+ the following
+ steps:
+ </para>
+ <itemizedlist>
+ <listitem>
+ <para>
+ Arrange for the
+ <literal>jboss-seam-wicket.jar</literal>
+ file to live in a
+ location for which you have an absolute path, as the Java Instrumentation
+ API does
+ not allow relative paths when specifying the location of an agent
+ lib.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ Add
+ <literal>javaagent:/path/to/jboss-seam-wicket.jar
+ </literal>
+ to the command line options
+ when launching your webapp container:
+ </para>
+ </listitem>
+ <listitem>
+ <para> In addition, you will need to add an
+ environment variable that specifies
+ packages that the agent should instrument. This is accomplished by a
+ comma separated
+ list of package names:
+ </para>
+ <programlisting>-Dorg.jboss.seam.wicket.instrumented-packages=my.package.one,my.other.package</programlisting>
+ <para>
+ Note that if a package A is specified,
+ classes in subpackages of A are also
+ examined. The
+ classes chosen for instrumentation can be further limited by specifying:
+ <programlisting>-Dorg.jboss.seam.wicket.scanAnnotations=true</programlisting>
+ and then marking instrumentable classes with
+ the
+ <literal>@SeamWicketComponent</literal>
+ annotation, see
+ <xref linkend="SeamWicketComponent" />
+ .
+ </para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ </section>
+ <section>
+ <title>Compile-time instrumentation</title>
+ <para>
+ Seam supports instrumentation at compile time through either Apache Ant
+ or Apache Maven.
+ </para>
+ <section>
+ <title> Instrumenting with ant</title>
+ <para>
+ Seam provides an ant task in the
+ <literal>jboss-seam-wicket-ant.jar </literal>
+ . This is used
+ in the following manner:
+ <programlisting><![CDATA[<taskdef name="instrumentWicket"
classname="org.jboss.seam.wicket.ioc.WicketInstrumentationTask">
<classpath>
<pathelement location="lib/jboss-seam-wicket-ant.jar"/>
@@ -262,124 +359,180 @@
<classpath refid="build.classpath"/>
<fileset dir="${build.classes}" includes="**/*.class"/>
</instrumentWicket>]]></programlisting>
- </para>
- <para>
- This results in the instrumented classes being placed in the directory
- specified by <literal>${build.instrumented}</literal>. You will then
- need to instruct ant to copy these classes into <literal>WEB-INF/classes</literal>.
- If you want to hot deploy the Wicket components, you can copy the instrumented classes to
- <literal>WEB-INF/dev</literal>; if you use hot deploy, make sure that
- your <literal>WicketApplication</literal> class is also hot-deployed.
- Upon a reload of hot-deployed classes, the entire WicketApplication
- instance has to be re-initialized, in order to pick up new references
- to the classes of mounted pages.
- </para>
- <para> The <literal>useAnnotations</literal> attribute is used to make the ant task only include
- classes that have been marked with the <literal>@SeamWicketComponent</literal> annotation,
- see <xref linkend="SeamWicketComponent"/>.
- </para>
- </section>
- <section>
- <title>Instrumenting with maven</title>
- <para>
- The jboss maven repository <literal>repository.jboss.org</literal> provides a plugin named
- <literal>seam-instrument-wicket</literal> with a <literal>process-classes</literal> mojo. An
- example configuration in your pom.xml might look like:
- <programlisting role="XML"><![CDATA[<build>
- <plugins>
- <plugin>
- <groupId>org.jboss.seam</groupId>
- <artifactId>seam-instrument-wicket</artifactId>
- <version>2.2.0</version>
- <configuration>
- <scanAnnotations>true</scanAnnotations>
- <includes>
- <include>your.package.name</include>
- </includes>
- </configuration>
- <executions>
- <execution>
- <id>instrument</id>
- <phase>process-classes</phase>
- <goals>
- <goal>instrument</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
+ </para>
+ <para>
+ This results in the instrumented classes being
+ placed in the directory
+ specified by
+ <literal>${build.instrumented}</literal>
+ . You will then
+ need to instruct ant to copy these classes into
+ <literal>WEB-INF/classes</literal>
+ .
+ If you want to hot deploy the Wicket components, you can copy the
+ instrumented classes to
+ <literal>WEB-INF/dev</literal>
+ ; if you use hot deploy, make sure that
+ your
+ <literal>WicketApplication</literal>
+ class is also hot-deployed.
+ Upon a reload of hot-deployed classes, the entire WicketApplication
+ instance has to be re-initialized, in order to pick
+ up new references
+ to the classes of mounted pages.
+ </para>
+ <para>
+ The
+ <literal>useAnnotations</literal>
+ attribute is used to make the ant task only include
+ classes that have been marked with the
+ <literal>@SeamWicketComponent</literal>
+ annotation,
+ see
+ <xref linkend="SeamWicketComponent" />
+ .
+ </para>
+ </section>
+ <section>
+ <title>Instrumenting with maven</title>
+ <para>
+ The jboss maven repository
+ <literal>repository.jboss.org</literal>
+ provides a plugin named
+ <literal>seam-instrument-wicket</literal>
+ with a
+ <literal>process-classes</literal>
+ mojo. An
+ example configuration in your pom.xml might look like:
+ <programlisting><![CDATA[<build>
+ <plugins>
+ <plugin>
+ <groupId>org.jboss.seam</groupId>
+ <artifactId>seam-instrument-wicket</artifactId>
+ <version>2.2.0</version>
+ <configuration>
+ <scanAnnotations>true</scanAnnotations>
+ <includes>
+ <include>your.package.name</include>
+ </includes>
+ </configuration>
+ <executions>
+ <execution>
+ <id>instrument</id>
+ <phase>process-classes</phase>
+ <goals>
+ <goal>instrument</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
</build>]]></programlisting>
- The above example illustrates that the instrumentation is limited to classes specified by
- the <literal>includes</literal> element. In this example, the <literal>scanAnnotations</literal>
- is specified, see <xref linkend="SeamWicketComponent"/>.
- </para>
- </section>
- </section>
- <section id="SeamWicketComponent">
- <title>The <literal>@SeamWicketComponent</literal> annotation</title>
- <para>
- Classes placed in WEB-INF/wicket will unconditionally be instrumented. The other instrumentation
- mechanisms all allow you to specify that instrumentation should only be applied to classes
- annotated with the <literal>@SeamWicketComponent</literal> annotation. This annotation is inherited,
- which means all subclasses of an annotated class will also be instrumented. An example usage is:
- <programlisting role="JAVA"><![CDATA[import org.jboss.seam.wicket.ioc.SeamWicketComponent;
+ The above example illustrates that the
+ instrumentation is limited to classes specified by
+ the
+ <literal>includes</literal>
+ element. In this example, the
+ <literal>scanAnnotations</literal>
+ is specified, see
+ <xref linkend="SeamWicketComponent" />
+ .
+ </para>
+ </section>
+ </section>
+ <section id="SeamWicketComponent">
+ <title>
+ The
+ <literal>@SeamWicketComponent</literal>
+ annotation
+ </title>
+ <para>
+ Classes placed in WEB-INF/wicket will unconditionally be
+ instrumented. The other instrumentation
+ mechanisms all allow you to specify that instrumentation should only be
+ applied to classes
+ annotated with the
+ <literal>@SeamWicketComponent</literal>
+ annotation. This annotation is inherited,
+ which means all subclasses of an annotated class will also be
+ instrumented. An example usage is:
+ <programlisting>
+import org.jboss.seam.wicket.ioc.SeamWicketComponent;
+
@SeamWicketComponent
-public class MyPage extends WebPage{
+public class MyPage extends WebPage
+{
...
-}]]></programlisting>
- </para>
- </section>
-
-
- <section>
- <title>Defining the Application</title>
-
- <para>
- A Wicket web application which uses Seam should use
- <code>SeamWebApplication</code> as the base class; this creates hooks
- into the Wicket lifecycle allowing Seam to automagically propagate the
- conversation as needed. It also adds status messages to the page.
- </para>
-
- <para>
- For example:
- </para>
-
- <para>
- The <code>SeamAuthorizationStrategy</code> delegates authorization
- to Seam Security, allowing the use of <code>@Restrict</code> on Wicket
- components. <code>SeamWebApplication</code> installs the authorization
- strategy for you. You can specify the login page by implementing the
- <code>getLoginPage()</code> method.
- </para>
-
- <para>
- You'll also need to set the home page of the application by
- implementing the <code>getHomePage()</code> method.
- </para>
-
- <programlisting role="JAVA"><![CDATA[public class WicketBookingApplication extends SeamWebApplication {
+}
+</programlisting>
+ </para>
+ </section>
+ <section>
+ <title>Defining the Application</title>
+
+ <para>
+ A Wicket web application which uses Seam should use
+ <code>SeamWebApplication</code>
+ as the base class; this creates hooks
+ into the Wicket lifecycle allowing Seam to automagically propagate the
+ conversation as needed. It also adds status messages to
+ the page.
+ </para>
+
+ <para>
+ For example:
+ </para>
+
+ <para>
+ The
+ <code>SeamAuthorizationStrategy</code>
+ delegates authorization
+ to Seam Security, allowing the use of
+ <code>@Restrict</code>
+ on Wicket
+ components.
+ <code>SeamWebApplication</code>
+ installs the authorization
+ strategy for you. You can specify the login page by implementing the
+ <code>getLoginPage()</code>
+ method.
+ </para>
+
+ <para>
+ You'll also need to set the home page of the application
+ by
+ implementing the
+ <code>getHomePage()</code>
+ method.
+ </para>
+
+ <programlisting role="JAVA">public class WicketBookingApplication extends SeamWebApplication
+{
+
@Override
- public Class getHomePage() {
+ public Class getHomePage()
+ {
return Home.class;
}
@Override
- protected Class getLoginPage() {
+ protected Class getLoginPage()
+ {
return Home.class;
}
-
-}
-]]></programlisting>
-
- <para>
- Seam automatically installs the Wicket filter for you (ensuring that
- it is inserted in the correct place for you). But you still need to
- tell Wicket which <code>WebApplication</code> class to use.
- </para>
-
- <programlisting role="XML"><![CDATA[<components xmlns="http://jboss.org/schema/seam/components"
+}</programlisting>
+
+ <para>
+ Seam automatically installs the Wicket filter for you
+ (ensuring that
+ it is inserted in the correct place for you). But you still need to
+ tell Wicket which
+ <code>WebApplication</code>
+ class to use.
+ </para>
+
+ <programlisting role="XML"><![CDATA[<components xmlns="http://jboss.org/schema/seam/components"
xmlns:wicket="http://jboss.org/schema/seam/wicket"
xsi:schemaLocation=
"http://jboss.org/schema/seam/wicket
@@ -388,13 +541,15 @@
<wicket:web-application
application-class="org.jboss.seam.example.wicket.WicketBookingApplication" />
</components]]></programlisting>
-
- <para>
- In addition, if you plan to use JSF-based pages in the same application as wicket pages, you'll
- need to ensure that the jsf exception filter is only enabled for jsf urls:
- </para>
-
- <programlisting role="XML"><![CDATA[<components xmlns="http://jboss.org/schema/seam/components"
+
+ <para>
+ In addition, if you plan to use JSF-based pages in the same
+ application as wicket pages, you'll
+ need to ensure that the jsf exception filter is only enabled for jsf
+ urls:
+ </para>
+
+ <programlisting role="XML"><![CDATA[<components xmlns="http://jboss.org/schema/seam/components"
xmlns:web="http://jboss.org/schema/seam/web"
xmlns:wicket="http://jboss.org/schema/seam/wicket"
xsi:schemaLocation=
@@ -404,17 +559,19 @@
<!-- Only map the seam jsf exception filter to jsf paths, which we identify with the *.seam path -->
<web:exception-filter url-pattern="*.seam"/>
</components]]></programlisting>
-
-
- <tip>
- <para>
- Take a look at the Wicket documentation for more on authorization
- strategies and other methods you can override on the
- <code>Application</code> class.
- </para>
- </tip>
- </section>
- </section>
+ <tip>
+ <para>
+ Take a look at the Wicket documentation for more on
+ authorization
+ strategies and other methods you can override on the
+ <code>Application</code>
+ class.
+ </para>
+ </tip>
+ </section>
+
+ </section>
+
</chapter>
Modified: branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/images/architecture.png
===================================================================
(Binary files differ)
Added: branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/images/ee6.png
===================================================================
--- branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/images/ee6.png (rev 0)
+++ branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/images/ee6.png 2012-08-20 10:02:48 UTC (rev 15057)
@@ -0,0 +1,98 @@
+PNG
+
+
+ë]ï #¿|è¸@£I
+ <
+üOâ¼8::vDÔXouÏKÖëµÉÖ¢hS"y±
+¶þJàþoèê îÔÿB)ÿcçÙÈú/âßo at MÖ)íAU9¯d:¢D·X1
+§¨¨(Ñ>££#¶Â[_njj\fddòíT
+
+òôôÄܬ©êÎ;»1:j,DÐíÈdcW¾¹AW0>%LÞÔG£]oÉ÷UóÎÄlVUa¡[jèÈÐ`V¸9§ÞÏê¡yÈ°'LNSÅ£7om6QÛ´fèKÑÁ¿Ô±¿Rv×,^|Ë¿å%]hbæôÃ÷+sLÎ+ì(º
+ÔÉ/Ðhé'7.§Ñ2¿¤¿®E£
+Eîi.Mú;âx9ßÔ]+=tBÓh>ÉdehjÒª?[Xù«=ónÙedÓÑiI?7sÕª»^=i'W£n
+K µºÛV<ëC}Ρñ×,n}kx,ðà}5ÃÝäûWª*7ë}^è2Cí-òÙ.¯âA[{,IÿÔQlQÃD»=Çp<{!!¶¨Ä¡ÔÝÈWª«ÅàÀòa/ç[9¤¡}»z¡3{@g÷?â3/&̨ñq;{ú=
+&2#Â ßëRcWO»ýéy£5?bÿÝñ{
Ðd_X½b7çí6i5NÞ3·nÝêãÓåUU[Zç¶0üÂBAþßZSFM&¦ÝDRRQhhkkk¡ZK¸P¥31R¸Òvh'«ÈÎÎVCG«b
+aö©èèèùlÈA"""L&S)êjÈç77øF_9ñC©y®ËuËiÚ¾ÕÓåÔÃ(V
+óÜT¢bMèCd<÷úøÓ·xm¥±V
ß$áгÈÅ/úµÏHb7&W^¹Á9ïÉ)ì¬næ¤eºSÂÇ?»¬}=¥÷ÙÝcØG
+×®ÙæÛtI½Ü¡;5cà»+&+Þ¿¢q«6~;£è²3]6î»Û÷{_î¥;µê
+mE`` |³*Ø´idN\!üì
+¢Î\AÔw>v÷~®Ñ`t¯3Hë9×g¶dcÞ`u/vaÆHú[jËÔÓÒ8ïTÿNo2!ÂYÑoÎVáY¾~÷âç
+øgMr¯PCöÁÜ"<(ççÏ1³_e6¸q¼´µºCû+Ñ¥¥¢V÷I#åù!a/ÖKÒ\|üÞ ¥qæ´í²µÈÓ¸û§Û² (sí=æíóÿ<½÷ß«×Ï×m&o2å¬e`b Iì{vÔ=Ü{³ÄÙH¹y¼ÊæTspÔÁ"ã6bwïÏ{w-]VÙUØZ¶¯xOùüʤêë±ÞGPNp<hbþâ´«åiËQøb¤.°xUßÄgIÄì$*´å5ß³mùØϵ!--þ¼*h_Krr\`ÌRÍ'ܤÎO%s¹nÉ0Ãu¸ö«3!ìÚ/áOýû÷ÇNäZÛÂÎPÄîr,Äoa\\ÜE1-.ì.×"÷.÷@ð#Ö¥aõ¸C3Ź²²²×>p-¤q³{È$7{çüDîB&nö
+&"¬hʯO-È6íêª*ÊËNQZNØ?£_§,I_|Ñ´7??Ü,ä¤M
+¤:pôã
+ªÉons¦£ï+ê^õ:Ç÷[×ØÔM÷©ÒKí|õ¾eGÏp\ºh&¤3p{UìÃyUEW£7_MFtª|¹è¶rg÷O
ß?w
¿ÒÖѨÇ8ÓX½é×Þù§VË%Ên\3³ÃÏNÑÇ[1ÎT© qô¼¿ÜÜúÓ:èI´uðÃöOÇ~§#½tçßs$Ù/Óëø±EXª
+Z²Á ©WgUëËÕ+QöÎ/öÚ¿¸áà©×ïʧ÷þvßvo^§^¢Èî1óÆkÀ(¡iµ¤lExÌ_VÁã
+c¯Hb sIzOÕ;!SRÿ¥S!¤MdpÞò2Ì;ÿü¢.òÁi|rÛô6?y3æaÿÖ>}XýîÞqcÂnÅL_ö_Ý¡1*ÏdNk8ó.'Ñ«þY a«þU_r¹D<R-jè1@!Ò&*T
+Ý©
UÓu23Q^¬O´¼¬ËØHü>Wcnà»ð&·Ýàßü§yrÛÿ>pòÈàpÕæ§U#GÜ«·>be÷ß
®%a"iAÚDÓDôÚí3
+ÕÞâU
+ãûãßf2?~féE×å;a#Ù~_1ýx{Ðú$á7÷Øß»qµ<;»°Û,À6(?l,¥ÁPÆÆ#Á#²ö¸Å.ÒÖAh:PÄñWÒ¬ÔÒZÆæo»ãzjìÞ{x%3jz~ÙC(míÃçyɪìÛ¯ÐdÜ[¿/Çàâå¦5á£æËöEòK_ú.ø5,á´ FV
+ªRl
+xXë ¼ôü´NþWzìaOMeR]ÉÇröD9S¿c[§¨âë³/^Ó÷Lüs¦Zcd}¥yÚlú·VÝ.ú¸ó@0Qu¡²¬Éü+1
+ßfYÖÛ¯ÈwÎ
#UÖ
+¥ô(}~<tÇúyÔx¯ãÛ-Ô > åMçwæXµEoï_ýþùÙï^¿ÌÌýZ©©¯ªg«!hXx_·ñ¿¿sãɱç"£faª÷Ö»õ`¨ÇÎ}mªuôZ÷Ç@áõöo2ºÃ:09ëýgÜáìIè5l{´ùÜcö·Üÿþåð-8'üËÛ9sÊ(~tùò÷̶¶£¹zÎVïÌU¹Ì)ö=
+DÕ
+ÛðÑÖð-¨ÚÄ ß(#WÞ6NÔ'! ¾WÞ¬aA@@t¼Aaú$7ï·´´4sssX!o"6°u+,Mî
+QÙÔ¥>iµb$¢ÃÜ"²þkg¢ÃõI(l'o° :OÞnÞ¼idd¢3ä
+[Yì²ÿc£ÂÿüÙæìcV=¿ê{úQY¿W?×ÛÓ¤¯¶M©îe×¹òo¦*gæºßcdkÏUñèPDPb½
ûxmÓõAsTàþ!¨OvԽزéT£¨IëOZ8k 2«äÅÅÔSw9þ¥·N¬µºãxdí´^«¾¬f?%¿"¼²tkR·,89¿ÑCæãÙ5AÎýÓ§Þ`ÒÌÌI²{`¾ÛwùP¤
+Êø£¾èÞÝ&ýl%Umm}m}Ãdë×ïfU7gÁËUÖ0
+Ũo*F2òRh%fÕ}ÈÎÇúSgyØjôÓÂcMþä¸j ?§ÆÜ4r3Un®OÎßÛf}²ñ¡_\
+Úp:³·wÔêáè0©'´MÛAò¸iÓ&Xß<(<óWôÆÙ¾ÄàÓý7OÔ,úoïÑϼF
+Ó@-áð_ï
¹_*äéQf¬[<Ñq$u=ë¡g<¬âÞTêÝKZS
̲gûö_+áil¶xêHC9ë8ìÞ½
M$1ô^g·f{|Ã;¬ì+Á˯ðFþ¶}U?l^¢ÿ¯;w16¬½Ú _ή÷<+0îÆ^{mEhHYôßâ¸LFϪ{ëf'ò?ðçC¾C¤!½¢Ô'Eæ½Tëºg©×ÒÒ½xSPÍ/J)ôÑÓûßôɦZMgq2ÃæPSçÐK²oûïÖÝ7o³«0!ÀK)«i8f²±QoY¿«yºÿ°At>YZZª¤¤BD!$åa³¬OPÖ!Û#¡dZÏ50Áõ;Qj¸×ÎHÕ@DD
+DçÀÅÅê¨OÂ"è<yÛ½{·ÛwÆBÀ¡H9°(DKÈÎÎ&~¿°aðññ
+Ñ
+tttD¥O²ê¥°@!º#pÍ)#""\\\¾3zFY`@øp+?HD7AñÞI7ñ÷÷'~¿°A@@ooo8? ÑyòÑIHJJö'! : ÖÖÖ°%XÕòw¢¹ù¢åR/´êåHMÜöõIïB}vÿè]Ük©²ÑVû(âÊßö¼}Yã_®ruûøç¶wíLj é+(oíþë3åJ^é:yåê^zýõGɽ}*[Û`ÿ'C¨c)®ÀÑI34ÞUÉË©¨e Õ+ik
++A.ê)ËjÚJ÷zð_ÜÒ"g_
+)¥X£¢ýuÑákÞ_d{¥Á,dÑÜ7ÒOúü{Y-û ù!^¶º¯áû³
+U$ð%OµþMU#Y
+
+¥ÎªTº<ìQIx$øú:äóä¬ÀWox<V5ËPýdpt¤jmSù#qt:¾¦Tæ#òy¤q
+Tx?ÓÅÿµª'Ö©6I©R:û^Ì5=¾2¹×¼¾P7Êãî$m&¤VT077ò&:*¼nL KæÒúܾª[ÒlV)òKf
+ xã°ê³"Cþò¶a¹Ö[Uòzg÷ÄaíYbÊݪ¼íé@Y ÿÂ%PýTQ*YQS¯1¸R
+²Ù·´SO©4Ø!½sAaÄâ¯ÍPbÈ+ò8âûx·xî«¿_¸þ}O¾øÒ®©!ÒrÆÚeY¨Ov¹:ÉÂtv§BÔ.0Z§ªUCÂìÿÔKå\xú¼b=·y3àܽây}syM%kźi !÷æaà
+z¥r@k¨Y§uD-[¶@y
+pxâËáÅ>Ú["4D6ù£ÎUÅ×°êÕÔè¥Zr}K¸µ[ªÈzë~c!¸úJNNä©ð¬
+ÕçrõDÕ¼Ù½$9S5Q»4ª
+]¨ýIX
+"R*7>f¿_ÄñøzmØÞkÖpy0¹2.*ºé9=ph&&r5ªIëQU¯£7
+¿êÁd=: 0¤^;z+Òú;PI]Pü^º¯°_úd·ïâ¤Ê&úÞH'}z þìr^®Li)mÀIÖ)k÷Ñ/nôEM¦q&'_<}ûi52o®k>}¨ôùT5-lxº\¯ÊÞôMóû¨09Ò#]2kÇ¿%ûܼÔ3;G²¥Òå2ez6oÇÕ18v3Y÷T3§²t,ä¤káæÍPÞDÞÕiæ"¶jÕ@ó7
9GÇTc9"§ùùÙî³ùü=3Ü.ýØ}´ gïåDÍv ¼A@@}ÊD»å
+¢`oo/y (²7õÀ}=ÝúP7FÞ,VÀÖ°@!º+D²'{Ó¦M¢ì߬V¬Ä@t3p¸ûC > !f(--
òÑIòÑyòömÔ>öö½R-Tqý#ʨà̤`ý=þçÌ~0zPpÝ]>ÞiÄVÖ5zÚs2B[>aVe?¾|ëöÃ÷*Ù{ð2=zjj<sâäáÊÄvl# ÷ðÎäìúÖtðÚe§+·îVuÉÛ/G éá1ãZ:Vé7ÿûÍ%ðËçÌtäså ëí³ÖX/¼¨Ñþñ ¸UÉòÖ©´à@Øxµ¯ÕgVØ>sMölVEfÄÒ½ée
+·ªMúd°´w+Ô1K&/ÅUT¢ÔlܳD
+_ý:|A8³1µæNôÍã¦iµj0ÿôLÜ¥ó©o!ïPÞ~àHòÊÒ
+úÁ/â#¾e¿7ür9(ð2ÿ3Ìòò:Pc
+Ü&Á*å
+Ê7(oPÞ
\ No newline at end of file
Added: branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/images/hibernate-ee6.png
===================================================================
--- branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/images/hibernate-ee6.png (rev 0)
+++ branches/community/Seam_2_3/seam-reference-guide/src/docbook/en-US/images/hibernate-ee6.png 2012-08-20 10:02:48 UTC (rev 15057)
@@ -0,0 +1,87 @@
+PNG
+
+
+
+
+¬f½¡ )**jÒ ÚSÐ1Øɬ¬¬Z`½Ãä|2ù-æ@TD `þÕäN]¯K¶xÌð"ù
îܽû!tdò*Àq@ïC[Í`æÀ´¦nÃsªÉàúÆéwt¬9À0{©
yg_.=öh Ñt¾øµÚ±óÑüQ¦Ûõ&e¦ ¦bt»<_øáy?,¾Ö'ceü8çîÖazMA°¹
+l¾ÔÂþ·µ>A´nrÃFÐlÕf
+j`ëI?°BÜírÕæúQk ÏÉÉQPP¸}ûöìٳѬ kwMJJZ||¼^ëMÇÕb©µ§Å¸E¤
+yÕ.£Úä/ìùl{x°
-lí·§®Z|ÈÚíÓbÐÄ"CÒÆrÿÇö¼fÂt:RJFÀÜƺºWÑSñ²¸^
+×K²D×0+NPÞ
+Ò£âçëYÛvÍ5Æà©ù¬oÿñ7ý`ñ>=%$?3tu/Üyq&ººïÆÑÀµÝ"Ò
+Æ>%Wk$°ÊßáólöR2Z²£lìqÕËôH4;¸äwÀÚ~ªÏµ³
+#/Ç¿«y>ý[b®7géñMÉÑóßü£_`£ÃZ¬z6Rp}>º°1²áE":¿¹à@BÄU ¡¶:õ
+ÎËÒµ³¿^CE4 o±å{¿U\
äG Nñ z\ü¨¡ýåM"OU<¬ztºEÄ6{»»mÂÍw?µ$Óó²Ä-^÷Öí±,qû9ÿæY!¨?@ôR>ÕëêθOêòªIm*ñu,Ai:ÞôÓ7ÖÕ-áàcV¹{W-:ʧË3WÇLüêÉãQO1ùÔÑ;÷Ybâ¸O¿4ò_2cc9ÆyU¹yÙý%qþú-h"&4CëîÝàÖ!ûܸ«ÓÞÙ Ê«Þ¹àïv tÑFO»¿I¿Æ§5¾Á Ï_!îÒ(?>'Ò~mÍEG¾/Þ_L&ë·¦N]=(ÓX
+À
ñûÆÓ
[7Lîóò©M%ú=^oûÕ¸¸
+RMJEg}&[¼½rV qLç5ý W*-µ®°,7R'WV©¡;IÐ)@rÞËÕýø#2Æ&**òqX¡0À5Ö2ƾ°Ýë"Ô¬7]ÕÊì´¿2dúJûl8á¶d;8kOÂ,¦í¨"¥ÉÍ[ÞGÿF>A@>ýçøÄ]§t¹ÿ&à>nE§ö±ÀbýwVû*Ðòzº¹väÖ1ì@R¾¡RÛp<ÂÂ
+ÕX¨Óx=
+=pos.f0e»óÔM'¢Uk07d-ÿO¯!ZEϽ«Â¡îak"rH$û+ùÔJÚÄxçCÓGÝ&Ý£
+h´T´BV¨(3&ªÁ¨qѲÖpãzc襨ù)¢9ì~*_½×noU´ 8:XIó4"IïÞq·ôÆSnä´Í»Å²ò6'<vëêYÏDݽ黦Hª^ÒôرÔëÀåóÇ®±¹S÷íY°Á¤GXzùÎ
3Gÿu|
+l¾eA¿
'Xf(X²²ûÔ¥¿ÞS}3/Uë+ØýL³mYbß¾2díÁ9ëÂÀÙ&Éñ¤¦ÛøL°?Dê
+5ê{\¢ýè?pKof'¶ºvöNbÔ¨Q£¦½¼¼\\\GHH _]úu
+ëîÖ6Ø%6v
+âØ·oß®]»½=z 411 äeëùÖ÷²®ÊiÓµ?õaEEKHXÒÕ¹îÚ·1 ÕµèLÌy0°îça]Èú¨Å$À¼Æ$hÓÑBÐúfÔÖLb÷d3ëCöU m²aìà¼ääS3|9³Âü±9ùØì®ÇÔ¦#ô¶±}G³55ðX©âUwÈqOÝÖvèûHÚ6z¡(jkÒ°]ä 9ûÞn³?ìÆö|j´ê÷S
+7©jhó%Ì£DÆ7ëén?$uª®Þõx²¥%Mß.[;FLrþ7èjWܧ:;Ïsú"x
+f°;b×&M@öF۲ߦE&·Ûî!<¸çÎ d¨ñOØúÓ«=ß÷×|bÀÌPïHL<R6uzÀöÜ{çê~0Üw9½ÓÍ^ýqb¥i×¾UÏóµMÓeL
+RûᲿö½èÞÆl@ÇÒ-gWçHdÞÎ÷\åÊÂÅcëa»×%ÌóMÈ{:t^~q;îååQ/¯Ûz}£3 9¿C2pÝgL9
+Oöñ¢ã
+tfÑp.Æ¿ z÷Ã
+Áä2æG¯¤
+/våTÓÅgV¾D´ù¹²/ó-cÐ÷µð«`þ¤~Ø?u[rënði³Ï²í+ïØújyCçÑ)FÃÇë8¸bÌD~ÒµCNññP³<ÒCúBPK0Eú'Y°·
+@>µáN¦JÑb_©Y[xð^ã<"ØÇa°ô4ógfÉÓOaábðö
+éy9ée#ýNyÚ¯uÔwT
+¸Ì
+
+/àjîïÅWme
+âömpZ~
+ßvéèb9XÏ 8ý>h'Wÿ½z÷iò§¢jÔ4
+¿¤²úä¹ækÇÉðÕ¥^ay± Ï?ánÚìZ»m±×kúÎðCseð?§wµôux¨aPøî1ÂL_>Ù.3\`õâÔEÔ9·ÎüØg0Èâð¡ðÑ¢Tã¹ÎÛ62DÓõZÐÌAËw=g\Ù§Û¡
+5~»æàõºQhêþ}sPYêD8=¯\R¿?»ò
+DµÇ|õ3±¹ÏþNlá É!¨îAqúmð
+´%[°y4VgúLã©õùJfJÊ/ñs¶Äý±Ë+
+ÐAI}æY»i@Ê8Ðe²®³át¼AõµóüøÚ¬ËÃ-Àó»Älª,¬Dþ«ÛE8çªÄì3iUoWZ×ܱ%5îµ=(Ní(rTߪÞápMíõs"Á><Ýÿ+,«:x²Ê ¡j£GjêZ°Û:ñú~OMm¢½#FY$vØîT¸!Èz¤à¯ÓñpÈçÆ/~
øÄ"]i6UjѶJlú'NDc
+A#ÜåÍÇèeçHãaMû;Ä©ó["(o|[GWH/>vqc<%'¥
+J«±Ãb<ÂÒýPÓ;mÆh ^x*{\Ú÷S6^IÕmÔuJIVZò¿ðÊ«OØÌçchÕoü½¼ïühõ¢±ºø[ÊCäwstÝ1MÍâÄ% d^b%±ñ»OiÐmÊPË^;\O¥`'öËcO¼¸{¼T[§;Xø%¦U¿ú÷
+Ð8§½^#&©Õ ׳
+o/?ÐðúGÏ e9Pª|uüÐþkyM&kçØ\®+#
+°9|ò-"¹¥ª¯u°%É1ZzhÑÜZ]ÎÛ:iÃL;ÈS¨ìõè¸HTkáÛ;]Ú·í¾¼í¦/4=I]J!^r¦Í¥SH<==]áõ·]Ƶk×x¡,A at p-Êç½ÃoÙ²¥ëñóÀùV®§ª®/Gd#! z
+©À...PÙಥ¬¬ÜÅP<<<F/p¥ ÁTO¸´¸ëT`` o×e -Tö 8§ìÁ"àyaè:ÔÕÕaï½^ÚLÅGf×´K 1éãÓbQXTP :®üæÉ+"¬ç~ïçýS.LÈ{<(òD-ݳìÉðãï¿pÿÔØ}ìK¡+ Ñ=ƪ
§)
+©ôÅâÀ1AZk ¬Jq\!¿¾í
+Ø}Be¯Á'ÿmà V 8S,'C<3I&«y<ýø£ßè%,õ8Ý&¥TÛ¨6~uWtY¾AaöG9=Ì2?åeÉ]Ü¡Ðy
ÚÚ·bË»a¨é2¾qòÞR9+ì³d¶O¬¬ÝþÂLK /
+ò²k at wEÀRøý¾©R:Üyx6«ò~åö~Äð"áEZsÓkS®e¾¬. VâA9³êë¼±4ì C ÕHÜvʬñ@6ßÈêË0
z<À»4îBÇ©ãmsòO
º pWD×&"Díüúï>¥bì¹A<ÚeJt¤ý³¯+äìDÎû)`auñQ]ÿaU|¢ÙylË6ÛþE@9
-¢¾ió뿼/e·³°cÊÞ¢øä¿®$~m¬û "VðM°ºSçhübiåïµóÕ5ªX¶·øf&fÕI¾ëöQ¬¨?ÿ#ÚÉàk%+ÇäXÞÉDþ¥Ù>}$[ÀK¥
+}zÎ#R6Òò
¦p´ûtLب}_¿ã4®²£gw¥ÐuðUü:=Ü)gZ:®SA×)NOG~^PæHhá%oñÔ΢µvGã0¦uÈå³$ÌÌãày'¨ìA@ô> `)@@p³d÷î°@! ²Ç¸ºÂ#§rJ#\úàRðà¨
+i
+¥W¼°ê8ð5qQ[QÖ½²¬26)ç¾¾ÏÛ¨ 9§®¥8©Ì2#Òúį6ZI¹´0HeNPYQ6V$ö»UÀ¼¸ªÚØqjjò^U2åïç{Å-#²P ~ïNo±Ë01OK¸x3»É_iZÊs
+Õ.OaAovÀu¢,Ò¬×OF<+ê+!&!ÕWBVI[KÔ5¼¸H65|9à{«ù(»üÄ.cE$U´ïOÂì/µñW@yÏlY*Þ¾zL(oT8ô×2=ß@ÿiêõÈg?Ù=Eu,ö;¡2^z¢gÄr`pð=ÔôJÍóóÖsÏ·¨ÃJó×;/Rã¼~Ä«¸Äô{!wýÆ
u¶jâ`EÞòìæ¯BÂHôKºPÈ Ê}`ÿ
+=(N½¤Æ?#nÛ*¥~O¶ðäºíq»ãÏâçÒuðÐuèLJU¯;JªÃͶ*Ô*Ub'ª¶1¸ñWjòjÒê.g'(NP ºCàu \
+NU`^( ï455õôôX>)))W¯^uvvfÿÀÏÏO[[,11ñÞ½{»víjAÐ íÛ·O__¿Y||¼½½}Çd
+BÙ¬¶¶2õ·1mÚ´ ""â§,k,PSSëÌÇÇÇØظYRRMÇd·oßNOOoM¶jÕ*v2$Ò?Vÿ³èÕÒ¢×d
\ No newline at end of file
More information about the seam-commits
mailing list