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]