FileDocCategorySizeDatePackage
HomeInterfaceCreateMethodExceptionMatch.javaAPI DocGlassfish v2 API13800Fri May 04 22:34:06 BST 2007com.sun.enterprise.tools.verifier.tests.ejb.session.createmethod

HomeInterfaceCreateMethodExceptionMatch

public class HomeInterfaceCreateMethodExceptionMatch extends com.sun.enterprise.tools.verifier.tests.ejb.EjbTest implements com.sun.enterprise.tools.verifier.tests.ejb.EjbCheck
Session beans home interface method exceptions match test. The following are the requirements for the enterprise Bean's home interface signature: A Session Bean's home interface defines one or more create(...) methods. All the exceptions defined in the throws clause of an ejbCreate method of the enterprise Bean class must be defined in the throws clause of the matching create method of the home interface.

Fields Summary
Result
result
ComponentNameConstructor
compName
boolean
foundAtLeastOneCreate
Constructors Summary
Methods Summary
public Resultcheck(com.sun.enterprise.deployment.EjbDescriptor descriptor)
Session beans home interface method exceptions match test. The following are the requirements for the enterprise Bean's home interface signature: A Session Bean's home interface defines one or more create(...) methods. All the exceptions defined in the throws clause of an ejbCreate method of the enterprise Bean class must be defined in the throws clause of the matching create method of the home interface.

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



                                                                                                      
        

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

	if (descriptor instanceof EjbSessionDescriptor) {
            if (((descriptor.getHomeClassName() == null) || "".equals(descriptor.getHomeClassName())) &&
                ((descriptor.getLocalHomeClassName() == null) || "".equals(descriptor.getLocalHomeClassName()))) {

                if (implementsEndpoints(descriptor)) {

                    result.addNaDetails(smh.getLocalString
                        ("tests.componentNameConstructor",
                        "For [ {0} ]",
                         new Object[] {compName.toString()}));
                    result.notApplicable(smh.getLocalString
                       ("com.sun.enterprise.tools.verifier.tests.ejb.webservice.notapp",
                       "Not Applicable because, EJB [ {0} ] implements a Service Endpoint Interface.",
                       new Object[] {compName.toString()}));
                    result.setStatus(result.NOT_APPLICABLE);
                 }
                 else {

                  result.addErrorDetails(smh.getLocalString
                                   ("tests.componentNameConstructor",
                                    "For [ {0} ]",
                                    new Object[] {compName.toString()}));
                  result.addErrorDetails(smh.getLocalString
                                    ("com.sun.enterprise.tools.verifier.tests.ejb.webservice.failedhome",
                                    "Ejb [ {0} ] does not have local or remote Home interfaces",
                                    new Object[] {descriptor.getEjbClassName()}));
                  result.setStatus(result.FAILED);
                  return result;

                 }
              return result;
            }

	    boolean oneFailed = false;
 
	    oneFailed = commonToBothInterfaces(descriptor.getHomeClassName(),descriptor.getLocalHomeClassName(),(EjbSessionDescriptor)descriptor);
		
	    if (oneFailed) {
		result.setStatus(result.FAILED);
	    } 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(),"Session","Entity"}));
	    return result;
	} 
    
private booleancommonToBothInterfaces(java.lang.String home, java.lang.String local, com.sun.enterprise.deployment.EjbSessionDescriptor descriptor)
This method is responsible for the logic of the test. It is called for both local and remote interfaces.

