FileDocCategorySizeDatePackage
LocalInterfaceExposed.javaAPI DocGlassfish v2 API6827Fri May 04 22:33:32 BST 2007com.sun.enterprise.tools.verifier.tests.ejb

LocalInterfaceExposed

public class LocalInterfaceExposed extends EjbTest implements EjbCheck
Local interface should not be exposed through remote interface
author
Sheetal Vartak
version

Fields Summary
Constructors Summary
Methods Summary
public com.sun.enterprise.tools.verifier.Resultcheck(EjbDescriptor descriptor)
Bean interface type test. The bean provider must provide either Local or Remote or Both interfaces

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

        
        Result result = getInitializedResult();
        ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor();
        
        if (!(descriptor instanceof EjbSessionDescriptor) &&
                !(descriptor instanceof EjbEntityDescriptor)) {
            addNaDetails(result, compName);
            result.notApplicable(smh.getLocalString
                            (getClass().getName()+".notApplicable1",
                            "Test apply only to session or entity beans."));
            return result;
        }
        
        EjbBundleDescriptor bundle = descriptor.getEjbBundleDescriptor();
        Iterator iterator = (bundle.getEjbs()).iterator();
        Set<String> localInterfaces = new HashSet<String>();
        while(iterator.hasNext()) {
            EjbAbstractDescriptor entity = (EjbAbstractDescriptor) iterator.next();
            if (entity.getLocalClassName() != null) 
                localInterfaces.add(entity.getLocalClassName());
            localInterfaces.addAll(entity.getLocalBusinessClassNames());
        }
        ClassLoader jcl = getVerifierContext().getClassLoader();
        try { 
            Set<String> remoteInterfaces = new HashSet<String>();
            if(descriptor.getRemoteClassName()!=null)
                remoteInterfaces.add(descriptor.getRemoteClassName());
            remoteInterfaces.addAll(descriptor.getRemoteBusinessClassNames());
            
            for (String intf : remoteInterfaces) {
                Class c = Class.forName(intf, false, getVerifierContext().getClassLoader());
                Method[] methods = c.getDeclaredMethods();
                for(int i=0; i<methods.length; i++) {
                    //check all the local interfaces in the ejb bundle
                    for(Iterator itr = localInterfaces.iterator();itr.hasNext();) {
                        String localIntf = (String) itr.next();
                        Class returnType = methods[i].getReturnType();
                        if((getBaseComponentType(returnType).getName()).equals(localIntf) ||
                                (contains(methods[i].getParameterTypes(), localIntf))) {
                            addErrorDetails(result, compName);
                            result.failed(smh.getLocalString
                                    (getClass().getName() + ".failed",
                                    "Error : Local Interface [ {0} ] has been " +
                                    "exposed in remote interface [ {1} ]",
                                    new Object[] {localIntf, c.getName()}));
                            return result;
                        }
                    }
                } 
            }
            addGoodDetails(result, compName);
            result.passed(smh.getLocalString
                            (getClass().getName() + ".passed",
                            "Valid Remote interface."));
        } catch (ClassNotFoundException e) {
            Verifier.debug(e);
            addErrorDetails(result, compName);
            result.failed(smh.getLocalString
                            (getClass().getName() + ".failedException",
                            "Error: [ {0} ] class not found.",
                            new Object[] {descriptor.getRemoteClassName()}));
        }
        return result;
    
private booleancontains(java.lang.Class[] args, java.lang.String intf)
returns true if intf is contained in this args array

        for (int i = 0; i < args.length; i++)
            if(getBaseComponentType(args[i]).getName().equals(intf))
                return true;
        
        return false;
    
private java.lang.ClassgetBaseComponentType(java.lang.Class cls)
This api recursively looks for class.getComponentType. This handles cases where array of arrays are used.

        if(!cls.isArray())
            return cls;
        return getBaseComponentType(cls.getComponentType());