FileDocCategorySizeDatePackage
BusinessMethodException.javaAPI DocGlassfish v2 API9205Fri May 04 22:33:32 BST 2007com.sun.enterprise.tools.verifier.tests.ejb.businessmethod

BusinessMethodException

public class BusinessMethodException extends com.sun.enterprise.tools.verifier.tests.ejb.EjbTest implements com.sun.enterprise.tools.verifier.tests.ejb.EjbCheck
Enterprise Bean's business(...) methods exceptions test. Each enterprise Bean class must define zero or more business(...) methods. The method signatures must follow these rules: 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.

Fields Summary
Result
result
ComponentNameConstructor
compName
Constructors Summary
Methods Summary
public Resultcheck(EjbDescriptor descriptor)
Enterprise Bean's business(...) methods exceptions test. Each enterprise Bean class must define zero or more business(...) methods. The method signatures must follow these rules: 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.

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.getRemoteClassName() != null && !"".equals(descriptor.getRemoteClassName())) 
                commonToBothInterfaces(descriptor.getRemoteClassName(),descriptor);
            
            if(descriptor.getLocalClassName() != null && !"".equals(descriptor.getLocalClassName())) 
                commonToBothInterfaces(descriptor.getLocalClassName(),descriptor);
            
            Set<String> localAndRemoteInterfaces = descriptor.getLocalBusinessClassNames();
            localAndRemoteInterfaces.addAll(descriptor.getRemoteBusinessClassNames());
            
            for (String localOrRemoteIntf : localAndRemoteInterfaces) 
                commonToBothInterfaces(localOrRemoteIntf, descriptor);
        }
        
        if(result.getStatus() != Result.FAILED && 
                result.getStatus() != Result.WARNING) {
            addGoodDetails(result, compName);
            result.passed(smh.getLocalString
                                    (getClass().getName() + ".passed",
                                    "Proper declaration of business method(s) found."));
        }
        return result;
    
private voidcommonToBothInterfaces(java.lang.String intf, EjbDescriptor descriptor)
This method is responsible for the logic of the test. It is called for both local and remote interfaces.

param
intf or component for the Remote/Local interface of the Ejb.
param
descriptor the Enterprise Java Bean deployment descriptor

        try {
            Class intfClass = Class.forName(intf, 
                                            false, 
                                            getVerifierContext().getClassLoader());
            
            for (Method remoteMethod : intfClass.getMethods()) {
                // we don't test the EJB methods
                if (remoteMethod.getDeclaringClass().getName().equals("javax.ejb.EJBObject")||
                        remoteMethod.getDeclaringClass().getName().equals("javax.ejb.EJBLocalObject")) 
                    continue;
                
                Class beanClass = Class.forName(descriptor.getEjbClassName(), 
                                                false, 
                                                getVerifierContext().getClassLoader());
                
                for (Method method: beanClass.getMethods()) {
                    if (method.getName().equals(remoteMethod.getName())) {
                        
                    // 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() + ".failed",
                                    "Error: Compatibility Note:" +
                                    "\n A public business method [ {0} ] was found, but" +
                                    "\n EJB 1.0 allowed the business 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[] {intf,descriptor.getEjbClassName(),descriptor.getName()}));
        }