BusinessMethodExceptionCheckpublic class BusinessMethodExceptionCheck extends com.sun.enterprise.tools.verifier.tests.ejb.EjbTest implements com.sun.enterprise.tools.verifier.tests.ejb.EjbCheckEnterprise Bean's business(...) methods exceptions test.
Each enterprise Bean class must define zero or more business(...) methods.
The method signatures must follow these rules:
Compatibility Note: EJB 2.1 specification states that All the exceptions defined in the
throws clause of the matching method of the session bean class must be defined in the
throws clause of the method of the remote interface. (see Section 7.11.5)
Note: Treat as a warning to user in this instance. |
Fields Summary |
---|
Result | result | ComponentNameConstructor | compName |
Methods Summary |
---|
public Result | check(EjbDescriptor descriptor)Enterprise Bean's business(...) methods exceptions test.
Each enterprise Bean class must define zero or more business(...) methods.
The method signatures must follow these rules:
Compatibility Note:EJB 2.1 specification states that All the exceptions defined in the
throws clause of the matching method of the session bean class must be defined in the
throws clause of the method of the remote interface. (see Section 7.11.5)
Note: Treat as a warning to user in this instance.
result = getInitializedResult();
compName = getVerifierContext().getComponentNameConstructor();
if (descriptor instanceof EjbSessionDescriptor) {
if(descriptor.getRemoteClassName() != null && !"".equals(descriptor.getRemoteClassName())) {
commonToBothInterfaces(descriptor.getRemoteClassName(),descriptor);
}
if(descriptor.getLocalClassName() != null && !"".equals(descriptor.getLocalClassName())) {
commonToBothInterfaces(descriptor.getLocalClassName(),descriptor);
}
}
if(result.getStatus() != Result.FAILED &&
result.getStatus() != Result.WARNING) {
addGoodDetails(result, compName);
result.passed(smh.getLocalString
(getClass().getName() + ".passed",
"All the exceptions defined in the throws clause of the matching "+
"business methods are defined in the throws clause of the method "+
"of the remote interface "));
}
return result;
| private void | commonToBothInterfaces(java.lang.String intf, EjbDescriptor descriptor)This method is responsible for the logic of the test. It is called for
both local and remote interfaces.
try {
Class intfClass = Class.forName(intf, false, getVerifierContext().getClassLoader());
Class beanClass = Class.forName(descriptor.getEjbClassName(),
false,
getVerifierContext().getClassLoader());
for (Method remoteMethod : intfClass.getMethods()) {
// we don't test the EJB methods,testing only business methods
if (remoteMethod.getDeclaringClass().getName().equals("javax.ejb.EJBObject")||
remoteMethod.getDeclaringClass().getName().equals("javax.ejb.EJBLocalObject"))
continue;
Class [] parameterTypes = remoteMethod.getParameterTypes();
Method method =getMethod(beanClass,remoteMethod.getName(),parameterTypes);
if(method == null)
continue;
Class [] remoteExceptions = remoteMethod.getExceptionTypes();
Class [] exceptions = method.getExceptionTypes();
/* EJB 2.1 specification has such statement in 7.11.5 Session Bean's
Remote Interface section:"All the exceptions defined in the throws
clause of the matching method of the session bean class must be defined
in the throws clause of the method of the remote interface."
*/
for (Class exception : exceptions) {
boolean foundOne = false;
for (Class remoteException : remoteExceptions)
if(remoteException.getName().equals(exception.getName())) {
foundOne = true;
break;
}
if(!foundOne) {
addWarningDetails(result, compName);
result.warning(smh.getLocalString
(getClass().getName() + ".warning",
"Not Compatible Exception: A public business " +
"method [ {0} ] was found, but according to " +
"the EJB specification, all the exceptions " +
"defined in the throws clause of the matching " +
"method of the session bean class must be " +
"defined in the throws clause of the method " +
"of the remote interface. Exception [ {1} ] " +
"is not defined in the bean's remote interface.",
new Object[] {method.getName(),exception.getName()}));
}
}//end of for
}//end of for
} catch (Exception e) {
Verifier.debug(e);
addErrorDetails(result, compName);
result.addErrorDetails(smh.getLocalString
(getClass().getName() + ".failed",
"Remote interface [ {0} ] or bean class [ {1} ] does " +
"not exist or is not loadable within bean [ {2} ].",
new Object[] {intf,descriptor.getEjbClassName(),descriptor.getName()}));
}//end of catch block
|
|