Update of /cvsroot/xdoclet/xdoclet/xdocs
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29691/xdocs

Modified Files:
        navigation.xml 
Added Files:
        envhandling.xml 
Log Message:
documentation for the new environment handling added (XDT-1325)

--- NEW FILE: envhandling.xml ---
<?xml version="1.0"?>
<document>
    <properties>
        <author email="[EMAIL PROTECTED]">Matthias Germann</author>
        <title>EJB Environment Handling</title>
    </properties>

    <head>
        <link rel="shortcut icon" href="favicon.ico" />
        <link rel="icon" href="favicon.ico" />
    </head>

    <body>
        <section name="EJB Environment Handling">
            <p>
                Declaring and accessing a Enterprise Java Bean's component 
environment 
                properties (i.e. environment entries, ejb references, resource 
references)
                is complicated and error-prone. It's a source for typo's 
                which remain undiscovered until the EJB is deployed and run in 
the 
                EJB Container. Moreover, the EJB Bean Provider has to write the 
same lookup code
                over and over again.
            </p>
            <p>
                The Service Locator Pattern tries to solve the problem by 
having a 
                centralized place for the lookups. The big disadvantage of this 
pattern
                is each bean must use the same naming for it's environment 
properties. Thiy may
                also be a source of very strange behaviour when two bean's use 
the same name
                for different things. A possible solution is to use the 
physical JNDI-Names
                instead of the names inside the <code>java:comp/env</code> 
namespace. It 
                but it's at the border of the EJB specification because the 
beans do no longer
                declare their ejb and resource references.
            </p>
            <p>
                XDoclet makes it now a lot easier to declare and access 
environment properties
                and it's even possible that each bean uses it's own naming! 
This is done
                by expanding the current tags for declaring environment 
properties 
                (i.e. <code>@ejb.env-entry</code>, <code>@ejb.ejb-ref</code>) 
to field and 
                method level. The lookup of the properties is delegated to the 
technical 
                bean generated with the <code>session</code>, <code>mdb</code>, 
                <code>entitybmp</code> and <code>entitycmp</code> subtask. 
                This means that the only thing you have to do is to declare a 
field or 
                a abstract method with a XDoclet tag. The deploymentdescriptor 
entries and
                the lookup from the JNDI-Tree is generated by XDoclet! The bean 
has not a 
                single line of JNDI-Code.                
            </p>
        <subsection name="A simple example">
            <p>
                Let's have a look at a simple example. This example declares a 
field-level
                environment entry and a method-level ejb reference. <b>Please 
note that this 
                is not a complete example:</b> there are many tags missing, 
only the ones 
                related to the new environment handling are presented here.
            </p>
            <source>
package example.ejb;

import javax.ejb.SessionBean;

/**
 * This is a environment handling example for XDoclet.
 *
 * @ejb.bean
 *   type="Stateless"
 *   name="Customer"
 *   view-type="local"
 *
 */
public abstract class MySessionEJB implements SessionBean {

    /**
     * @ejb.env-entry
     *   value="1234"
     */
    protected int aFieldLevelEnvEntry();
    
    /**
     * @ejb.ejb-ref
     *   ejb-name="Customer"
     */
    protected abstract CustomerLocal aMethodLevelEjbRef();

}
</source>
            <p>
                The field-level property must be declared protected to ensure 
that it
                can be set from the XDoclet-generated subclass. For the 
method-level
                property, the method must be declared protected and abstract so 
that
                it can be implemented by the XDoclet-generated subclass.
            </p>
            <p>
                Let's see what the <code>deploymentdescriptor</code> subtask 
generated. Here is a snipplet
                of the generated ejb-jar.xml. 
            </p>
            <source>
<![CDATA[
         <env-entry>
            <env-entry-name>aFieldLevelEnvEntry</env-entry-name>
            <env-entry-type>java.lang.Integer</env-entry-type>
            <env-entry-value>1234</env-entry-value>
         </env-entry>
         <ejb-local-ref>
            <ejb-ref-name>aMethodLevelEjbRef</ejb-ref-name>
            <ejb-ref-type>Session</ejb-ref-type>
            <local-home>example.ejb.CustomerLocalHome</local-home>
            <local>example.ejb.CustomerLocal</local>
         </ejb-local-ref>                
]]>         
            </source>
            <p>
                A env-entry element and a ejb-local-ref element are generated 
for the 
                declared environment properties. The names are set to the 
field- and 
                method-name. It is possible to customize the names with the 
                <code>name</code> and <code>ref-name</code> parameters of the 
                <code>@ejb.env-entry</code> resp. <code>@ejb.ejb-ref</code>
                tag.
            </p>            
            <p>
                Now comes the intersting part. The XDoclet-generated technical 
