User: juha    
  Date: 00/06/01 15:29:43

  Modified:    src/main/org/jboss/verifier/strategy EJBVerifier11.java
  Log:
  Added checks for:
  6.5.3 SessionSynchronization
    - stateless session must not implement
    - bean-managed tx cannot implement
  6.5.5 Required at least one ejbCreate(...) method
  
  Revision  Changes    Path
  1.2       +235 -22   jboss/src/main/org/jboss/verifier/strategy/EJBVerifier11.java
  
  Index: EJBVerifier11.java
  ===================================================================
  RCS file: 
/products/cvs/ejboss/jboss/src/main/org/jboss/verifier/strategy/EJBVerifier11.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- EJBVerifier11.java        2000/05/29 18:26:30     1.1
  +++ EJBVerifier11.java        2000/06/01 22:29:43     1.2
  @@ -18,11 +18,8 @@
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
    *
  - * This package and its source code is available at www.gjt.org
  - * $Id: EJBVerifier11.java,v 1.1 2000/05/29 18:26:30 juha Exp $
  - *
  - * You can reach the author by sending email to [EMAIL PROTECTED] or
  - * directly to [EMAIL PROTECTED]
  + * This package and its source code is available at www.jboss.org
  + * $Id: EJBVerifier11.java,v 1.2 2000/06/01 22:29:43 juha Exp $
    */
   
   
  @@ -30,6 +27,7 @@
   import java.util.Iterator;
   import java.net.URL;
   import java.net.URLClassLoader;
  +import java.lang.reflect.Method;
   
   
   // non-standard class dependencies
  @@ -52,8 +50,8 @@
    *
    * @see     << OTHER RELATED CLASSES >>
    *
  - * @author   Juha Lindfors
  - * @version $Revision: 1.1 $
  + * @author   Juha Lindfors ([EMAIL PROTECTED]
  + * @version $Revision: 1.2 $
    * @since    JDK 1.3
    */
   public class EJBVerifier11 implements VerificationStrategy {
  @@ -61,9 +59,8 @@
       private VerificationContext context      = null;
       private VerificationEventFactory factory = null;
       private ClassLoader classloader          = null;
  -        
  -        
  -        
  +            
  +    
       /*
        *  Constructor
        */
  @@ -86,17 +83,33 @@
       
       public void checkSession(Session session) {
   
  +        boolean sessionDescriptorVerified = true; //  false;
  +        
           boolean beanVerified   = false;
           boolean homeVerified   = false;
           boolean remoteVerified = false;
  -                
  -                
  -        beanVerified   = verifySessionBean(session.getEjbClass());   
  +        /*
  +         * [TODO] use state pattern instead, this collection of bools is going
  +         *        to grow, and managing them will become messy
  +         */
  +        
  +        //sessionDescriptorVerified = verifySessionDescriptor();
  +        
  +        /*
  +         * Also, the descriptors should most likely be checked in one place, 
  +         * instead of sprinkling their check code across the bean class
  +         * checkers..
  +         */
  +         
  +         
  +        beanVerified   = verifySessionBean(session);   
           homeVerified   = verifySessionHome(session.getHome());
           remoteVerified = verifySessionRemote(session.getRemote());
   
   
  -        if ( beanVerified && homeVerified && remoteVerified ) {
  +        if ( beanVerified && homeVerified && remoteVerified &&
  +             sessionDescriptorVerified) {
  +                 
               /*
                * Verification for this session bean done. Fire the event
                * to tell listeneres everything is ok.
  @@ -181,23 +194,90 @@
           return true;
       }
       
  -    private boolean verifySessionBean(String name) {
  +    private boolean verifySessionBean(Session session) {
   
  +        /*
  +         * Indicates whether we issued warnings or not during verification.
  +         * This boolean is returned to the caller.
  +         */
           boolean status = true;
           
  +        String  name   = session.getEjbClass();
  +        
  +        
           try {
  -            Class home = classloader.loadClass(name);
  +            Class bean = classloader.loadClass(name);
   
  -            if (!hasSessionBeanInterface(home)) {
  +            
  +            /*
  +             * A session bean MUST implement javax.ejb.SessionBean interface.
  +             *
  +             * Spec 6.5.1
  +             */
  +            if (!hasSessionBeanInterface(bean)) {
                   
  -                VerificationEvent event = 
  -                        factory.createSpecViolationEvent(context, SECTION_6_5_1, 
name);
  +                fireSpecViolationEvent(SECTION_6_5_1, name);
  +                                   
  +                status = false;
  +            }
  +            
  +
  +            /*
  +             * Only a stateful container-managed transaction demarcation
  +             * session bean MAY implement the SessionSynchronization interface.
  +             *
  +             * A stateless Session bean MUST NOT implement the 
  +             * SessionSynchronization interface.
  +             *
  +             * Spec 6.5.3
  +             */
  +            if (hasSessionSynchronizationInterface(bean))
  +                
  +                if (!isStateful(session)) {
  +                    fireSpecViolationEvent(SECTION_6_5_3_a, name);
  +                    
  +                    status = false;
  +                }
  +                
  +                if (!isContainerManagedTx(session)) {
  +                    fireSpecViolationEvent(SECTION_6_5_3_b, name);
  +                    
  +                    status = false;
  +                }
  +            
  +            
  +            /*
  +             * A session bean MUST implement AT LEAST one ejbCreate method.
  +             *
  +             * Spec 6.5.5
  +             */
  +            if (!hasEJBCreateMethod(bean)) {
                   
  -                context.fireBeanChecked(event);
  +                fireSpecViolationEvent(SECTION_6_5_5, name);
                   
                   status = false;
  +                
  +                /*
  +                 * [TODO] the ejbCreate signature in bean class must match the
  +                 *        create methods signature in home interface
  +                 */
               }
  +
               
  +            /*
  +             * A session with bean-managed transaction demarcation CANNOT
  +             * implement the SessionSynchronization interface.
  +             *
  +             * Spec 6.6.1 (table 2)
  +             */
  +            if (hasSessionSynchronizationInterface(bean) && 
isBeanManagedTx(session)) {
  +
  +                fireSpecViolationEvent(SECTION_6_6_1, name);
  +                
  +                status = false;
  +            }     
  +
  +                      
           }
           catch (ClassNotFoundException e) {
               
  @@ -212,6 +292,37 @@
           return status;
       }
       
  +
  +    
  +    /*
  +     * Searches for an instance of a ejbCreate method from the class
  +     */
  +    private boolean hasEJBCreateMethod(Class c) {
  +    
  +        try {
  +            // [NOTE] Making the implicit assumption that the ejbCreate method
  +            //        has to be public. Didn't find the section in the spec that
  +            //        explicitly stated this, yet.
  +            Method[] methods = c.getMethods();
  +         
  +            for (int i = 0; i < methods.length; ++i) {
  +            
  +                String name = methods[i].getName();
  +                
  +                if (name.equals(EJB_CREATE_METHOD))
  +                    return true;
  +            }
  +        }
  +        catch (SecurityException e) {
  +            System.err.println(e);
  +            // [TODO]   Can be thrown by the getMethods() call if access is
  +            //          denied --> createVerifierWarningEvent
  +        }
  +        
  +        return false;
  +    }
  +    
  +    
       
       /*
        * Finds java.ejb.SessionBean interface from the class
  @@ -229,18 +340,120 @@
           return false;
       }
   
  -
  +    
  +    
       /*
  -     * String constants
  +     * Finds javax.ejb.SessionSynchronization interface from the class
        */
  +    private boolean hasSessionSynchronizationInterface(Class c) {
  +        
  +        Class[] interfaces = c.getInterfaces();
  +        
  +        for (int i = 0; i < interfaces.length; ++i) {
  +            
  +            if ((SESSIONSYNCHRONIZATION_INTERFACE).equals(interfaces[i].getName()))
  +                return true;
  +        }
  +        
  +        return false;
  +    }
  +
  +    
  +    
  +    private boolean isStateful(Session session) {
  +
  +        if (STATEFUL_SESSION.equals(session.getSessionType()))
  +            return true;
  +            
  +        return false;
  +    }
  +
  +    
  +    
  +    private boolean isBeanManagedTx(Session session) {
  +
  +        if (BEAN_MANAGED_TX.equals(session.getTransactionType()))
  +            return true;
  +            
  +        return false;
  +    }
  +    
  +
  +    private boolean isContainerManagedTx(Session session) {
  +        
  +        if (CONTAINER_MANAGED_TX.equals(session.getTransactionType()))
  +            return true;
  +            
  +        return false;
  +    }
  +    
  +    
  +    
  +    private void fireSpecViolationEvent(String section, String name) {
  +
  +        VerificationEvent event = 
  +                factory.createSpecViolationEvent(context, section, name);
  +                
  +        context.fireBeanChecked(event);
  +    }
  +    
  +    
  +    
  +
  +    /* 
  +     ****************************************************************
  +     *
  +     *      String constants
  +     *
  +     ****************************************************************
  +     */
       private final static String SESSIONBEAN_INTERFACE =
           "javax.ejb.SessionBean";
  +        
  +    private final static String SESSIONSYNCHRONIZATION_INTERFACE =
  +        "javax.ejb.SessionSynchronization";
  +        
  +    private final static String EJB_CREATE_METHOD     =
  +        "ejbCreate";
   
  +        
  +        
  +    /*
  +     * Specification entries
  +     */
       public final static String SECTION_6_5_1         =
           "Section 6.5.1 Required Sessionbean interface";        
       
  +    public final static String SECTION_6_5_3_a       =
  +        "Section 6.5.3 The optional SessionSynchronization interface (stateful)";
  +        
  +    public final static String SECTION_6_5_3_b       =
  +        "Section 6.5.3 The optional SessionSynchronization interface (stateless)";
  +                
  +    public final static String SECTION_6_5_5         =
  +        "Section 6.5.5 Session bean's ejbCreate(...) methods";
  +        
  +    public final static String SECTION_6_6_1         =
  +        "Section 6.6.1 Operations allowed in the methods of a stateful session bean 
class";    
  +    
  +    
  +    /*
  +     * Ejb-jar DTD
  +     */
       public final static String DTD_EJB_CLASS         =
           "Deployment descriptor DTD: ejb-class";
  +
  +    public final static String BEAN_MANAGED_TX       = 
  +        "Bean";
  +    
  +    public final static String CONTAINER_MANAGED_TX  = 
  +        "Container";
  +
  +    public final static String STATEFUL_SESSION      =
  +        "Stateful";
  +
  +    public final static String STATELESS_SESSION     =
  +        "Stateless";
           
   }
   
  
  
  

Reply via email to