conor       00/08/30 07:27:26

  Modified:    src/main/org/apache/tools/ant/taskdefs Javadoc.java
  Log:
  Increase speed of Javadoc task
  
  Submitted by: Glenn McAllister <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.26      +46 -167   
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Javadoc.java
  
  Index: Javadoc.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Javadoc.java,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- Javadoc.java      2000/08/07 13:58:35     1.25
  +++ Javadoc.java      2000/08/30 14:27:25     1.26
  @@ -201,6 +201,7 @@
           }
       }
   
  +    private boolean foundJavaFile = false;
       private Path sourcePath = null;
       private File destDir = null;
       private String sourceFiles = null;
  @@ -797,7 +798,6 @@
        * patterns.
        */
       private void evaluatePackages(Path sourcePath, Vector packages) {
  -        log("Parsing source files for packages", Project.MSG_INFO);
           log("Source path = " + sourcePath.toString(), Project.MSG_VERBOSE);
           log("Packages = " + packages, Project.MSG_VERBOSE);
   
  @@ -805,10 +805,9 @@
           String[] list = sourcePath.list();
           for (int j=0; j<list.length; j++) {
               File source = project.resolveFile(list[j]);
  -            
  -            Hashtable map = mapClasses(source);
  +            Vector foundPackages = findPackages(source);
   
  -            Enumeration e = map.keys();
  +            Enumeration e = foundPackages.elements();
               while (e.hasMoreElements()) {
                   String pack = (String) e.nextElement();
                   for (int i = 0; i < packages.size(); i++) {
  @@ -833,92 +832,7 @@
           return string.startsWith(pattern.substring(0, pattern.length() - 2));
       }
   
  -    /**
  -     * Returns an hashtable of packages linked to the last parsed
  -     * file in that package. This map is use to return a list of unique
  -     * packages as map keys.
  -     */
  -    private Hashtable mapClasses(File path) {
  -        Hashtable map = new Hashtable();
  -
  -        Vector files = new Vector();
  -        getFiles(path, files);
  -
  -        Enumeration e = files.elements();
  -        while (e.hasMoreElements()) {
  -            File file = (File) e.nextElement();
  -            String packageName = getPackageName(file);
  -            if (packageName != null) map.put(packageName, file);
  -        }
  -
  -        return map;
  -    }
  -
  -    /**
  -     * Fills the given vector with files under the given path filtered
  -     * by the given file filter.
  -     */
  -    private void getFiles(File path, Vector list) {
  -        if (!path.exists()) {
  -            throw new BuildException("Path " + path + " does not exist.");
  -        }
  -
  -        String[] files = path.list();
  -        String cwd = path.getPath() + System.getProperty("file.separator");
  -
  -        if (files != null) {
  -            int count = 0;
  -            for (int i = 0; i < files.length; i++) {
  -                File file = new File(cwd + files[i]);
  -                if (file.isDirectory()) {
  -                    getFiles(file, list);
  -                } else if (files[i].endsWith(".java")) {
  -                    count++;
  -                    list.addElement(file);
  -                }
  -            }
  -            if (count > 0) {
  -                log("found " + count + " source files in " + path, 
Project.MSG_VERBOSE);
  -            }
  -        } else {
  -            throw new BuildException("Error occurred during " + path + " 
evaluation.");
  -        }
  -    }
  -
  -    /**
  -     * Return the package name of the given java source file.
  -     * This method performs valid java parsing to figure out the package.
  -     */
  -    private String getPackageName(File file) {
  -        String name = null;
  -
  -        try {
  -            // do not remove the double buffered reader, this is a _major_ 
speed up in this special case!
  -            BufferedReader reader = new BufferedReader(new JavaReader(new 
BufferedReader(new FileReader(file))));
  -            String line;
  -            while (true) {
  -                line = reader.readLine();
  -                if (line == null) {
  -                    log("Could not evaluate package for " + file, 
Project.MSG_WARN);
  -                    return null;
  -                }
  -                if (line.trim().startsWith("package ") ||
  -                    line.trim().startsWith("package\t")) {
  -                    name = line.substring(8, line.indexOf(";")).trim();
  -                    break;
  -                }
  -            }
  -            reader.close();
  -        } catch (Exception e) {
  -            log("Exception " + e + " parsing " + file, Project.MSG_WARN);
  -            return null;
  -        }
  -
  -        log(file + " --> " + name, Project.MSG_VERBOSE);
   
  -        return name;
  -    }
  -
       private class JavadocOutputStream extends LogOutputStream {
           JavadocOutputStream(int level) {
               super(Javadoc.this, level);
  @@ -956,84 +870,49 @@
               }
           }
       }
  -
  -    /**
  -     * This is a java comment and string stripper reader that filters
  -     * these lexical tokens out for purposes of simple Java parsing.
  -     * (if you have more complex Java parsing needs, use a real lexer).
  -     * Since this class heavily relies on the single char read function,
  -     * you are reccomended to make it work on top of a buffered reader.
  -     */
  -    class JavaReader extends FilterReader {
   
  -        public JavaReader(Reader in) {
  -            super(in);
  -        }
  -
  -        public int read() throws IOException {
  -            int c = in.read();
  -            if (c == '/') {
  -                c = in.read();
  -                if (c == '/') {
  -                    while (c != '\n' && c != -1) c = in.read();
  -                } else if (c == '*') {
  -                    while (c != -1) {
  -                        c = in.read();
  -                        if (c == '*') {
  -                            c = in.read();
  -                            while (c == '*' && c != -1) {
  -                                c = in.read();
  -                            }
  -                            
  -                            if (c == '/') {
  -                                c = read();
  -                                break;
  -                            }
  -                        }
  -                    }
  -                }
  -            }
  -            if (c == '"') {
  -                while (c != -1) {
  -                    c = in.read();
  -                    if (c == '\\') {
  -                        c = in.read();
  -                    } else if (c == '"') {
  -                        c = read();
  -                        break;
  -                    }
  -                }
  -            }
  -            if (c == '\'') {
  -                c = in.read();
  -                if (c == '\\') c = in.read();
  -                c = in.read();
  -                c = read();
  -            }
  -            return c;
  -        }
  -
  -        public int read(char cbuf[], int off, int len) throws IOException {
  -            for (int i = 0; i < len; i++) {
  -                int c = read();
  -                if (c == -1) {
  -                    if (i == 0) {
  -                        return -1;
  -                    } else {
  -                        return i;
  -                    }
  -                }
  -                cbuf[off + i] = (char) c;
  -            }
  -            return len;
  -        }
  -
  -        public long skip(long n) throws IOException {
  -            for (long i = 0; i < n; i++) {
  -                if (in.read() == -1) return i;
  -            }
  -            return n;
  -        }
  +    protected Vector findPackages(File srcDir) {
  +     Vector foundPkgs = new Vector();
  +     
  +     if ((srcDir != null) && (srcDir.isDirectory())) {
  +             scan(srcDir, "", foundPkgs);
  +     }
  +     
  +     return foundPkgs;
  +    }
  +
  +    protected void scan(File srcDir, String vpath, Vector pkgs) {
  +     foundJavaFile = false;
  +     File dir = new File(srcDir, vpath);
  +     
  +     if (!dir.isDirectory()) {
  +             return;
  +     }
  +    
  +     String[] files = dir.list(new FilenameFilter () {
  +                     public boolean accept(File dir, String name) {
  +                             if (name.endsWith(".java")) {
  +                                     foundJavaFile = true;
  +                                     return false;
  +                             }
  +                             File d = new File(dir, name);
  +                             if (d.isDirectory()) {
  +                                     return true;
  +                             }
  +                             return false;
  +                     }
  +             });
  +    
  +     if (foundJavaFile) {
  +             String newPkg = vpath.substring(1).replace(File.separatorChar, 
'.');
  +             if (!pkgs.contains(newPkg)) {
  +                     pkgs.add(newPkg);
  +             }
  +     }
  +     
  +     for (int i=0; i<files.length; i++) {
  +             scan(srcDir, vpath + File.separator + files[i], pkgs);
  +     }
  +     return;
       }
  -
   }
  
  
  

Reply via email to