/**
   * 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 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;
    }
  }