/**
   * All methods should have a
   *
   * @param descriptor the Enterprise Java Bean deployment descriptor
   * @return <code>Result</code> the results for this assertion
   */
  public Result check(EjbDescriptor descriptor) {

    result = getInitializedResult();
    //        boolean oneFailed = false;

    try {
      if (descriptor instanceof EjbSessionDescriptor || descriptor instanceof EjbEntityDescriptor) {

        Set methods = descriptor.getMethodDescriptors();
        //		 Set methodPermissions = new HashSet();
        boolean noPermissions = false;

        for (Iterator i = methods.iterator(); i.hasNext(); ) {
          MethodDescriptor md = (MethodDescriptor) i.next();
          Set permissions = descriptor.getMethodPermissionsFor(md);
          if (permissions.isEmpty() || (permissions == null)) {
            result.addWarningDetails(
                smh.getLocalString(
                    getClass().getName() + ".failed",
                    "Warning: Method [ {0} ] of EJB [ {1} ] does not have assigned security-permissions",
                    new Object[] {md.getName(), descriptor.getName()}));
            result.setStatus(result.WARNING);
            noPermissions = true;
          }
        }

        if (!noPermissions) {
          result.passed(
              smh.getLocalString(
                  getClass().getName() + ".passed",
                  "Valid: All [ {0} ]EJB  interfaces methods have security-permissions assigned.",
                  new Object[] {descriptor.getName()}));
        }

      } else {
        result.notApplicable(
            smh.getLocalString(
                getClass().getName() + ".notApplicable",
                "The bean [ {0} ] is neither a Session nor Entity Bean",
                new Object[] {descriptor.getName()}));
        return result;
      }
    } catch (Exception e) {
      result.failed(
          smh.getLocalString(
              getClass().getName() + ".exception",
              "The test generated the following exception [ {0} ]",
              new Object[] {e.getLocalizedMessage()}));
    }
    return result;
  }
Beispiel #2
0
  /**
   * The ejb element specifies the URI of a ejb-jar, relative to the top level of the application
   * package.
   *
   * @param descriptor the Application deployment descriptor
   * @return <code>Result</code> the results for this assertion
   */
  public Result check(Application descriptor) {

    Result result = getInitializedResult();

    if (descriptor.getBundleDescriptors(EjbBundleDescriptor.class).size() > 0) {
      boolean oneFailed = false;
      for (Iterator itr = descriptor.getBundleDescriptors(EjbBundleDescriptor.class).iterator();
          itr.hasNext(); ) {
        EjbBundleDescriptor ejbd = (EjbBundleDescriptor) itr.next();

        // not sure what we can do to test this string?
        if (ejbd.getModuleDescriptor().getArchiveUri().endsWith(".jar")) {
          result.passed(
              smh.getLocalString(
                  getClass().getName() + ".passed",
                  "[ {0} ] specifies the URI [ {1} ] of an ejb-jar, relative to the top level of the application package [ {2} ].",
                  new Object[] {
                    ejbd.getName(), ejbd.getModuleDescriptor().getArchiveUri(), descriptor.getName()
                  }));
        } else {
          if (!oneFailed) {
            oneFailed = true;
          }
          result.addErrorDetails(
              smh.getLocalString(
                  getClass().getName() + ".failed",
                  "Error: [ {0} ] does not specify the URI [ {1} ] of an ejb-jar, relative to the top level of the application package [ {2} ], or does not end with \".jar\"",
                  new Object[] {
                    ejbd.getName(), ejbd.getModuleDescriptor().getArchiveUri(), descriptor.getName()
                  }));
        }
      }
      if (oneFailed) {
        result.setStatus(Result.FAILED);
      } else {
        result.setStatus(Result.PASSED);
      }
    } else {
      result.notApplicable(
          smh.getLocalString(
              getClass().getName() + ".notApplicable",
              "There are no ejb components in application [ {0} ]",
              new Object[] {descriptor.getName()}));
    }

    return result;
  }
Beispiel #3
0
 public Result check(EjbDescriptor descriptor) {
   Result result = getInitializedResult();
   ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor();
   boolean oneFailed = false;
   try {
     Set resRef = descriptor.getResourceReferenceDescriptors();
     if (!(resRef.isEmpty())) {
       Iterator it = resRef.iterator();
       while (it.hasNext()) {
         ResourceReferenceDescriptor resDesc = ((ResourceReferenceDescriptor) it.next());
         String refName = resDesc.getName();
         if (refName == null || refName.length() == 0) {
           addErrorDetails(result, compName);
           result.failed(
               smh.getLocalString(
                   getClass().getName() + ".failed",
                   "FAILED [AS-EJB resource-ref] : resource-ref has empty res-ref-name"));
         } else {
           addGoodDetails(result, compName);
           result.passed(
               smh.getLocalString(
                   getClass().getName() + ".passed",
                   "PASSED [AS-EJB resource-ref] : res-ref-name is {0}",
                   new Object[] {refName}));
         }
       }
     } else {
       addNaDetails(result, compName);
       result.notApplicable(
           smh.getLocalString(
               getClass().getName() + ".notApplicable",
               "{0} Does not define any resource-ref Elements",
               new Object[] {descriptor.getName()}));
     }
   } catch (Exception ex) {
     addErrorDetails(result, compName);
     result.addErrorDetails(
         smh.getLocalString(
             getClass().getName() + ".notRun",
             "NOT RUN [AS-EJB] : Could not create the descriptor object"));
   }
   return result;
 }
