FileDocCategorySizeDatePackage
HomeMethodException.javaAPI DocGlassfish v2 API9341Fri May 04 22:33:52 BST 2007com.sun.enterprise.tools.verifier.tests.ejb.homeintf

HomeMethodException

public class HomeMethodException extends com.sun.enterprise.tools.verifier.tests.ejb.EjbTest implements com.sun.enterprise.tools.verifier.tests.ejb.EjbCheck
Enterprise Bean's ejbHome methods exceptions test. Each enterprise Bean class may define zero or more business(...) methods. The method signatures must follow these rules: Compatibility Note: EJB 1.0 allowed the ejbHome methods to throw the java.rmi.RemoteException to indicate a non-application exception. This practice is deprecated in EJB 1.1---an EJB 1.1 compliant enterprise bean should throw the javax.ejb.EJBException or another RuntimeException to indicate non-application exceptions to the Container (see Section 12.2.2). Note: Treat as a warning to user in this instance.

Fields Summary
com.sun.enterprise.tools.verifier.Result
result
com.sun.enterprise.tools.verifier.tests.ComponentNameConstructor
compName
Constructors Summary
Methods Summary
public com.sun.enterprise.tools.verifier.Resultcheck(com.sun.enterprise.deployment.EjbDescriptor descriptor)
Enterprise Bean's ejbHome methods exceptions test. Each enterprise Bean class may define zero or more business(...) methods. The method signatures must follow these rules: Compatibility Note: EJB 1.0 allowed the ejbHome methods to throw the java.rmi.RemoteException to indicate a non-application exception. This practice is deprecated in EJB 1.1---an EJB 1.1 compliant enterprise bean should throw the javax.ejb.EJBException or another RuntimeException to indicate non-application exceptions to the Container (see Section 12.2.2). Note: Treat as a warning to user in this instance.

param
descriptor the Enterprise Java Bean deployment descriptor
return
Result the results for this assertion

    
                                                                                                                     
        
        
        result = getInitializedResult();
        compName = getVerifierContext().getComponentNameConstructor();
        
        if ((descriptor instanceof EjbSessionDescriptor)  ||
                (descriptor instanceof EjbEntityDescriptor)) {
            if(descriptor.getHomeClassName() != null && !"".equals(descriptor.getHomeClassName())) {
                commonToBothInterfaces(descriptor.getHomeClassName(),descriptor);
            }
            if(descriptor.getLocalHomeClassName() != null && !"".equals(descriptor.getLocalHomeClassName())) {
                commonToBothInterfaces(descriptor.getLocalHomeClassName(),descriptor);
            }
            
        }
        if(result.getStatus()!=Result.FAILED && 
                result.getStatus() != Result.WARNING) {
            addGoodDetails(result, compName);
            result.passed(smh.getLocalString
                            (getClass().getName() + ".passed",
                            "Valid Home method(s)."));
        }
        return result;
    
private voidcommonToBothInterfaces(java.lang.String home, com.sun.enterprise.deployment.EjbDescriptor descriptor)
This method is responsible for the logic of the test. It is called for both local and remote home interfaces.

param
home for the Home Interface of the Ejb
param
descriptor the Enterprise Java Bean deployment descriptor This parameter may be optional depending on the test

        try {
            ClassLoader jcl = getVerifierContext().getClassLoader();
            Class rc = Class.forName(home, false, jcl);
            
            for (Method homeMethod : rc.getMethods()) {
                
                if (homeMethod.getDeclaringClass().getName().equals("javax.ejb.EJBHome")||
                        homeMethod.getDeclaringClass().getName().equals("javax.ejb.EJBLocalHome")) 
                    continue;
                if (homeMethod.getName().startsWith("create") || 
                        homeMethod.getName().startsWith("find") || 
                        homeMethod.getName().startsWith("remove")) 
                    continue;
                
                Class beanClass = Class.forName(descriptor.getEjbClassName(), false, jcl);
                
                for (Method method : beanClass.getMethods()) {
                    
                    String methodName = "ejbHome" + 
                            Character.toUpperCase(homeMethod.getName().charAt(0)) + 
                            homeMethod.getName().substring(1);
                    
                    if (method.getName().equals(methodName)) {
                        
                        // Compatibility Note: EJB 1.0 allowed the business methods to throw
                        // the java.rmi.RemoteException to indicate a non-application 
                        // exception. This practice is deprecated in EJB 1.1---an EJB 1.1 
                        // compliant enterprise bean should throw the javax.ejb.EJBException
                        // or another RuntimeException to indicate non-application 
                        // exceptions to the Container (see Section 12.2.2). 
                        // Note: Treat as a warning to user in this instance 
                        Class [] exceptions = method.getExceptionTypes();
                        if(EjbUtils.isValidRemoteException(exceptions)) {
                            addWarningDetails(result, compName);
                            result.warning(smh.getLocalString
                                    (getClass().getName() + ".warning",
                                    "Error: Compatibility Note:" +
                                    "\n A public Home method [ {0} ] was found, but" +
                                    "\n EJB 1.0 allowed the 'ejbHome' methods to throw the " +
                                    "\n java.rmi.RemoteException to indicate a non-application" +
                                    "\n exception. This practice is deprecated in EJB 1.1" +
                                    "\n ---an EJB 1.1 compliant enterprise bean should" +
                                    "\n throw the javax.ejb.EJBException or another " +
                                    "\n RuntimeException to indicate non-application exceptions" +
                                    "\n to the Container. ",
                                    new Object[] {method.getName()}));
                        }
                        
                    }
                }
                
            }
            
        } catch (Exception e) {
            Verifier.debug(e);
            addErrorDetails(result, compName);
            result.failed(smh.getLocalString
                    (getClass().getName() + ".failedException",
                    "Error: Remote interface [ {0} ] or bean class [ {1} ] does " +
                    "not exist or is not loadable within bean [ {2} ].",
                    new Object[] {home,descriptor.getEjbClassName(),descriptor.getName()}));
        }