mbenson     2005/02/11 08:27:28

  Modified:    src/main/org/apache/tools/ant/types AbstractFileSet.java
  Log:
  Modified to return a cached DirectoryScanner instance until
  changes are made to the AbstractFileSet.
  
  Revision  Changes    Path
  1.40      +79 -52    
ant/src/main/org/apache/tools/ant/types/AbstractFileSet.java
  
  Index: AbstractFileSet.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/types/AbstractFileSet.java,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- AbstractFileSet.java      4 Feb 2005 23:37:33 -0000       1.39
  +++ AbstractFileSet.java      11 Feb 2005 16:27:28 -0000      1.40
  @@ -66,6 +66,9 @@
       private boolean caseSensitive = true;
       private boolean followSymlinks = true;
   
  +    /* cached DirectoryScanner instance for our own Project only */
  +    private DirectoryScanner directoryScanner = null;
  +
       /**
        * Construct a new <code>AbstractFileSet</code>.
        */
  @@ -113,11 +116,12 @@
        * Sets the base-directory for this instance.
        * @param dir the directory's <code>File</code> instance.
        */
  -    public void setDir(File dir) throws BuildException {
  +    public synchronized void setDir(File dir) throws BuildException {
           if (isReference()) {
               throw tooManyAttributes();
           }
           this.dir = dir;
  +        directoryScanner = null;
       }
   
       /**
  @@ -134,7 +138,7 @@
        *          reference is resolved, if set.
        * @return <code>File</code>.
        */
  -    public File getDir(Project p) {
  +    public synchronized File getDir(Project p) {
           return (isReference()) ? getRef(p).getDir(p) : dir;
       }
   
  @@ -142,12 +146,13 @@
        * Creates a nested patternset.
        * @return <code>PatternSet</code>.
        */
  -    public PatternSet createPatternSet() {
  +    public synchronized PatternSet createPatternSet() {
           if (isReference()) {
               throw noChildrenAllowed();
           }
           PatternSet patterns = new PatternSet();
           additionalPatterns.addElement(patterns);
  +        directoryScanner = null;
           return patterns;
       }
   
  @@ -155,10 +160,11 @@
        * Add a name entry to the include list.
        * @return <code>PatternSet.NameEntry</code>.
        */
  -    public PatternSet.NameEntry createInclude() {
  +    public synchronized PatternSet.NameEntry createInclude() {
           if (isReference()) {
               throw noChildrenAllowed();
           }
  +        directoryScanner = null;
           return defaultPatterns.createInclude();
       }
   
  @@ -166,10 +172,11 @@
        * Add a name entry to the include files list.
        * @return <code>PatternSet.NameEntry</code>.
        */
  -    public PatternSet.NameEntry createIncludesFile() {
  +    public synchronized PatternSet.NameEntry createIncludesFile() {
           if (isReference()) {
               throw noChildrenAllowed();
           }
  +        directoryScanner = null;
           return defaultPatterns.createIncludesFile();
       }
   
  @@ -177,10 +184,11 @@
        * Add a name entry to the exclude list.
        * @return <code>PatternSet.NameEntry</code>.
        */
  -    public PatternSet.NameEntry createExclude() {
  +    public synchronized PatternSet.NameEntry createExclude() {
           if (isReference()) {
               throw noChildrenAllowed();
           }
  +        directoryScanner = null;
           return defaultPatterns.createExclude();
       }
   
  @@ -188,10 +196,11 @@
        * Add a name entry to the excludes files list.
        * @return <code>PatternSet.NameEntry</code>.
        */
  -    public PatternSet.NameEntry createExcludesFile() {
  +    public synchronized PatternSet.NameEntry createExcludesFile() {
           if (isReference()) {
               throw noChildrenAllowed();
           }
  +        directoryScanner = null;
           return defaultPatterns.createExcludesFile();
       }
   
  @@ -216,11 +225,12 @@
        *
        * @param includes the <code>String</code> containing the include 
patterns.
        */
  -    public void setIncludes(String includes) {
  +    public synchronized void setIncludes(String includes) {
           if (isReference()) {
               throw tooManyAttributes();
           }
           defaultPatterns.setIncludes(includes);
  +        directoryScanner = null;
       }
   
       /**
  @@ -230,7 +240,7 @@
        * @param includes array containing the include patterns.
        * @since Ant 1.7
        */
  -    public void appendIncludes(String[] includes) {
  +    public synchronized void appendIncludes(String[] includes) {
           if (isReference()) {
               throw tooManyAttributes();
           }
  @@ -238,6 +248,7 @@
               for (int i = 0; i < includes.length; i++) {
                   defaultPatterns.createInclude().setName(includes[i]);
               }
  +            directoryScanner = null;
           }
       }
   
  @@ -249,11 +260,12 @@
        *
        * @param excludes the <code>String</code> containing the exclude 
patterns.
        */
  -    public void setExcludes(String excludes) {
  +    public synchronized void setExcludes(String excludes) {
           if (isReference()) {
               throw tooManyAttributes();
           }
           defaultPatterns.setExcludes(excludes);
  +        directoryScanner = null;
       }
   
       /**
  @@ -263,7 +275,7 @@
        * @param excludes array containing the exclude patterns.
        * @since Ant 1.7
        */
  -    public void appendExcludes(String[] excludes) {
  +    public synchronized void appendExcludes(String[] excludes) {
           if (isReference()) {
               throw tooManyAttributes();
           }
  @@ -271,6 +283,7 @@
               for (int i = 0; i < excludes.length; i++) {
                   defaultPatterns.createExclude().setName(excludes[i]);
               }
  +            directoryScanner = null;
           }
       }
   
  @@ -279,42 +292,45 @@
        *
        * @param incl <code>File</code> instance.
        */
  -     public void setIncludesfile(File incl) throws BuildException {
  -         if (isReference()) {
  -             throw tooManyAttributes();
  -         }
  -         defaultPatterns.setIncludesfile(incl);
  -     }
  +    public synchronized void setIncludesfile(File incl) throws 
BuildException {
  +        if (isReference()) {
  +            throw tooManyAttributes();
  +        }
  +        defaultPatterns.setIncludesfile(incl);
  +        directoryScanner = null;
  +    }
   
       /**
        * Sets the <code>File</code> containing the excludes patterns.
        *
        * @param excl <code>File</code> instance.
        */
  -     public void setExcludesfile(File excl) throws BuildException {
  -         if (isReference()) {
  -             throw tooManyAttributes();
  -         }
  -         defaultPatterns.setExcludesfile(excl);
  -     }
  +    public synchronized void setExcludesfile(File excl) throws 
BuildException {
  +        if (isReference()) {
  +            throw tooManyAttributes();
  +        }
  +        defaultPatterns.setExcludesfile(excl);
  +        directoryScanner = null;
  +    }
   
       /**
        * Sets whether default exclusions should be used or not.
        *
        * @param useDefaultExcludes <code>boolean</code>.
        */
  -    public void setDefaultexcludes(boolean useDefaultExcludes) {
  +    public synchronized void setDefaultexcludes(boolean useDefaultExcludes) {
           if (isReference()) {
               throw tooManyAttributes();
           }
           this.useDefaultExcludes = useDefaultExcludes;
  +        directoryScanner = null;
       }
   
       /**
        * Whether default exclusions should be used or not.
        * @since Ant 1.7
        */
  -    public boolean getDefaultexcludes() {
  +    public synchronized boolean getDefaultexcludes() {
           return (isReference())
               ? getRef(getProject()).getDefaultexcludes() : useDefaultExcludes;
       }
  @@ -324,11 +340,12 @@
        *
        * @param isCaseSensitive <code>boolean</code>.
        */
  -    public void setCaseSensitive(boolean caseSensitive) {
  +    public synchronized void setCaseSensitive(boolean caseSensitive) {
           if (isReference()) {
               throw tooManyAttributes();
           }
           this.caseSensitive = caseSensitive;
  +        directoryScanner = null;
       }
   
       /**
  @@ -339,7 +356,7 @@
        *
        * @since Ant 1.7
        */
  -    public boolean isCaseSensitive() {
  +    public synchronized boolean isCaseSensitive() {
           return (isReference())
               ? getRef(getProject()).isCaseSensitive() : caseSensitive;
       }
  @@ -349,11 +366,12 @@
        *
        * @param followSymlinks whether or not symbolic links should be 
followed.
        */
  -    public void setFollowSymlinks(boolean followSymlinks) {
  +    public synchronized void setFollowSymlinks(boolean followSymlinks) {
           if (isReference()) {
               throw tooManyAttributes();
           }
           this.followSymlinks = followSymlinks;
  +        directoryScanner = null;
       }
   
       /**
  @@ -364,7 +382,7 @@
        *
        * @since Ant 1.6
        */
  -    public boolean isFollowSymlinks() {
  +    public synchronized boolean isFollowSymlinks() {
           return (isReference())
               ? getRef(getProject()).isFollowSymlinks() : followSymlinks;
       }
  @@ -407,20 +425,29 @@
           if (isReference()) {
               return getRef(p).getDirectoryScanner(p);
           }
  -        if (dir == null) {
  -            throw new BuildException("No directory specified for "
  -                                     + getDataTypeName() + ".");
  -        }
  -        if (!dir.exists()) {
  -            throw new BuildException(dir.getAbsolutePath() + " not found.");
  -        }
  -        if (!dir.isDirectory()) {
  -            throw new BuildException(dir.getAbsolutePath()
  -                                     + " is not a directory.");
  -        }
  -        DirectoryScanner ds = new DirectoryScanner();
  -        setupDirectoryScanner(ds, p);
  -        ds.setFollowSymlinks(followSymlinks);
  +        DirectoryScanner ds = null;
  +        synchronized (this) {
  +            if (directoryScanner != null && p == getProject()) {
  +                ds = directoryScanner;
  +            } else {
  +                if (dir == null) {
  +                    throw new BuildException("No directory specified for "
  +                                             + getDataTypeName() + ".");
  +                }
  +                if (!dir.exists()) {
  +                    throw new BuildException(dir.getAbsolutePath()
  +                                             + " not found.");
  +                }
  +                if (!dir.isDirectory()) {
  +                    throw new BuildException(dir.getAbsolutePath()
  +                                             + " is not a directory.");
  +                }
  +                ds = new DirectoryScanner();
  +                setupDirectoryScanner(ds, p);
  +                ds.setFollowSymlinks(followSymlinks);
  +                directoryScanner = (p == getProject()) ? ds : 
directoryScanner;
  +            }
  +        }
           ds.scan();
           return ds;
       }
  @@ -439,7 +466,7 @@
        * @param ds a <code>FileScanner</code> instance.
        * @param p an Ant <code>Project</code> instance.
        */
  -    public void setupDirectoryScanner(FileScanner ds, Project p) {
  +    public synchronized void setupDirectoryScanner(FileScanner ds, Project 
p) {
           if (isReference()) {
               getRef(p).setupDirectoryScanner(ds, p);
               return;
  @@ -490,7 +517,7 @@
        *
        * @return whether any selectors are in this container.
        */
  -    public boolean hasSelectors() {
  +    public synchronized boolean hasSelectors() {
           return (isReference() && getProject() != null)
               ? getRef(getProject()).hasSelectors() : !(selectors.isEmpty());
       }
  @@ -500,7 +527,7 @@
        *
        * @return whether any patterns are in this container.
        */
  -    public boolean hasPatterns() {
  +    public synchronized boolean hasPatterns() {
           if (isReference() && getProject() != null) {
               return getRef(getProject()).hasPatterns();
           }
  @@ -522,7 +549,7 @@
        *
        * @return the number of selectors in this container as an 
<code>int</code>.
        */
  -    public int selectorCount() {
  +    public synchronized int selectorCount() {
           return (isReference() && getProject() != null)
               ? getRef(getProject()).selectorCount() : selectors.size();
       }
  @@ -532,7 +559,7 @@
        *
        * @return a <code>FileSelector[]</code> of the selectors in this 
container.
        */
  -    public FileSelector[] getSelectors(Project p) {
  +    public synchronized FileSelector[] getSelectors(Project p) {
           return (isReference())
               ? getRef(p).getSelectors(p) : (FileSelector[])(selectors.toArray(
               new FileSelector[selectors.size()]));
  @@ -543,7 +570,7 @@
        *
        * @return an <code>Enumeration</code> of selectors.
        */
  -    public Enumeration selectorElements() {
  +    public synchronized Enumeration selectorElements() {
           return (isReference() && getProject() != null)
               ? getRef(getProject()).selectorElements() : selectors.elements();
       }
  @@ -553,7 +580,7 @@
        *
        * @param selector the new <code>FileSelector</code> to add.
        */
  -    public void appendSelector(FileSelector selector) {
  +    public synchronized void appendSelector(FileSelector selector) {
           if (isReference()) {
               throw noChildrenAllowed();
           }
  @@ -742,7 +769,7 @@
        *
        * @since Ant 1.6
        */
  -    public Object clone() {
  +    public synchronized Object clone() {
           if (isReference()) {
               return (getRef(getProject())).clone();
           } else {
  @@ -789,7 +816,7 @@
        *
        * @since Ant 1.7
        */
  -    public PatternSet mergePatterns(Project p) {
  +    public synchronized PatternSet mergePatterns(Project p) {
           if (isReference()) {
               return getRef(p).mergePatterns(p);
           }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to