Beispiel #4
0
  public Result check(WebBundleDescriptor descriptor) {

    Result result = getInitializedResult();

    ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor();

    boolean oneFailed = false;
    boolean notApp = false;

    try {
      WebProperty[] webProps = ((SunWebAppImpl) descriptor.getSunDescriptor()).getWebProperty();
      if (webProps.length > 0) {
        oneFailed = checkWebProperties(webProps, result, descriptor, this);
      } else {
        notApp = true;
        addNaDetails(result, compName);
        result.notApplicable(
            smh.getLocalString(
                getClass().getName() + ".notApplicable",
                "NOT APPLICABLE [AS-WEB sun-web-app] web property element not defined within the web archive [ {0} ].",
                new Object[] {descriptor.getName()}));
      }
      if (oneFailed) {
        result.setStatus(Result.FAILED);
      } else if (notApp) {
        result.setStatus(Result.NOT_APPLICABLE);
      } else {
        result.setStatus(Result.PASSED);
      }

    } catch (Exception ex) {
      oneFailed = true;
      addErrorDetails(result, compName);
      result.failed(
          smh.getLocalString(
              getClass().getName() + ".failed",
              "FAILED [AS-WEB sun-web-app] could not create the web-property object"));
    }

    return result;
  }
  /**
   * Test if a javax.resource.cci.ConnectionMetaData implementation has been provided in the rar
   * file
   *
   * @paramm descriptor deployment descriptor for the rar file
   * @return result object containing the result of the individual test performed
   */
  public Result check(ConnectorDescriptor descriptor) {

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

    if (isCCIImplemented(descriptor, result)) {
      // File jarFile = Verifier.getJarFile(descriptor.getModuleDescriptor().getArchiveUri());
      //            File
      // f=Verifier.getArchiveFile(descriptor.getModuleDescriptor().getArchiveUri());
      findImplementorOf(descriptor, "javax.resource.cci.ConnectionMetaData", result);
    } else {
      result.addNaDetails(
          smh.getLocalString(
              "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()}));
      result.notApplicable(
          smh.getLocalString(
              "com.sun.enterprise.tools.verifier.tests.connector.cci.InteractionExistence.notapp",
              "NotApplicable : The CCI interfaces do not seem to be implemented by this resource adapter"));
    }
    return result;
  }
Beispiel #6
0
  /**
   * The Web form-error-page value defines the location in the web application where the page can be
   * used for error page can be found within web application test
   *
   * @param descriptor the Web deployment descriptor
   * @return <code>Result</code> the results for this assertion
   */
  public Result check(WebBundleDescriptor descriptor) {

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

    if (descriptor.getLoginConfiguration() != null) {
      boolean foundIt = false;
      //            ZipEntry ze=null;
      //            JarFile jar=null;
      FileArchive arch = null;

      String formErrorPage = descriptor.getLoginConfiguration().getFormErrorPage();
      if (formErrorPage.length() > 0) {

        try {

          //                    File f =
          // Verifier.getArchiveFile(descriptor.getModuleDescriptor().getArchiveUri());
          //                    if(f==null){

          String uri = getAbstractArchiveUri(descriptor);

          try {
            arch = new FileArchive();
            arch.open(uri);
          } catch (IOException e) {
            throw e;
          }
          //                    }else{
          //                        jar = new JarFile(f);
          //                    }
          if (formErrorPage.startsWith("/")) formErrorPage = formErrorPage.substring(1);
          //                    if (f!=null){
          //                        ze = jar.getEntry(formErrorPage);
          //                        foundIt = (ze != null);
          //                    }
          //                    else{
          File fep = new File(new File(arch.getURI()), formErrorPage);
          if (fep.exists()) foundIt = true;
          fep = null;
          //                    }
          //                    if (jar!=null)
          //                        jar.close();
        } catch (Exception ex) {
          // should be aldready set?
          foundIt = false;
        }
        if (foundIt) {
          result.addGoodDetails(
              smh.getLocalString(
                  "tests.componentNameConstructor",
                  "For [ {0} ]",
                  new Object[] {compName.toString()}));
          result.passed(
              smh.getLocalString(
                  getClass().getName() + ".passed",
                  "The form-error-page [ {0} ] value defines the location in the web application where the error page that is displayed when login is not successful can be found within web application [ {1} ]",
                  new Object[] {formErrorPage, descriptor.getName()}));
        } else {
          result.addErrorDetails(
              smh.getLocalString(
                  "tests.componentNameConstructor",
                  "For [ {0} ]",
                  new Object[] {compName.toString()}));
          result.failed(
              smh.getLocalString(
                  getClass().getName() + ".failed",
                  "Error: The form-error-page [ {0} ] value does not define the location in the web application where the error page that is displayed when login is not successful can be found within web application [ {1} ]",
                  new Object[] {formErrorPage, descriptor.getName()}));
        }
      } else {
        result.addNaDetails(
            smh.getLocalString(
                "tests.componentNameConstructor",
                "For [ {0} ]",
                new Object[] {compName.toString()}));
        result.notApplicable(
            smh.getLocalString(
                getClass().getName() + ".notApplicable",
                "There are no form-error-page elements within this web archive [ {0} ]",
                new Object[] {descriptor.getName()}));
      }
    } else {
      result.addNaDetails(
          smh.getLocalString(
              "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()}));
      result.notApplicable(
          smh.getLocalString(
              getClass().getName() + ".notApplicable",
              "There are no form-error-page elements within this web archive [ {0} ]",
              new Object[] {descriptor.getName()}));
    }

    return result;
  }
  /**
   * Entity bean's Primary Key Class test. If the enterprise bean is a Entity Bean, the Bean
   * provider specifies the fully qualified name of the Entity bean's primary key class in the
   * "primary-class" element. The Bean provider 'must' specify the primary key class for an Entity
   * with bean managed persistence, and 'may' (but is not required to) specify the primary key class
   * for an Entity with Container-managed persistence.
   *
   * @param descriptor the Enterprise Java Bean deployment descriptor
   * @return <code>Result</code> the results for this assertion
   */
  public Result check(EjbDescriptor descriptor) {

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

    if (descriptor instanceof EjbEntityDescriptor) {
      String persistence = ((EjbEntityDescriptor) descriptor).getPersistenceType();
      if (EjbEntityDescriptor.BEAN_PERSISTENCE.equals(persistence)) {
        logger.log(
            Level.FINE,
            getClass().getName() + ".debug1",
            new Object[] {descriptor.getName(), "bean"});
        String primkey = ((EjbEntityDescriptor) descriptor).getPrimaryKeyClassName();

        if (!primkey.equals("java.lang.String")) {
          try {
            Class c = Class.forName(primkey, false, getVerifierContext().getClassLoader());

            result.addGoodDetails(
                smh.getLocalString(
                    "tests.componentNameConstructor",
                    "For [ {0} ]",
                    new Object[] {compName.toString()}));
            result.passed(
                smh.getLocalString(
                    getClass().getName() + ".passed",
                    "Primary Key Class [ {0} ] exist and is loadable",
                    new Object[] {primkey}));
          } catch (Exception e) {
            Verifier.debug(e);
            result.addErrorDetails(
                smh.getLocalString(
                    "tests.componentNameConstructor",
                    "For [ {0} ]",
                    new Object[] {compName.toString()}));
            result.failed(
                smh.getLocalString(
                    getClass().getName() + ".failedException",
                    "Error: Loading Primary Key Class [ {0} ]",
                    new Object[] {primkey}));
            return result;
          }
        } else {
          result.addGoodDetails(
              smh.getLocalString(
                  "tests.componentNameConstructor",
                  "For [ {0} ]",
                  new Object[] {compName.toString()}));

          result.passed(
              smh.getLocalString(
                  getClass().getName() + ".passed1",
                  "Primary Key Class is [ {0} ]",
                  new Object[] {primkey}));
        }

        return result;

      } else if (EjbEntityDescriptor.CONTAINER_PERSISTENCE.equals(persistence)) {
        result.addNaDetails(
            smh.getLocalString(
                "tests.componentNameConstructor",
                "For [ {0} ]",
                new Object[] {compName.toString()}));
        result.notApplicable(
            smh.getLocalString(
                getClass().getName() + ".notApplicable1",
                "Entity Bean [ {0} ] with [ {1} ] managed persistence, primkey optional.",
                new Object[] {descriptor.getName(), persistence}));
        return result;
      } else {
        result.addNaDetails(
            smh.getLocalString(
                "tests.componentNameConstructor",
                "For [ {0} ]",
                new Object[] {compName.toString()}));
        result.notApplicable(
            smh.getLocalString(
                getClass().getName() + ".notApplicable2",
                "Expected [ {0} ] managed persistence, but [ {1} ] bean has [ {2} ] managed persistence.",
                new Object[] {
                  EjbEntityDescriptor.BEAN_PERSISTENCE, descriptor.getName(), persistence
                }));
        return result;
      }
    } else {
      result.addNaDetails(
          smh.getLocalString(
              "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()}));
      result.notApplicable(
          smh.getLocalString(
              getClass().getName() + ".notApplicable",
              "[ {0} ] expected {1} bean, but called with {2} bean.",
              new Object[] {getClass(), "Entity", "Session"}));
      return result;
    }
  }
  /**
   * Entity Bean's ejbCreate(...) methods return test. Each entity Bean class may define zero or
   * more ejbCreate(...) methods. The number and signatures of a entity Bean's create methods are
   * specific to each EJB class. The method signatures must follow these rules:
   *
   * <p>The method name must be ejbCreate.
   *
   * <p>The return type must be primary key type.
   *
   * @param descriptor the Enterprise Java Bean deployment descriptor
   * @return <code>Result</code> the results for this assertion
   */
  public Result check(EjbDescriptor descriptor) {

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

    if (descriptor instanceof EjbEntityDescriptor) {
      String persistence = ((EjbEntityDescriptor) descriptor).getPersistenceType();
      if (EjbEntityDescriptor.BEAN_PERSISTENCE.equals(persistence)) {
        boolean oneFailed = false;
        boolean oneWarning = false;
        int foundAtLeastOne = 0;
        try {
          Context context = getVerifierContext();
          ClassLoader jcl = context.getClassLoader();
          Class c =
              Class.forName(
                  descriptor.getEjbClassName(), false, getVerifierContext().getClassLoader());

          String primaryKeyType = ((EjbEntityDescriptor) descriptor).getPrimaryKeyClassName();
          boolean ejbCreateFound = false;
          boolean returnsPrimaryKeyType = false;
          // start do while loop here....
          do {
            Method[] methods = c.getDeclaredMethods();
            for (int i = 0; i < methods.length; i++) {
              // reset flags from last time thru loop
              ejbCreateFound = false;
              returnsPrimaryKeyType = false;
              // The method name must be ejbCreate.
              if (methods[i].getName().startsWith("ejbCreate")) {
                foundAtLeastOne++;
                ejbCreateFound = true;

                // The return type must be primary key type.
                Class rt = methods[i].getReturnType();
                if (rt.getName().equals(primaryKeyType)) {
                  returnsPrimaryKeyType = true;
                }

                // now display the appropriate results for this particular ejbCreate
                // method
                if (ejbCreateFound && !returnsPrimaryKeyType) {
                  if (primaryKeyType.equals("java.lang.Object")) {
                    oneWarning = true;
                    result.addWarningDetails(
                        smh.getLocalString(
                            "tests.componentNameConstructor",
                            "For [ {0} ]",
                            new Object[] {compName.toString()}));
                    result.addWarningDetails(
                        smh.getLocalString(
                            getClass().getName() + ".debug1",
                            "For EJB Class [ {0} ] method [ {1} ]",
                            new Object[] {descriptor.getEjbClassName(), methods[i].getName()}));
                    result.addWarningDetails(
                        smh.getLocalString(
                            getClass().getName() + ".warning",
                            "Warning: An [ {0} ] method was found, but [ {1} ] method has [ {2} ] return type.   Deployment descriptor primary key type [ {3} ]. Definition of the primary key type is deferred to deployment time ?",
                            new Object[] {
                              methods[i].getName(),
                              methods[i].getName(),
                              methods[i].getReturnType().getName(),
                              primaryKeyType
                            }));
                  } else {
                    oneFailed = true;
                    result.addErrorDetails(
                        smh.getLocalString(
                            "tests.componentNameConstructor",
                            "For [ {0} ]",
                            new Object[] {compName.toString()}));
                    result.addErrorDetails(
                        smh.getLocalString(
                            getClass().getName() + ".debug1",
                            "For EJB Class [ {0} ] method [ {1} ]",
                            new Object[] {descriptor.getEjbClassName(), methods[i].getName()}));
                    result.addErrorDetails(
                        smh.getLocalString(
                            getClass().getName() + ".failed",
                            "Error: An [ {0} ] method was found, but [ {1} ] method has illegal return value.   [ {2} ] methods must return primary key type [ {3} ].",
                            new Object[] {
                              methods[i].getName(),
                              methods[i].getName(),
                              methods[i].getName(),
                              primaryKeyType
                            }));
                    break;
                  }
                }
              }
            }
            if (oneFailed == true) break;
          } while (((c = c.getSuperclass()) != null) && (foundAtLeastOne == 0));

          if (foundAtLeastOne == 0) {
            result.addNaDetails(
                smh.getLocalString(
                    "tests.componentNameConstructor",
                    "For [ {0} ]",
                    new Object[] {compName.toString()}));
            result.notApplicable(
                smh.getLocalString(
                    getClass().getName() + ".notApplicable0",
                    "[ {0} ] does not declare any ejbCreate(...) methods.",
                    new Object[] {descriptor.getEjbClassName()}));
          }
          if (oneFailed == false && foundAtLeastOne > 0) {
            result.addGoodDetails(
                smh.getLocalString(
                    "tests.componentNameConstructor",
                    "For [ {0} ]",
                    new Object[] {compName.toString()}));
            result.addGoodDetails(
                smh.getLocalString(
                    getClass().getName() + ".debug1",
                    "For EJB Class [ {0} ]",
                    new Object[] {descriptor.getEjbClassName()}));
            result.addGoodDetails(
                smh.getLocalString(
                    getClass().getName() + ".passed",
                    "[ {0} ] properly declares ejbCreate<method> method to return primary key type [ {1} ].",
                    new Object[] {descriptor.getEjbClassName(), primaryKeyType}));
          }
        } catch (ClassNotFoundException e) {
          Verifier.debug(e);
          result.addErrorDetails(
              smh.getLocalString(
                  "tests.componentNameConstructor",
                  "For [ {0} ]",
                  new Object[] {compName.toString()}));
          result.failed(
              smh.getLocalString(
                  getClass().getName() + ".failedException",
                  "Error: [ {0} ] class not found.",
                  new Object[] {descriptor.getEjbClassName()}));
          oneFailed = true;
        }

        if (oneFailed) {
          result.setStatus(result.FAILED);
        } else if (foundAtLeastOne == 0) {
          result.setStatus(result.NOT_APPLICABLE);
        } else {
          if (oneWarning) {
            result.setStatus(result.WARNING);
          } else {

            result.setStatus(result.PASSED);
          }
        }

        return result;

      } else { // if (CONTAINER_PERSISTENCE.equals(persistence)) {
        result.addNaDetails(
            smh.getLocalString(
                "tests.componentNameConstructor",
                "For [ {0} ]",
                new Object[] {compName.toString()}));
        result.notApplicable(
            smh.getLocalString(
                getClass().getName() + ".notApplicable1",
                "Expected [ {0} ] managed persistence, but [ {1} ] bean has [ {2} ] managed persistence.",
                new Object[] {
                  EjbEntityDescriptor.BEAN_PERSISTENCE, descriptor.getName(), persistence
                }));
        return result;
      }

    } else {
      result.addNaDetails(
          smh.getLocalString(
              "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()}));
      result.notApplicable(
          smh.getLocalString(
              getClass().getName() + ".notApplicable",
              "[ {0} ] expected {1} bean, but called with {2} bean.",
              new Object[] {getClass(), "Entity", "Session"}));
      return result;
    }
  }
  /**
   * Entity Bean's ejbPostCreate(...) methods test. Each entity Bean class may define zero or more
   * ejbPostCreate(...) methods. The number and signatures of a entity Bean's create methods are
   * specific to each EJB class. The method signatures must follow these rules:
   *
   * <p>The method name must be ejbPostCreate.
   *
   * <p>The method must not be declared as static.
   *
   * @param descriptor the Enterprise Java Bean deployment descriptor
   * @return <code>Result</code> the results for this assertion
   */
  public Result check(EjbDescriptor descriptor) {

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

    if (descriptor instanceof EjbEntityDescriptor) {
      boolean oneFailed = false;
      int foundAtLeastOne = 0;
      try {
        Context context = getVerifierContext();
        ClassLoader jcl = context.getClassLoader();
        Class c =
            Class.forName(
                descriptor.getEjbClassName(), false, getVerifierContext().getClassLoader());

        boolean ejbPostCreateFound = false;
        boolean isStatic = false;
        // start do while loop here....
        do {
          Method[] methods = c.getDeclaredMethods();
          for (int i = 0; i < methods.length; i++) {
            // reset flags from last time thru loop
            ejbPostCreateFound = false;
            isStatic = false;

            // The method name must be ejbPostCreate.
            if (methods[i].getName().startsWith("ejbPostCreate")) {
              foundAtLeastOne++;
              ejbPostCreateFound = true;

              // The method must not be declared as final or static.
              int modifiers = methods[i].getModifiers();
              if (Modifier.isStatic(modifiers)) {
                isStatic = true;
              }

              // now display the appropriate results for this particular
              // ejbPostCreate method
              if (ejbPostCreateFound && (!isStatic)) {
                result.addGoodDetails(
                    smh.getLocalString(
                        "tests.componentNameConstructor",
                        "For [ {0} ]",
                        new Object[] {compName.toString()}));
                result.addGoodDetails(
                    smh.getLocalString(
                        getClass().getName() + ".debug1",
                        "For EJB Class [ {0} ] method [ {1} ]",
                        new Object[] {descriptor.getEjbClassName(), methods[i].getName()}));
                result.addGoodDetails(
                    smh.getLocalString(
                        getClass().getName() + ".passed",
                        "[ {0} ] properly declares non-static [ {1} ] method.",
                        new Object[] {descriptor.getEjbClassName(), methods[i].getName()}));
              } else if (ejbPostCreateFound && isStatic) {
                oneFailed = true;
                result.addErrorDetails(
                    smh.getLocalString(
                        "tests.componentNameConstructor",
                        "For [ {0} ]",
                        new Object[] {compName.toString()}));
                result.addErrorDetails(
                    smh.getLocalString(
                        getClass().getName() + ".debug1",
                        "For EJB Class [ {0} ] ejbPostCreate(...) Method [ {1} ]",
                        new Object[] {descriptor.getEjbClassName(), methods[i].getName()}));
                result.addErrorDetails(
                    smh.getLocalString(
                        getClass().getName() + ".failed",
                        "Error: A static [ {0} ]  method was found, but [ {1} ] cannot be declared as static.",
                        new Object[] {methods[i].getName(), methods[i].getName()}));
              }
            }
          }
        } while (((c = c.getSuperclass()) != null) && (foundAtLeastOne == 0));

        if (foundAtLeastOne == 0) {
          result.addNaDetails(
              smh.getLocalString(
                  "tests.componentNameConstructor",
                  "For [ {0} ]",
                  new Object[] {compName.toString()}));
          result.notApplicable(
              smh.getLocalString(
                  getClass().getName() + ".notApplicable1",
                  "[ {0} ] does not declare any ejbPostCreate(...) methods.",
                  new Object[] {descriptor.getEjbClassName()}));
        }
      } catch (ClassNotFoundException e) {
        Verifier.debug(e);
        result.addErrorDetails(
            smh.getLocalString(
                "tests.componentNameConstructor",
                "For [ {0} ]",
                new Object[] {compName.toString()}));
        result.failed(
            smh.getLocalString(
                getClass().getName() + ".failedException",
                "Error: [ {0} ] class not found.",
                new Object[] {descriptor.getEjbClassName()}));
        oneFailed = true;
      }

      if (oneFailed) {
        result.setStatus(result.FAILED);
      } else if (foundAtLeastOne == 0) {
        result.setStatus(result.NOT_APPLICABLE);
      } else {
        result.setStatus(result.PASSED);
      }

      return result;

    } else {
      result.addNaDetails(
          smh.getLocalString(
              "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()}));
      result.notApplicable(
          smh.getLocalString(
              getClass().getName() + ".notApplicable",
              "[ {0} ] expected {1} bean, but called with {2} bean.",
              new Object[] {getClass(), "Entity", "Session"}));
      return result;
    }
  }
  /**
   * Entity bean's Primary Key Class type test. If the enterprise bean is a Entity Bean, the Bean
   * provider specifies the fully qualified name of the Entity bean's primary key class in the
   * "primary-class" element. The Bean provider 'must' specify the primary key class for an Entity
   * with bean managed persistence, and 'may' (but is not required to) specify the primary key class
   * for an Entity with Container-managed persistence.
   *
   * <p>Special case: Unknown primary key class In special situations, the Bean Provider may choose
   * not to specify the primary key class for an entity bean with container-managed persistence.
   * This case happens if the Bean Provider wants to allow the Deployer to select the primary key
   * fields at deployment time. The Deployer uses instructions supplied by the Bean Provider (these
   * instructions are beyond the scope of the EJB spec.) to define a suitable primary key class.
   *
   * <p>In this special case, the type of the argument of the findByPrimaryKey method must be
   * declared as java.lang.Object, and the return value of ejbCreate() must be declared as
   * java.lang.Object. The Bean Provider must specify the primary key class in the deployment
   * descriptor as of the type java.lang.Object.
   *
   * <p>The primary key class is specified at deployment time when the Bean Provider develops
   * enterprise beans that is intended to be used with multiple back-ends that provide persistence,
   * and when these multiple back-ends require different primary key structures.
   *
   * @param descriptor the Enterprise Java Bean deployment descriptor
   * @return <code>Result</code> the results for this assertion
   */
  public Result check(EjbDescriptor descriptor) {

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

    if (descriptor instanceof EjbEntityDescriptor) {
      String persistence = ((EjbEntityDescriptor) descriptor).getPersistenceType();
      if (EjbEntityDescriptor.CONTAINER_PERSISTENCE.equals(persistence)) {
        String primkey = ((EjbEntityDescriptor) descriptor).getPrimaryKeyClassName();

        // primkey can be not set, via setting xml element
        // <prim-key-class> to "java.lang.Object"
        if (primkey.equals("java.lang.Object")) {
          result.addGoodDetails(
              smh.getLocalString(
                  "tests.componentNameConstructor",
                  "For [ {0} ]",
                  new Object[] {compName.toString()}));
          result.passed(
              smh.getLocalString(
                  getClass().getName() + ".passed",
                  "Properly defined primary key class type [ {0} ]",
                  new Object[] {"java.lang.Object"}));
        } else {
          result.addNaDetails(
              smh.getLocalString(
                  "tests.componentNameConstructor",
                  "For [ {0} ]",
                  new Object[] {compName.toString()}));
          result.notApplicable(
              smh.getLocalString(
                  getClass().getName() + ".notApplicable1",
                  "Primary Key Class is [ {0} ]",
                  new Object[] {primkey}));
        }

        return result;

      } else if (EjbEntityDescriptor.BEAN_PERSISTENCE.equals(persistence)) {
        result.addNaDetails(
            smh.getLocalString(
                "tests.componentNameConstructor",
                "For [ {0} ]",
                new Object[] {compName.toString()}));
        result.notApplicable(
            smh.getLocalString(
                getClass().getName() + ".notApplicable2",
                "Entity Bean with [ {0} ] managed persistence, primkey mandatory.",
                new Object[] {persistence}));
        return result;
      } else {
        result.addNaDetails(
            smh.getLocalString(
                "tests.componentNameConstructor",
                "For [ {0} ]",
                new Object[] {compName.toString()}));
        result.notApplicable(
            smh.getLocalString(
                getClass().getName() + ".notApplicable3",
                "Expected [ {0} ] managed persistence, but [ {1} ] bean has [ {2} ] managed persistence.",
                new Object[] {
                  EjbEntityDescriptor.CONTAINER_PERSISTENCE, descriptor.getName(), persistence
                }));
        return result;
      }
    } else {
      result.addNaDetails(
          smh.getLocalString(
              "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()}));
      result.notApplicable(
          smh.getLocalString(
              getClass().getName() + ".notApplicable",
              "[ {0} ] expected {1} bean, but called with {2} bean.",
              new Object[] {getClass(), "Entity", "Session"}));
      return result;
    }
  }
  /**
   * The alt-dd element specifies a URI to the post-assembly deployment descriptor relative to the
   * root of the application
   *
   * @param descriptor the Application deployment descriptor
   * @return <code>Result</code> the results for this assertion
   */
  public Result check(Application descriptor) {

    Result result = getInitializedResult();
    if (descriptor.getEjbBundleDescriptors().size() > 0) {
      boolean oneFailed = false;
      int na = 0;
      for (Iterator itr = descriptor.getEjbBundleDescriptors().iterator(); itr.hasNext(); ) {
        EjbBundleDescriptor ejbd = (EjbBundleDescriptor) itr.next();

        if (ejbd.getModuleDescriptor().getAlternateDescriptor() != null) {
          if (!(ejbd.getModuleDescriptor().getAlternateDescriptor().equals(""))) {
            JarFile jarFile = null;
            InputStream deploymentEntry = null;
            //                        File f = null;
            //                        if (Verifier.getEarFile() != null)
            //                            f = new File(Verifier.getEarFile());

            try {
              //                            if (f==null){
              String uri = getAbstractArchiveUri(descriptor);
              //                                try {
              FileArchive arch = new FileArchive();
              arch.open(uri);
              deploymentEntry = arch.getEntry(ejbd.getModuleDescriptor().getAlternateDescriptor());
              //                                }catch (Exception e) { }
              //                            }else{
              //
              //                                jarFile = new JarFile(f);
              //                                ZipEntry deploymentEntry1 =
              // jarFile.getEntry(ejbd.getModuleDescriptor().getAlternateDescriptor());
              //                                if (deploymentEntry1 != null){
              //                                    deploymentEntry =
              // jarFile.getInputStream(deploymentEntry1);
              //                                }
              //                            }

              if (deploymentEntry != null) {
                result.addGoodDetails(
                    smh.getLocalString(
                        getClass().getName() + ".passed",
                        "Found alternate EJB deployment descriptor URI file [ {0} ] within [ {1} ]",
                        new Object[] {
                          ejbd.getModuleDescriptor().getAlternateDescriptor(), ejbd.getName()
                        }));
              } else {
                if (!oneFailed) {
                  oneFailed = true;
                }
                result.addErrorDetails(
                    smh.getLocalString(
                        getClass().getName() + ".failed",
                        "Error: No alternate EJB deployment descriptor URI file found, looking for [ {0} ] within [ {1} ]",
                        new Object[] {
                          ejbd.getModuleDescriptor().getAlternateDescriptor(), ejbd.getName()
                        }));
              }
              // jarFile.close();

            } catch (FileNotFoundException ex) {
              Verifier.debug(ex);
              if (!oneFailed) {
                oneFailed = true;
              }

              result.failed(
                  smh.getLocalString(
                      getClass().getName() + ".failedException",
                      "Error: File not found trying to read deployment descriptor file [ {0} ] within [ {1} ]",
                      new Object[] {
                        ejbd.getModuleDescriptor().getAlternateDescriptor(), ejbd.getName()
                      }));
            } catch (IOException ex) {
              Verifier.debug(ex);
              if (!oneFailed) {
                oneFailed = true;
              }

              result.failed(
                  smh.getLocalString(
                      getClass().getName() + ".failedException1",
                      "Error: IO Error trying to read deployment descriptor file [ {0} ] within [ {1} ]",
                      new Object[] {
                        ejbd.getModuleDescriptor().getAlternateDescriptor(), ejbd.getName()
                      }));
            } finally {
              try {
                if (deploymentEntry != null) deploymentEntry.close();
              } catch (Exception x) {
              }
            }
          }
        } else {
          na++;
          result.notApplicable(
              smh.getLocalString(
                  getClass().getName() + ".notApplicable1",
                  "There is no java EJB alternative deployment descriptor in [ {0} ]",
                  new Object[] {ejbd.getName()}));
        }
      }
      if (oneFailed) {
        result.setStatus(Result.FAILED);
      } else if (na == descriptor.getEjbBundleDescriptors().size()) {
        result.setStatus(Result.NOT_APPLICABLE);
      } else {
        result.setStatus(Result.PASSED);
      }
    } else {
      result.notApplicable(
          smh.getLocalString(
              getClass().getName() + ".notApplicable",
              "There are no EJB components in application [ {0} ]",
              new Object[] {descriptor.getName()}));
    }

    return result;
  }
  /**
   * Define ejbFindByPrimaryKey method arguments test.
   *
   * <p>Every entity enterprise Bean class must define the ejbFindByPrimaryKey method.
   *
   * <p>The methods arguments types 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 result = getInitializedResult();
    ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor();

    if (descriptor instanceof EjbEntityDescriptor) {
      String persistentType = ((EjbEntityDescriptor) descriptor).getPersistenceType();
      if (EjbEntityDescriptor.BEAN_PERSISTENCE.equals(persistentType)) {
        Class[] ejbFinderMethodParameterTypes;
        boolean ejbFindByPrimaryKeyMethodFound = false;
        boolean oneFailed = false;
        boolean isLegalRMIIIOP = false;
        try {
          // retrieve the EJB Class Methods
          Context context = getVerifierContext();
          ClassLoader jcl = context.getClassLoader();
          Class EJBClass =
              Class.forName(
                  descriptor.getEjbClassName(), false, getVerifierContext().getClassLoader());
          // start do while loop here....
          do {
            Method[] ejbFinderMethods = EJBClass.getDeclaredMethods();

            for (int j = 0; j < ejbFinderMethods.length; ++j) {
              if (ejbFinderMethods[j].getName().equals("ejbFindByPrimaryKey")) {
                // Every entity enterprise Bean class must define the
                // ejbFindByPrimaryKey method.
                ejbFindByPrimaryKeyMethodFound = true;

                // The methods arguments types must be legal types for RMI-IIOP.
                ejbFinderMethodParameterTypes = ejbFinderMethods[j].getParameterTypes();
                if (RmiIIOPUtils.isValidRmiIIOPParameters(ejbFinderMethodParameterTypes)) {
                  // these method parameters are valid, continue
                  isLegalRMIIIOP = true;
                }

                if (ejbFindByPrimaryKeyMethodFound && isLegalRMIIIOP) {
                  result.addGoodDetails(
                      smh.getLocalString(
                          "tests.componentNameConstructor",
                          "For [ {0} ]",
                          new Object[] {compName.toString()}));
                  result.addGoodDetails(
                      smh.getLocalString(
                          getClass().getName() + ".debug1",
                          "For EJB Class [ {0} ] Finder Method [ {1} ]",
                          new Object[] {EJBClass.getName(), ejbFinderMethods[j].getName()}));
                  result.addGoodDetails(
                      smh.getLocalString(
                          getClass().getName() + ".passed",
                          "An [ {0} ] method with valid RMI-IIOP argument types was found.",
                          new Object[] {ejbFinderMethods[j].getName()}));
                } else if (ejbFindByPrimaryKeyMethodFound && (!isLegalRMIIIOP)) {
                  oneFailed = true;
                  result.addErrorDetails(
                      smh.getLocalString(
                          "tests.componentNameConstructor",
                          "For [ {0} ]",
                          new Object[] {compName.toString()}));
                  result.addErrorDetails(
                      smh.getLocalString(
                          getClass().getName() + ".debug1",
                          "For EJB Class [ {0} ] Finder Method [ {1} ]",
                          new Object[] {EJBClass.getName(), ejbFinderMethods[j].getName()}));
                  result.addErrorDetails(
                      smh.getLocalString(
                          getClass().getName() + ".failed",
                          "Error: An [ {0} ] method was found, but [ {1} ] method has illegal parameter values. [ {2} ] methods arguments types must be legal types for RMI-IIOP.",
                          new Object[] {
                            ejbFinderMethods[j].getName(),
                            ejbFinderMethods[j].getName(),
                            ejbFinderMethods[j].getName()
                          }));
                }
                // found one, and there should only be one, break out
                break;
              }
            }
          } while (((EJBClass = EJBClass.getSuperclass()) != null)
              && (!ejbFindByPrimaryKeyMethodFound));

          if (!ejbFindByPrimaryKeyMethodFound) {
            oneFailed = true;
            result.addErrorDetails(
                smh.getLocalString(
                    "tests.componentNameConstructor",
                    "For [ {0} ]",
                    new Object[] {compName.toString()}));
            result.addErrorDetails(
                smh.getLocalString(
                    getClass().getName() + ".debug3",
                    "For EJB Class [ {0} ]",
                    new Object[] {descriptor.getEjbClassName()}));
            result.addErrorDetails(
                smh.getLocalString(
                    getClass().getName() + ".failed1",
                    "Error: No ejbFindByPrimaryKey method was found in bean class."));
          }

        } catch (ClassNotFoundException e) {
          Verifier.debug(e);
          result.addErrorDetails(
              smh.getLocalString(
                  "tests.componentNameConstructor",
                  "For [ {0} ]",
                  new Object[] {compName.toString()}));
          result.failed(
              smh.getLocalString(
                  getClass().getName() + ".failedException",
                  "Error: EJB Class [ {0} ] does not exist or is not loadable.",
                  new Object[] {descriptor.getEjbClassName()}));
          oneFailed = true;
        }

        if (oneFailed) {
          result.setStatus(result.FAILED);
        } else {
          result.setStatus(result.PASSED);
        }
      } else { // (CONTAINER_PERSISTENCE.equals(persistentType))
        result.addNaDetails(
            smh.getLocalString(
                "tests.componentNameConstructor",
                "For [ {0} ]",
                new Object[] {compName.toString()}));
        result.notApplicable(
            smh.getLocalString(
                getClass().getName() + ".notApplicable2",
                "Expected persistence type [ {0} ], but bean [ {1} ] has persistence type [ {2} ]",
                new Object[] {
                  EjbEntityDescriptor.BEAN_PERSISTENCE, descriptor.getName(), persistentType
                }));
      }

      return result;

    } else {
      result.addNaDetails(
          smh.getLocalString(
              "tests.componentNameConstructor", "For [ {0} ]", new Object[] {compName.toString()}));
      result.notApplicable(
          smh.getLocalString(
              getClass().getName() + ".notApplicable",
              "[ {0} ] expected {1} bean, but called with {2} bean.",
              new Object[] {getClass(), "Entity", "Session"}));
      return result;
    }
  }