FileDocCategorySizeDatePackage
HomeInterfaceFindMethodExceptionMatch.javaAPI DocGlassfish v2 API13461Fri May 04 22:33:48 BST 2007com.sun.enterprise.tools.verifier.tests.ejb.entity.findermethod

HomeInterfaceFindMethodExceptionMatch

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

Fields Summary
Result
result
ComponentNameConstructor
compName
Constructors Summary
Methods Summary
public Resultcheck(com.sun.enterprise.deployment.EjbDescriptor descriptor)
Entity beans home interface find method exceptions match test. The following are the requirements for the enterprise Bean's home interface find method signature: An Entity Bean's home interface defines one or more find(...) methods. All the exceptions defined in the throws clause of an ejbFind(...) method of the enterprise Bean class must be defined in the throws clause of the matching find(...) 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();
	boolean oneFailed = false;
	if (descriptor instanceof EjbEntityDescriptor) {
	    String persistence =
		((EjbEntityDescriptor)descriptor).getPersistenceType();
	    if (EjbEntityDescriptor.BEAN_PERSISTENCE.equals(persistence)) {
		if(descriptor.getHomeClassName() != null && !"".equals(descriptor.getHomeClassName())) {
		    oneFailed = commonToBothInterfaces(descriptor.getHomeClassName(),descriptor);
		}
		if(oneFailed == false) {
		    if(descriptor.getLocalHomeClassName() != null && !"".equals(descriptor.getLocalHomeClassName())) {
			oneFailed = commonToBothInterfaces(descriptor.getLocalHomeClassName(),descriptor);
		    }
		}

		if (oneFailed) {
		    result.setStatus(result.FAILED);
		} else {
		    result.setStatus(result.PASSED);
		}
   
		return result;
	    } else { //if (CONTAINER_PERSISTENCE.equals(persistence))
		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;
	} 
    
private booleancommonToBothInterfaces(java.lang.String home, com.sun.enterprise.deployment.EjbDescriptor 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.
param
interfaceType determines the type of interface (remote/local)
return
boolean the results for this assertion i.e if a test has failed or not

	boolean oneFailed = false;
	int ejbFinderMethodLoopCounter = 0;
	// RULE: entity home interface are only allowed to have find<METHOD> 
	//       methods which match ejbfind<METHOD>, and exceptions match Bean's
	try {
	    Context context = getVerifierContext();
		ClassLoader jcl = context.getClassLoader();
	    Class c = Class.forName(home, false, getVerifierContext().getClassLoader());
	    Method methods[] = c.getDeclaredMethods();
	    Class methodReturnType;
	    Class [] methodParameterTypes;
	    Class [] methodExceptionTypes;
	    Class [] ejbFinderMethodExceptionTypes;
	    Class [] ejbFinderMethodParameterTypes;
	    boolean ejbFinderFound = false;
	    boolean signaturesMatch = false;
	    boolean exceptionsMatch = false;
	    
	    
	    for (int i=0; i< methods.length; i++) {
		if (methods[i].getName().startsWith("find")) {
		    // clear these from last time thru loop
		    ejbFinderFound = false;
		    signaturesMatch = false;
		    exceptionsMatch = false;
		    // retrieve the EJB Class Methods
		    Class EJBClass = Class.forName(descriptor.getEjbClassName(), false, getVerifierContext().getClassLoader());
		    // start do while loop here....
		    do {
			Method [] ejbFinderMethods = EJBClass.getDeclaredMethods();
			// find matching "ejbFind<METHOD>" in bean class
			for (int z=0; z< ejbFinderMethods.length; z++) {
			    if (ejbFinderMethods[z].getName().startsWith("ejbFind")) {
				// check rest of string to see if findAccount matches
				// ejbFindAccount
				if (methods[i].getName().toUpperCase().equals
				    (ejbFinderMethods[z].getName().toUpperCase().substring(3))) {
				    // found one, see if it matches same number and types
				    // of arguments, exceptions too, 
				    
				    ejbFinderFound = true;
				    methodParameterTypes = methods[i].getParameterTypes();
				    ejbFinderMethodParameterTypes = ejbFinderMethods[z].getParameterTypes();
				    if (Arrays.equals(methodParameterTypes,ejbFinderMethodParameterTypes)) {
					signaturesMatch = true;
					
					methodExceptionTypes = methods[i].getExceptionTypes();
					ejbFinderMethodExceptionTypes = ejbFinderMethods[z].getExceptionTypes();
					
					// All the exceptions defined in the throws clause of the
					// matching ejbFind method of the
					// enterprise Bean class must be included in the throws
					// clause of the matching find method of the home interface
					// including findByPrimaryKey, this home interface
					// find method must define a superset of all the 
					// exceptions thrown in the ejbFind method of the bean class
					// so there may not be a 1-1 mapping of exceptions
					// also, for all ejbFind/find combo's any unchecked 
					// exceptions thrown by the ejbFind<METHOD> in the bean 
					// class doesn't need to be thrown in the corresponding
					// find<METHOD> of the home interface , these unchecked
					// exceptions "subclass of RuntimeException" i.e
					// out of memory exception are handled by the container, 
					// who throws a Runtime exception to the appropriate 
					// instance/object
					
					if (RmiIIOPUtils.isEjbFindMethodExceptionsSubsetOfFindMethodExceptions(ejbFinderMethodExceptionTypes,methodExceptionTypes)) {
					    exceptionsMatch = true;
					    // used to display output below
					    ejbFinderMethodLoopCounter = z;
					    break;
					}
				    } // method params match
				}  // check rest of string to see if findAccount 
				//  matches ejbFindAccount
			    } // found ejbFind<METHOD>
			} // for all the business methods within the bean class, loop
			
			//report for this particular find method found in home interface
			//if we know that ejbFinderFound 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 find
			// method
			if (ejbFinderFound && signaturesMatch && exceptionsMatch) {
			    result.addGoodDetails(smh.getLocalString
				   ("tests.componentNameConstructor",
				    "For [ {0} ]",
				    new Object[] {compName.toString()}));
			    result.addGoodDetails(smh.getLocalString
						  (getClass().getName() + ".debug1",
						   "For Home Interface [ {0} ] Method [ {1} ]",
						   new Object[] {c.getName(),methods[i].getName()}));
			    result.addGoodDetails(smh.getLocalString
						  (getClass().getName() + ".passed",
						   "The corresponding [ {0} ] method with matching exceptions was found.",
						   new Object[] {ejbFinderMethods[ejbFinderMethodLoopCounter].getName()}));
			} else if (ejbFinderFound && signaturesMatch && !exceptionsMatch) {
			    logger.log(Level.FINE, getClass().getName() + ".debug1",
                        new Object[] {c.getName(),methods[i].getName()});
                logger.log(Level.FINE, getClass().getName() + ".debug3",
                        new Object[] {"ejb"+methods[i].getName().toUpperCase().substring(0,1)+methods[i].getName().substring(1)});
                logger.log(Level.FINE, getClass().getName() + ".debug2");

			} else if (ejbFinderFound && !signaturesMatch) {
                logger.log(Level.FINE, getClass().getName() + ".debug1",
                        new Object[] {c.getName(),methods[i].getName()});
                logger.log(Level.FINE, getClass().getName() + ".debug4",
                        new Object[] {"ejb"+methods[i].getName().toUpperCase().substring(0,1)+methods[i].getName().substring(1)});
                logger.log(Level.FINE, getClass().getName() + ".debug2");

			}
			
		    } while (((EJBClass = EJBClass.getSuperclass()) != null) && (!(ejbFinderFound && signaturesMatch && exceptionsMatch)));
		    
		    
		    if (!ejbFinderFound && !signaturesMatch && !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 [ {0} ] Method [ {1} ]",
						new Object[] {c.getName(),methods[i].getName()}));
			result.addErrorDetails(smh.getLocalString
					       (getClass().getName() + ".failed",
						"Error: No corresponding [ {0} ] method with matching signatures was found." ,
						new Object[] {"ejb"+methods[i].getName().toUpperCase().substring(0,1)+methods[i].getName().substring(1)}));
		    }  // end of reporting for this particular 'find' method
		} // if the home interface found a "find" method
	    } // for all the methods within the home interface class, loop
	    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 interface [ {0} ] or EJB class [ {1} ] does not exist or is not loadable within bean [ {2} ]",
			   new Object[] {home, descriptor.getEjbClassName(),descriptor.getName()}));
	    return oneFailed;
	}