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

HomeInterfaceCreateMethodReturn

public class HomeInterfaceCreateMethodReturn extends com.sun.enterprise.tools.verifier.tests.ejb.EjbTest implements com.sun.enterprise.tools.verifier.tests.ejb.EjbCheck
Session beans home interface create method return type 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. The return type for a create method must be the enterprise Bean's remote interface type.

Fields Summary
Result
result
ComponentNameConstructor
compName
boolean
remote_exists
boolean
local_exists
Constructors Summary
Methods Summary
public Resultcheck(com.sun.enterprise.deployment.EjbDescriptor descriptor)
Session beans home interface create method return type 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. The return type for a create method must be the enterprise Bean's remote interface type.

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


                                                                                    
        

	 result = getInitializedResult();
	 compName = getVerifierContext().getComponentNameConstructor();
	 String local = null;
	 String localHome = null;
	 String remote = null;
	 String home = null;

	if (descriptor instanceof EjbSessionDescriptor) {
	    boolean oneFailed = false;
	    // RULE: session home interface are only allowed to have create 
	    //       methods which returns the session Bean's
	    //       remote interface.
	    if (descriptor.getHomeClassName() != null && !"".equals(descriptor.getHomeClassName()) &&
		descriptor.getRemoteClassName() != null && !"".equals(descriptor.getRemoteClassName()) ) {
		remote_exists = true;
		home = descriptor.getHomeClassName();
		remote = descriptor.getRemoteClassName();
	    }
	    if (descriptor.getLocalHomeClassName() != null && !"".equals(descriptor.getLocalHomeClassName())&&
		descriptor.getLocalClassName() != null && !"".equals(descriptor.getLocalClassName())) {
		local_exists = true;
		localHome = descriptor.getLocalHomeClassName();
		local = descriptor.getLocalClassName();
	    }
            if ((home == null) && (remote == null) && (localHome == null) && (local == null)) {
               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);
                   return result;
               }
            }

	    oneFailed = commonToBothInterfaces(remote,home,local,localHome,(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 remote, java.lang.String home, java.lang.String local, java.lang.String localHome, 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.
param
component for Remote/Local nterface
return
boolean the results for this assertion i.e if a test has failed or not

	boolean oneFailed = false;
	Class c,rc,lc,hc;
	Method localMethods[],methods[];
	try {
	    Context context = getVerifierContext();
	    ClassLoader jcl = context.getClassLoader();
	    if (remote_exists) {
		c = Class.forName(home, false, getVerifierContext().getClassLoader());
		rc = Class.forName(remote, false, getVerifierContext().getClassLoader());
		methods = c.getDeclaredMethods();
		oneFailed = findReturnType(methods,home,local,remote);
	    }
	    if (oneFailed == false) {
		if (local_exists) {
		    hc = Class.forName(localHome, false, getVerifierContext().getClassLoader());
		    lc = Class.forName(local, false, getVerifierContext().getClassLoader());
		    localMethods = hc.getDeclaredMethods();
		    oneFailed = findReturnType(localMethods,localHome,local,remote);
		}
	    }
	    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 [ {1} ]or Component interface [ {2} ] or [ {3} ] does not exist or is not loadable within bean [ {4} ]",
			   new Object[] {home, localHome, remote, local,  descriptor.getName()}));
	    return false;
	}
    
private booleanfindReturnType(java.lang.reflect.Method[] methods, java.lang.String home, java.lang.String local, java.lang.String remote)

	Class methodReturnType;
	boolean validReturn, oneFailed = false;
	
	for (int i=0; i< methods.length; i++) {
	    // clear these from last time thru loop
	    validReturn = false;
	    if (methods[i].getName().startsWith("create")) {
		// return type must be the remote interface
		methodReturnType = methods[i].getReturnType();
		if (remote_exists) {
		    if (methodReturnType.getName().equals(remote)) {
			// this is the right ejbCreate method
			validReturn = true;
			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[] {home ,methods[i].getName()}));
			result.addGoodDetails(smh.getLocalString
					      (getClass().getName() + ".passed",
					       "The create method which returns [ {0} ] interface was found.",
					       new Object[] {"remote"}));
		    }
		}
		if (local_exists) {
		    if (methodReturnType.getName().equals(local)) {
			// this is the right ejbCreate method
			validReturn = true;
			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[] {home ,methods[i].getName()}));
			result.addGoodDetails(smh.getLocalString
					      (getClass().getName() + ".passed",
					       "The create method which returns [ {0} ] interface was found.",
					       new Object[] {"local"}));
		    }
		}
		
		//report for this particular create method found in home interface
		// now display the appropriate results for this particular create
		// method
		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[] {home,methods[i].getName()}));
		    result.addErrorDetails(smh.getLocalString
					   (getClass().getName() + ".failed",
					    "Error: A Create method was found, but the return type [ {0} ] was not the Remote/Local interface" ,
					    new Object[] {methodReturnType.getName()}));
		}  // 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
	
	return oneFailed;