/**
   * Enterprise Bean's business(...) methods argument RMI IIOP test. Each enterprise Bean class must
   * define zero or more business(...) methods. The method signatures must follow these rules:
   *
   * <p>The methods return value must be legal types for RMI-IIOP.
   *
   * @param descriptor the Enterprise Java Bean deployment descriptor
   * @return <code>Result</code> the results for this assertion
   */
  public Result check(EjbDescriptor descriptor) {

    result = getInitializedResult();
    compName = getVerifierContext().getComponentNameConstructor();

    if ((descriptor instanceof EjbSessionDescriptor)
        || (descriptor instanceof EjbEntityDescriptor)) {
      if (descriptor.getRemoteClassName() != null && !"".equals(descriptor.getRemoteClassName()))
        commonToBothInterfaces(descriptor.getRemoteClassName(), descriptor);

      Set<String> remoteInterfaces = descriptor.getRemoteBusinessClassNames();
      for (String remoteIntf : remoteInterfaces) commonToBothInterfaces(remoteIntf, descriptor);
    }
    if (result.getStatus() != Result.FAILED) {
      addGoodDetails(result, compName);
      result.passed(
          smh.getLocalString(
              getClass().getName() + ".passed", "Proper declaration of business method(s) found."));
    }
    return result;
  }
  private void commonToBothInterfaces(String intf, EjbDescriptor 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")) continue;
        Class beanClass =
            Class.forName(
                descriptor.getEjbClassName(), false, getVerifierContext().getClassLoader());
        for (Method method : beanClass.getMethods()) {

          if (method.getName().equals(remoteMethod.getName())
              && !RmiIIOPUtils.isValidRmiIIOPReturnType(method.getReturnType())) {
            // The methods arguments types must be legal types for
            // RMI-IIOP.  This means that their return values must
            // be of valid types for RMI-IIOP,
            addErrorDetails(result, compName);
            result.failed(
                smh.getLocalString(
                    getClass().getName() + ".failed",
                    "Error: business method [ {0} ] was found, but "
                        + "business method has invalid return type [ {1} ]. Business "
                        + "method return type must be a valid type for RMI-IIOP.",
                    new Object[] {method.getName(), method.getReturnType()}));
          }
        }
      }

    } catch (ClassNotFoundException 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[] {
                descriptor.getRemoteClassName(), descriptor.getEjbClassName(), descriptor.getName()
              }));
    }
  }