bean class. 
                This class is generated with the <code>session</code> subtask.
            </p>
            <source>
/*
 * Generated by XDoclet - Do not edit!
 */
package example.ejb;

/**
 * Session layer for MySession.
 */
public class MySessionSession
   extends ejb.env.MySessionEJB
   implements javax.ejb.SessionBean
{
   public void setSessionContext(javax.ejb.SessionContext ctx) 
   {
      javax.naming.Context namingCtx = null;
      try 
      {
         namingCtx = new javax.naming.InitialContext();
         aFieldLevelEnvEntry = ((java.lang.Integer) 
namingCtx.lookup("java:comp/env/aFieldLevelEnvEntry")).intValue();       
         aMethodLevelEjbRef = (example.ejb.CustomerLocalHome) 
namingCtx.lookup("java:comp/env/aMethodLevelEjbRef");       
      } 
      catch(javax.naming.NamingException e) 
      {
             throw new javax.ejb.EJBException("lookup failed", e);
      }
      finally {
         if (namingCtx != null) 
         {
            try 
            {
               namingCtx.close(); 
            }
            catch(javax.naming.NamingException e) 
            {
               e.printStackTrace();
            }                   
         }
      }
   }

   private  example.ejb.CustomerLocalHome aMethodLevelEjbRef;
   protected example.ejb.CustomerLocal aMethodLevelEjbRef()
   {
      try 
      {
          return aMethodLevelEjbRef.create();
      } 
      catch(javax.ejb.CreateException e) 
      {
          throw new javax.ejb.EJBException("create failed", e);
      }
   }

}
</source>
                <p>
                    The XDoclet-generated class performs the lookup of the 
declared environment properties. 
                    The value is cached for method-level properties. If the 
return-type of a method-level
                    ejb-reference is the component interface, a automatic call 
to the <code>create()</code> 
                    method of the home-interface was generated! 
                </p>
            </subsection>
            <subsection name="EJB references">
                <p>
                    As you could see in the previous example, it's very easy to 
make a reference to another
                    EJB by adding a abstract method which returns the 
referenced EJB's component interface.
                    The XDoclet-generated technical bean class will do the 
lookup and call the <code>create()</code>
                    method.
                </p>
                <p>
                    This makes it very easy to reference to a stateless session 
bean. And it's also the recommended
                    way for this because the Home-Interface of a stateless 
session bean is most of the time only used 
                    for calling the <code>create()</code> method. But it's not 
a good idea to use this feature for 
                    references to stateful session beans and entity beans where 
the Home-Interface plays a bigger role.
                    For those bean types, it's recommended that the abstract 
method returns the Home-Interface
                    instead of the Component-Interface.
                </p>
            </subsection>
            <subsection name="Caching">
                <p>
                    For method-level properties, the values are cached in a 
private memeber of the XDoclet-generated 
                    technical bean class. Therefore, the developer is not 
required to care about caching. 
                </p>
            </subsection>
            <subsection name="Stateful Session Bean Passivation">
                <p>
                    When a stateful session bean is passivated, the nvironment 
properties of the follwing 
                    types are not passivated. They are set to <code>null</code> 
in <code>ejbPassivate()</code>
                    and re-fetched from the JNDI-Tree in 
<code>ejbActivate()</code>.
                    <ul>
                        <li><code>@ejb.resource-ref</code></li>
                        <li><code>@ejb.resource-env-ref</code></li>
                        <li><code>@ejb.destination-ref</code></li>
                        <li><code>@ejb.ejb-service-ref</code></li>
                    </ul>
                </p>
                <p>
                    Environment properties of the follwing types are passivated.
                    <ul>
                        <li><code>@ejb.env-entry</code></li>
                        <li><code>@ejb.ejb-ref</code></li>
                        <li><code>@ejb.ejb-env-ref</code></li>
                    </ul>
                </p>
            </subsection>
        </section>
    </body>
</document>

Index: navigation.xml
===================================================================
RCS file: /cvsroot/xdoclet/xdoclet/xdocs/navigation.xml,v
retrieving revision 1.47
retrieving revision 1.48
diff -C2 -r1.47 -r1.48
*** navigation.xml      8 Feb 2005 17:41:55 -0000       1.47
--- navigation.xml      12 Apr 2005 21:10:25 -0000      1.48
***************
*** 69,72 ****
--- 69,73 ----
          <menu name="Feature Documentation">
              <item name="Using Value Objects"        
href="/valueobjects.html"/>
+             <item name="EJB Environment Handling"   href="/envhandling.html"/>
          </menu>
          <menu name="Advanced">



-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
xdoclet-devel mailing list
xdoclet-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/xdoclet-devel

Reply via email to