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.
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;