FileDocCategorySizeDatePackage
WebArchiveClassesLoadable.javaAPI DocGlassfish v2 API7682Fri May 04 22:34:10 BST 2007com.sun.enterprise.tools.verifier.tests.web

WebArchiveClassesLoadable

public class WebArchiveClassesLoadable extends WebTest implements WebCheck
A j2ee archive should be self sufficient and should not depend on any classes to be available at runtime. The test checks whether all the classes found in the web archive are loadable and the classes that are referenced inside their code are also loadable within the jar.
author
Vikas Awasthi

Fields Summary
Constructors Summary
Methods Summary
public com.sun.enterprise.tools.verifier.Resultcheck(com.sun.enterprise.deployment.WebBundleDescriptor descriptor)

        Result result = getInitializedResult();
        ComponentNameConstructor compName = getVerifierContext().getComponentNameConstructor();
        String archiveUri = getAbstractArchiveUri(descriptor);
        
        Iterator entries;
        try{
            entries=getClassNames(descriptor).iterator();
        } catch(Exception e) {
//            e.printStackTrace();
            result.failed(smh.getLocalString(getClass().getName() + ".exception",
                                             "Error: [ {0} ] exception while loading the archive [ {1} ].",
                                              new Object[] {e, descriptor.getName()}));
            return result;
        }
        
        boolean allPassed = true;
        ClosureCompiler closureCompiler=getVerifierContext().getClosureCompiler();
        ((ClosureCompilerImpl)closureCompiler).addExcludedPattern("org.apache.jasper");
        if(getVerifierContext().isAppserverMode())
        	((ClosureCompilerImpl)closureCompiler).addExcludedPattern("com.sun.enterprise");

        while (entries.hasNext()) {
                String className=(String)entries.next();
                boolean status=closureCompiler.buildClosure(className);
                allPassed=status && allPassed;
        }
        if (allPassed) {
            result.setStatus(Result.PASSED);
            addGoodDetails(result, compName);
            result.passed(smh.getLocalString
                (getClass().getName() + ".passed",
                "All the classes are loadable within [ {0} ] without any linkage error.",
                new Object[] {archiveUri}));
        } else {
            result.setStatus(Result.FAILED);
            addErrorDetails(result, compName);
            result.addErrorDetails(WebArchiveLoadableHelper.getFailedResults(closureCompiler, getVerifierContext().getOutDir()));
            result.addErrorDetails(smh.getLocalString
                    ("com.sun.enterprise.tools.verifier.tests.loadableError",
                    "Please either bundle the above mentioned classes in the application " +
                    "or use optional packaging support for them."));
        }
        return result;
    
private java.util.ListgetClassNames(com.sun.enterprise.deployment.WebBundleDescriptor descriptor)
Looks for Servlet classes, ServletFilter classes, Listener classes and Exception classes in the webBundleDescriptor. The closure is computed starting from these classes.

param
descriptor
return
returns a list of class names in the form that can be used in classloader.load()
throws
Exception

        final List<String> results=new LinkedList<String>();
        for(Object obj : descriptor.getServletDescriptors()) {
            String servletClassName = (WebComponentDescriptor.class.cast(obj))
                    .getWebComponentImplementation();
            results.add(servletClassName);
        }
        
        for (Object obj : descriptor.getServletFilterDescriptors()) {
            String filterClassName = (ServletFilter.class.cast(obj)).getClassName();
            results.add(filterClassName);
        }
        
        for (Object obj : descriptor.getAppListenerDescriptors()) {
            String listenerClassName = (AppListenerDescriptor.class.cast(obj)).getListener();
            results.add(listenerClassName);
        }
        
        results.addAll(getVerifierContext().getFacesConfigDescriptor().getManagedBeanClasses());
        
        Enumeration en = descriptor.getErrorPageDescriptors();
        while (en.hasMoreElements()) {
            ErrorPageDescriptor errorPageDescriptor = (ErrorPageDescriptor) en.nextElement();
            String exceptionType = errorPageDescriptor.getExceptionType();
            if (exceptionType != null && !exceptionType.equals(""))
                results.add(exceptionType);
        }
        
        File file = getVerifierContext().getOutDir();
        if(!file.exists())
            return results;

        FileArchive arch= new FileArchive();
        arch.open(file.getAbsolutePath());
        Enumeration entries = arch.entries();
        while(entries.hasMoreElements()){
            String name=(String)entries.nextElement();
            if(name.startsWith("org/apache/jsp") && name.endsWith(".class"))
                results.add(name.substring(0, name.lastIndexOf(".")).replace('/",'."));
        }
        return results;