FileDocCategorySizeDatePackage
AnnotationDetector.javaAPI DocGlassfish v2 API7335Fri May 04 22:31:58 BST 2007com.sun.enterprise.deployment.util

AnnotationDetector

public abstract class AnnotationDetector extends Object
Abstract superclass for specific types of annotation detectors.
author
Qingqing Ouyang
author
tjquinn

Fields Summary
private com.sun.enterprise.deployment.annotation.introspection.ClassFile
classFile
Constructors Summary
public AnnotationDetector()


      
        CustomAnnotationScanner scanner = createAnnotationScanner();
        ConstantPoolInfo poolInfo = new ConstantPoolInfo(scanner);
        classFile.setConstantPoolInfo(poolInfo);
    
Methods Summary
public booleancontainsAnnotation(java.util.jar.JarFile jarFile, java.util.jar.JarEntry entry)

        boolean result = false;
        // check if it contains top level annotations...
        ReadableByteChannel channel = null;
        try {
            channel = Channels.newChannel(jarFile.getInputStream(entry));
            if (channel!=null) {
                result = classFile.containsAnnotation(channel, entry.getSize());
             }
             return result;
        } finally {
            if (channel != null) {
                channel.close();
            }
        }
    
public booleancontainsAnnotation(java.io.File file)

        boolean result = false;
        // check if it contains top level annotations...
        InputStream is = null;
        try {
            is = new BufferedInputStream(new FileInputStream(file));
            ReadableByteChannel channel = Channels.newChannel(is);
            if (channel!=null) {
                result = classFile.containsAnnotation(channel, file.length());
            }
            return result;
        } finally {
            if (is != null) {
                is.close();
            }
        }
    
protected abstract com.sun.enterprise.deployment.annotation.introspection.CustomAnnotationScannercreateAnnotationScanner()
Provides a new annotation scanner, tailored to the particular type of annotation detector the concrete subclass implements.

return
an implementation of CustomAnnotationScanner to be used by the detector

public booleanhasAnnotationInArchive(com.sun.enterprise.deployment.deploy.shared.AbstractArchive archive)

        File file = new File(archive.getArchiveUri());
        if (!file.exists()) {
            throw new FileNotFoundException(archive.getArchiveUri());
        }

        //@@@ note that the two methods could probably be combined into one.
        //The challenge is to find the size of each entry without having to
        //read the entry twice, once for the inputstream, the other for size.
        if (file.isDirectory()) {
            return hasAnnotationInDirectory(archive);
        } else {
            return hasAnnotationInJar(archive);
        }
    
private booleanhasAnnotationInDirectory(com.sun.enterprise.deployment.deploy.shared.AbstractArchive archive)

return
true if the directory contains any of the appropriate type of annotations

        Enumeration entriesEnum = archive.entries();
        while(entriesEnum.hasMoreElements()) {
            String entry = (String) entriesEnum.nextElement();
            if (entry.endsWith(".class")) {
                File file = null;
                int ind = entry.lastIndexOf("/");
                if (ind != -1) {
                    String entryName = entry.substring(ind + 1);
                    String parent = archive.getArchiveUri() + File.separatorChar + 
                                    entry.substring(0, ind);
                    file  = new File(parent.replace('/", File.separatorChar), entryName);
                } else {
                    file = new File(archive.getArchiveUri(), entry);
                }
                if (containsAnnotation(file)) {
                    return true;
                }
            }
        }
        return false;
    
private booleanhasAnnotationInJar(com.sun.enterprise.deployment.deploy.shared.AbstractArchive archive)

return
true if the jar file contains any of the appropriate type of annotations

        JarFile jf = null;
        try {
            jf = new JarFile(new File(archive.getArchiveUri()));
            Enumeration<JarEntry> entriesEnum = jf.entries();
            while(entriesEnum.hasMoreElements()) {
                JarEntry je = entriesEnum.nextElement();
                if (je.getName().endsWith(".class")) {
                    if (containsAnnotation(jf, je)) {
                        return true;
                    }
                }
            }
        } finally {
            if (jf != null) {
                jf.close();
            }
        }
        return false;