FileDocCategorySizeDatePackage
HomeInterfaceFindMethodReturn.javaAPI DocGlassfish v2 API9747Fri May 04 22:33:50 BST 2007com.sun.enterprise.tools.verifier.tests.ejb.entity.findermethod

HomeInterfaceFindMethodReturn

public class HomeInterfaceFindMethodReturn extends com.sun.enterprise.tools.verifier.tests.ejb.EjbTest implements com.sun.enterprise.tools.verifier.tests.ejb.EjbCheck
Entity beans home interface find method return type test. The following are the requirements for the signatures of the finder methods defined in Bean's home interface: An Entity Bean's home interface defines one or more find(...) methods. The return type for a find(...) method must be the enterprise Bean's remote interface type or a collection thereof.

Fields Summary
Result
result
ComponentNameConstructor
compName
Constructors Summary
Methods Summary
public Resultcheck(com.sun.enterprise.deployment.EjbDescriptor descriptor)
Entity beans home interface find method return type test. The following are the requirements for the signatures of the finder methods defined in Bean's home interface: An Entity Bean's home interface defines one or more find(...) methods. The return type for a find(...) method must be the enterprise Bean's remote interface type or a collection thereof.

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

                                                                                      
        

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

	if (descriptor instanceof EjbEntityDescriptor) {
            String persistence =
                ((EjbEntityDescriptor)descriptor).getPersistenceType();
            if (EjbEntityDescriptor.BEAN_PERSISTENCE.equals(persistence)) {
		boolean oneFailed = false;
		// RULE: Entity home interface are allowed to have find<METHOD> 
		//       methods which returns the entity Bean's remote interface 
		//       or a collection thereof. 
		if(descriptor.getRemoteClassName() != null && !"".equals(descriptor.getRemoteClassName()) &&
		   descriptor.getHomeClassName() != null && !"".equals(descriptor.getHomeClassName())) {
		    oneFailed = commonToBothInterfaces(descriptor.getHomeClassName(),descriptor.getRemoteClassName(),descriptor);
		}
		if(oneFailed == false) {
		    if(descriptor.getLocalClassName() != null && !"".equals(descriptor.getLocalClassName()) &&
		       descriptor.getLocalHomeClassName() != null && !"".equals(descriptor.getLocalHomeClassName())) {
			oneFailed = commonToBothInterfaces(descriptor.getLocalHomeClassName(),descriptor.getLocalClassName(),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, java.lang.String remote, 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
remote for Remote/Local interface
return
boolean the results for this assertion i.e if a test has failed or not

	boolean oneFailed = false;
	try {
		    Context context = getVerifierContext();
		ClassLoader jcl = context.getClassLoader();
		    Class c = Class.forName(home, false, getVerifierContext().getClassLoader());
		    Class rc = Class.forName(remote, false, getVerifierContext().getClassLoader());
		    Method methods[] = c.getDeclaredMethods();
		    Class methodReturnType;
		    boolean validReturn = false;
  
		    for (int i=0; i< methods.length; i++) {
			// clear these from last time thru loop
			validReturn = false;
			if (methods[i].getName().startsWith("find")) {
			    // return type must be the remote interface 
			    // or collection thereof
			    methodReturnType = methods[i].getReturnType();
			    if ((methodReturnType.getName().equals(rc.getName())) ||
				(methodReturnType.getName().equals("java.util.Collection")) ||
				(methodReturnType.getName().equals("java.util.Enumeration"))) { 
				// this is the right return type for find method
				validReturn = true;
			    } else {
				validReturn = false;
			    } // return valid
  
			    //report for this particular find method found in home interface
			    // now display the appropriate results for this particular find
			    // method
			    if (validReturn) {
				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 find<METHOD> which returns remote interface or a collection there of was found."));
			    } else if (!validReturn) {
				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: A find<METHOD> was found, but the return type [ {0} ] was not the Remote interface [ {1} ] or a collection there of." ,
							new Object[] {methodReturnType.getName(),rc.getName()}));
			    }  // 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 Remote interface [ {1} ] does not exist or is not loadable within bean [ {2} ]",
				   new Object[] {home,remote, descriptor.getName()}));
		    return oneFailed;
		}