FileDocCategorySizeDatePackage
EjbClassStaticFieldsFinal.javaAPI DocGlassfish v2 API7129Fri May 04 22:33:32 BST 2007com.sun.enterprise.tools.verifier.tests.ejb.beanclass

EjbClassStaticFieldsFinal

public class EjbClassStaticFieldsFinal extends com.sun.enterprise.tools.verifier.tests.ejb.EjbTest implements com.sun.enterprise.tools.verifier.tests.ejb.EjbCheck
Enterprise Java Bean class static final fields test. An enterprise Bean must not use read/write static fields. Using read-only static fields is allowed. Therefore, it is recommended that all static fields in the enterprise bean class be declared as final. This rule is required to ensure consistent runtime semantics because while some EJB Containers may use a single JVM to execute all enterprise bean's instances, others may distribute the instances across multiple JVMs.

Fields Summary
Constructors Summary
Methods Summary
public Resultcheck(EjbDescriptor descriptor)
Enterprise Java Bean class static final fields test. An enterprise Bean must not use read/write static fields. Using read-only static fields is allowed. Therefore, it is recommended that all static fields in the enterprise bean class be declared as final. This rule is required to ensure consistent runtime semantics because while some EJB Containers may use a single JVM to execute all enterprise bean's instances, others may distribute the instances across multiple JVMs.

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


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

	//  it is recommended that all static fields in the enterprise bean class 
	// be declared as final. 
	try {
	    Class c = Class.forName(descriptor.getEjbClassName(), false, getVerifierContext().getClassLoader());

	    boolean oneFailed = false;
	    boolean badField = false;
	    Field [] fields = c.getDeclaredFields();
	    for (int i = 0; i < fields.length; i++) {
		badField = false;
		// hack to prevent compiler bug, don't want to process fields such as
		// class$test$enforcer$hello$HelloHome, so if the field contains a "$"
		// just skip it, otherwise process normally.
		// if "$" does not occur as a substring, -1 is returned.
		if (fields[i].getName().indexOf("$") == -1) {
		    int modifiers = fields[i].getModifiers();
		    if (Modifier.isStatic(modifiers)) {
			if (Modifier.isFinal(modifiers)) {
			    continue;
			} else {
			    if (!oneFailed) {
				oneFailed = true;
			    }
			    badField = true;
			}
		    }
		}
  
		if (badField) {
		    result.addWarningDetails(smh.getLocalString
					     ("tests.componentNameConstructor",
					      "For [ {0} ]",
					      new Object[] {compName.toString()}));
		    result.warning(smh.getLocalString
				   (getClass().getName() + ".warning",
				    "Warning: Field [ {0} ] defined within bean class [ {1} ] is defined as static, but not defined as final.  An enterprise Bean must not use read/write static fields. Using read-only static fields is allowed.",
				    new Object[] {fields[i].getName(),(descriptor).getEjbClassName()}));
		}
	    }
	    if (!oneFailed) {
		result.addGoodDetails(smh.getLocalString
				      ("tests.componentNameConstructor",
				       "For [ {0} ]",
				       new Object[] {compName.toString()}));
		result.passed(smh.getLocalString
			      (getClass().getName() + ".passed",
			       "This bean class [ {0} ] has defined any and all static fields as final.",
			       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()}));
	} catch (Exception e) {
	    Verifier.debug(e);
	    result.addErrorDetails(smh.getLocalString
				   ("tests.componentNameConstructor",
				    "For [ {0} ]",
				    new Object[] {compName.toString()}));
	    result.failed(smh.getLocalString
			  (getClass().getName() + ".failedException1",
			   "Error: [ {0} ] class encountered [ {1} ]",
			   new Object[] {(descriptor).getEjbClassName(),e.getMessage()}));
	} catch (Throwable t) {
	    result.addWarningDetails(smh.getLocalString
				     ("tests.componentNameConstructor",
				      "For [ {0} ]",
				      new Object[] {compName.toString()}));
	    result.warning(smh.getLocalString
			  (getClass().getName() + ".warningException",
			   "Warning: [ {0} ] class encountered [ {1} ]. Cannot access fields of class [ {2} ] which is external to [ {3} ].",
			   new Object[] {(descriptor).getEjbClassName(),t.toString(), t.getMessage(), descriptor.getEjbBundleDescriptor().getModuleDescriptor().getArchiveUri()}));
	}  
	return result;