param
descriptor the Enterprise Java Bean deployment descriptor
param
home for the Home interface of the Ejb.
return
boolean the results for this assertion i.e if a test has failed or not

	boolean oneFailed = false;
	int ejbCreateMethodLoopCounter = 0;
	// RULE: session home interface are only allowed to have create 
	//       methods which match ejbCreate, and exceptions match Bean's
	try {
	    Context context = getVerifierContext();
	    ClassLoader jcl = context.getClassLoader();
	    Class methodReturnType;
	    Class [] methodParameterTypes;
	    Class [] methodExceptionTypes;
	    Class [] ejbCreateMethodExceptionTypes;
	    Class [] ejbCreateMethodParameterTypes;
	    boolean ejbCreateFound = false;
	    boolean exceptionsMatch = false;
	    Vector<Method> createMethodSuffix = new Vector<Method>();

	    if (home != null) {
		Class c = Class.forName(home, false, getVerifierContext().getClassLoader());
		Method [] homeMethods = c.getDeclaredMethods();
		for (int i = 0; i < homeMethods.length; i++) {
		    // The method name must start with create. 
		    if (homeMethods[i].getName().startsWith("create")) {
			createMethodSuffix.addElement( (Method)homeMethods[i]);
			foundAtLeastOneCreate = true;
		    }
		}
	    }
	    if (local != null) {
		Class c = Class.forName(local, false, getVerifierContext().getClassLoader());
		Method [] homeMethods = c.getDeclaredMethods();
		for (int i = 0; i < homeMethods.length; i++) {
		    // The method name must start with create. 
		    if (homeMethods[i].getName().startsWith("create")) {
			createMethodSuffix.addElement( (Method)homeMethods[i]);
			foundAtLeastOneCreate = true;
		    }
		}
	    }
	    if (foundAtLeastOneCreate == false) {
		result.addErrorDetails(smh.getLocalString
				       ("tests.componentNameConstructor",
					"For [ {0} ]",
					new Object[] {compName.toString()}));
		result.failed(smh.getLocalString
			      (getClass().getName() + ".failedException2",
			       "Error: no create<Method> method exists!",
			       new Object[] {}));
		return true;
	    }
	    Class EJBClass = Class.forName(descriptor.getEjbClassName(), false, getVerifierContext().getClassLoader());
	    
	    do {
		Method [] methods = EJBClass.getDeclaredMethods();
		// find matching "ejbCreate" in bean class
		for (int i = 0; i < methods.length; i++) {
		    ejbCreateFound = false;
		    exceptionsMatch = false;
		    if (methods[i].getName().startsWith("ejbCreate")) {
			String matchSuffix = methods[i].getName().substring(9);
			for (int k = 0; k < createMethodSuffix.size(); k++) {
			    if (matchSuffix.equals(((Method)(createMethodSuffix.elementAt(k))).getName().substring(6))) {
				// clear these from last time thru loop
				// retrieve the EJB Class Methods
				methodParameterTypes = ((Method)(createMethodSuffix.elementAt(k))).getParameterTypes();
				ejbCreateMethodParameterTypes = methods[i].getParameterTypes();
				if (Arrays.equals(methodParameterTypes,ejbCreateMethodParameterTypes)) {
				    ejbCreateFound = true;
				    methodExceptionTypes = ((Method)(createMethodSuffix.elementAt(k))).getExceptionTypes();
				    ejbCreateMethodExceptionTypes = methods[i].getExceptionTypes();
				    if (RmiIIOPUtils.isEjbFindMethodExceptionsSubsetOfFindMethodExceptions(ejbCreateMethodExceptionTypes,methodExceptionTypes)) {
					exceptionsMatch = true;
					// used to display output below
					ejbCreateMethodLoopCounter = k;
					break;
				    }
				} // method params match
			    } // found ejbCreate
			}
			
			//report for this particular create method found in home interface
			//if we know that ejbCreateFound got set to true in the above 
			// loop, check other booleans, otherwise skip test, set status 
			// to FAILED below
			
			// now display the appropriate results for this particular create
			// method
			if (ejbCreateFound && exceptionsMatch) {
			    result.addGoodDetails(smh.getLocalString
				       ("tests.componentNameConstructor",
					"For [ {0} ]",
					new Object[] {compName.toString()}));
			    result.addGoodDetails(smh.getLocalString
						  (getClass().getName() + ".debug1",
						   "For Home Interface Method [ {0} ]",
						   new Object[] {((Method)(createMethodSuffix.elementAt(ejbCreateMethodLoopCounter))).getName()}));
			    result.addGoodDetails(smh.getLocalString
						  (getClass().getName() + ".passed",
						   "The corresponding [ {0} ] method with matching exceptions was found.",
						   new Object[] {methods[i].getName()}));
			}
			
			if (ejbCreateFound && !exceptionsMatch) {
			    oneFailed = true;
			    result.addErrorDetails(smh.getLocalString
				       ("tests.componentNameConstructor",
					"For [ {0} ]",
					new Object[] {compName.toString()}));
			    result.addErrorDetails(smh.getLocalString
						   (getClass().getName() + ".debug1",
						    "For Home Interface Method [ {0} ]",
						    new Object[] {((Method)(createMethodSuffix.elementAt(ejbCreateMethodLoopCounter))).getName()}));
			    result.addErrorDetails(smh.getLocalString
						   (getClass().getName() + ".failed",
						    "Error: A corresponding [ {0} ] method was found, but the exceptions defined by method [ {1} ] are not defined within matching create() method.",
						    new Object[] {"ejb"+methods[i].getName().toUpperCase().substring(0,1)+methods[i].getName().substring(1),"ejb"+methods[i].getName().toUpperCase().substring(0,1)+methods[i].getName().substring(1)}));
			} else if (!ejbCreateFound) {
			    // set status to FAILED, 'cause there is not even an
			    // ejbCreate method to begin with, regardless of its parameters
			    oneFailed = true;
			    result.addErrorDetails(smh.getLocalString
				       ("tests.componentNameConstructor",
					"For [ {0} ]",
					new Object[] {compName.toString()}));
			    result.addErrorDetails(smh.getLocalString
						   (getClass().getName() + ".debug1",
						    "For Home Interface Method [ {0} ]",
						    new Object[] {((Method)(createMethodSuffix.elementAt(ejbCreateMethodLoopCounter))).getName()}));
			    result.addErrorDetails(smh.getLocalString
						   (getClass().getName() + ".failed1",
						    "Error: No corresponding ejbCreate method was found." ));
			    break;
			}  // end of reporting for this particular 'create' method
		    } // if the home interface found a "create" method
		} // for all the methods within the home interface class, loop
		if (oneFailed == true)
		    break;
	    } while (((EJBClass = EJBClass.getSuperclass()) != null) && (!(ejbCreateFound && exceptionsMatch)));
	    return oneFailed;
	} 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: Home (Remote/Local) interface or Bean class [ {0} ] does not exist or is not loadable within bean [ {1} ]",
			   new Object[] {descriptor.getEjbClassName(),descriptor.getName()}));
	    return oneFailed;
	}