Browse Source

refid-audit of indirect subclasses of DataType

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@722437 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 16 years ago
parent
commit
a738000aca
16 changed files with 246 additions and 36 deletions
  1. +4
    -0
      src/main/org/apache/tools/ant/types/AbstractFileSet.java
  2. +20
    -4
      src/main/org/apache/tools/ant/types/ArchiveFileSet.java
  3. +4
    -0
      src/main/org/apache/tools/ant/types/PatternSet.java
  4. +21
    -1
      src/main/org/apache/tools/ant/types/optional/depend/ClassfileSet.java
  5. +30
    -2
      src/main/org/apache/tools/ant/types/resources/AbstractClasspathResource.java
  6. +17
    -0
      src/main/org/apache/tools/ant/types/resources/ArchiveResource.java
  7. +16
    -5
      src/main/org/apache/tools/ant/types/resources/FileResource.java
  8. +13
    -16
      src/main/org/apache/tools/ant/types/resources/Files.java
  9. +1
    -1
      src/main/org/apache/tools/ant/types/resources/JavaConstantResource.java
  10. +1
    -0
      src/main/org/apache/tools/ant/types/resources/SizeLimitCollection.java
  11. +5
    -3
      src/main/org/apache/tools/ant/types/resources/Sort.java
  12. +5
    -3
      src/main/org/apache/tools/ant/types/resources/Tokens.java
  13. +19
    -0
      src/main/org/apache/tools/ant/types/resources/comparators/Reverse.java
  14. +60
    -1
      src/main/org/apache/tools/ant/types/selectors/AbstractSelectorContainer.java
  15. +3
    -0
      src/main/org/apache/tools/ant/types/selectors/BaseSelector.java
  16. +27
    -0
      src/main/org/apache/tools/ant/types/selectors/BaseSelectorContainer.java

+ 4
- 0
src/main/org/apache/tools/ant/types/AbstractFileSet.java View File

@@ -899,6 +899,10 @@ public abstract class AbstractFileSet extends DataType
pushAndInvokeCircularReferenceCheck((DataType) o, stk, p); pushAndInvokeCircularReferenceCheck((DataType) o, stk, p);
} }
} }
for (Iterator i = additionalPatterns.iterator(); i.hasNext(); ) {
PatternSet ps = (PatternSet) i.next();
pushAndInvokeCircularReferenceCheck(ps, stk, p);
}
setChecked(true); setChecked(true);
} }
} }


+ 20
- 4
src/main/org/apache/tools/ant/types/ArchiveFileSet.java View File

@@ -183,6 +183,10 @@ public abstract class ArchiveFileSet extends FileSet {
* @return the archive in case the archive is a file, null otherwise. * @return the archive in case the archive is a file, null otherwise.
*/ */
public File getSrc() { public File getSrc() {
if (isReference()) {
return ((ArchiveFileSet) getCheckedRef()).getSrc();
}
dieOnCircularReference();
if (src != null) { if (src != null) {
FileProvider fp = (FileProvider) src.as(FileProvider.class); FileProvider fp = (FileProvider) src.as(FileProvider.class);
if (fp != null) { if (fp != null) {
@@ -215,6 +219,7 @@ public abstract class ArchiveFileSet extends FileSet {
if (isReference()) { if (isReference()) {
return ((ArchiveFileSet) getRef(p)).getPrefix(p); return ((ArchiveFileSet) getRef(p)).getPrefix(p);
} }
dieOnCircularReference(p);
return prefix; return prefix;
} }


@@ -241,6 +246,7 @@ public abstract class ArchiveFileSet extends FileSet {
if (isReference()) { if (isReference()) {
return ((ArchiveFileSet) getRef(p)).getFullpath(p); return ((ArchiveFileSet) getRef(p)).getFullpath(p);
} }
dieOnCircularReference(p);
return fullpath; return fullpath;
} }


@@ -258,10 +264,10 @@ public abstract class ArchiveFileSet extends FileSet {
* @return a directory scanner * @return a directory scanner
*/ */
public DirectoryScanner getDirectoryScanner(Project p) { public DirectoryScanner getDirectoryScanner(Project p) {
dieOnCircularReference();
if (isReference()) { if (isReference()) {
return getRef(p).getDirectoryScanner(p); return getRef(p).getDirectoryScanner(p);
} }
dieOnCircularReference();
if (src == null) { if (src == null) {
return super.getDirectoryScanner(p); return super.getDirectoryScanner(p);
} }
@@ -323,6 +329,10 @@ public abstract class ArchiveFileSet extends FileSet {
* @since Ant 1.7 * @since Ant 1.7
*/ */
public boolean isFilesystemOnly() { public boolean isFilesystemOnly() {
if (isReference()) {
return ((ArchiveFileSet) getCheckedRef()).isFilesystemOnly();
}
dieOnCircularReference();
return src == null; return src == null;
} }


@@ -361,6 +371,7 @@ public abstract class ArchiveFileSet extends FileSet {
if (isReference()) { if (isReference()) {
return ((ArchiveFileSet) getRef(p)).getFileMode(p); return ((ArchiveFileSet) getRef(p)).getFileMode(p);
} }
dieOnCircularReference();
return fileMode; return fileMode;
} }


@@ -372,6 +383,7 @@ public abstract class ArchiveFileSet extends FileSet {
if (isReference()) { if (isReference()) {
return ((ArchiveFileSet) getRef(getProject())).hasFileModeBeenSet(); return ((ArchiveFileSet) getRef(getProject())).hasFileModeBeenSet();
} }
dieOnCircularReference();
return fileModeHasBeenSet; return fileModeHasBeenSet;
} }


@@ -409,6 +421,7 @@ public abstract class ArchiveFileSet extends FileSet {
if (isReference()) { if (isReference()) {
return ((ArchiveFileSet) getRef(p)).getDirMode(p); return ((ArchiveFileSet) getRef(p)).getDirMode(p);
} }
dieOnCircularReference();
return dirMode; return dirMode;
} }


@@ -421,6 +434,7 @@ public abstract class ArchiveFileSet extends FileSet {
if (isReference()) { if (isReference()) {
return ((ArchiveFileSet) getRef(getProject())).hasDirModeBeenSet(); return ((ArchiveFileSet) getRef(getProject())).hasDirModeBeenSet();
} }
dieOnCircularReference();
return dirModeHasBeenSet; return dirModeHasBeenSet;
} }


@@ -521,9 +535,11 @@ public abstract class ArchiveFileSet extends FileSet {
if (isChecked()) { if (isChecked()) {
return; return;
} }
if (isReference()) {
super.dieOnCircularReference(stk, p);
} else {

// takes care of nested selectors
super.dieOnCircularReference(stk, p);

if (!isReference()) {
if (src != null) { if (src != null) {
pushAndInvokeCircularReferenceCheck(src, stk, p); pushAndInvokeCircularReferenceCheck(src, stk, p);
} }


+ 4
- 0
src/main/org/apache/tools/ant/types/PatternSet.java View File

@@ -357,6 +357,7 @@ public class PatternSet extends DataType implements Cloneable {
if (isReference()) { if (isReference()) {
throw new BuildException("Cannot append to a reference"); throw new BuildException("Cannot append to a reference");
} }
dieOnCircularReference(p);
String[] incl = other.getIncludePatterns(p); String[] incl = other.getIncludePatterns(p);
if (incl != null) { if (incl != null) {
for (int i = 0; i < incl.length; i++) { for (int i = 0; i < incl.length; i++) {
@@ -380,6 +381,7 @@ public class PatternSet extends DataType implements Cloneable {
if (isReference()) { if (isReference()) {
return getRef(p).getIncludePatterns(p); return getRef(p).getIncludePatterns(p);
} }
dieOnCircularReference(p);
readFiles(p); readFiles(p);
return makeArray(includeList, p); return makeArray(includeList, p);
} }
@@ -393,6 +395,7 @@ public class PatternSet extends DataType implements Cloneable {
if (isReference()) { if (isReference()) {
return getRef(p).getExcludePatterns(p); return getRef(p).getExcludePatterns(p);
} }
dieOnCircularReference(p);
readFiles(p); readFiles(p);
return makeArray(excludeList, p); return makeArray(excludeList, p);
} }
@@ -407,6 +410,7 @@ public class PatternSet extends DataType implements Cloneable {
if (isReference()) { if (isReference()) {
return getRef(p).hasPatterns(p); return getRef(p).hasPatterns(p);
} }
dieOnCircularReference(p);
return includesFileList.size() > 0 || excludesFileList.size() > 0 return includesFileList.size() > 0 || excludesFileList.size() > 0
|| includeList.size() > 0 || excludeList.size() > 0; || includeList.size() > 0 || excludeList.size() > 0;
} }


+ 21
- 1
src/main/org/apache/tools/ant/types/optional/depend/ClassfileSet.java View File

@@ -17,8 +17,9 @@
*/ */
package org.apache.tools.ant.types.optional.depend; package org.apache.tools.ant.types.optional.depend;


import java.util.Vector;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Stack;
import java.util.Vector;
import org.apache.tools.ant.Project; import org.apache.tools.ant.Project;
import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.FileSet;
@@ -86,6 +87,7 @@ public class ClassfileSet extends FileSet {
*/ */
public void addRootFileset(FileSet rootFileSet) { public void addRootFileset(FileSet rootFileSet) {
rootFileSets.addElement(rootFileSet); rootFileSets.addElement(rootFileSet);
setChecked(false);
} }


/** /**
@@ -118,6 +120,7 @@ public class ClassfileSet extends FileSet {
if (isReference()) { if (isReference()) {
return getRef(p).getDirectoryScanner(p); return getRef(p).getDirectoryScanner(p);
} }
dieOnCircularReference(p);
Vector allRootClasses = (Vector) rootClasses.clone(); Vector allRootClasses = (Vector) rootClasses.clone();
for (Enumeration e = rootFileSets.elements(); e.hasMoreElements();) { for (Enumeration e = rootFileSets.elements(); e.hasMoreElements();) {
FileSet additionalRootSet = (FileSet) e.nextElement(); FileSet additionalRootSet = (FileSet) e.nextElement();
@@ -160,4 +163,21 @@ public class ClassfileSet extends FileSet {
? (ClassfileSet) (getRef(getProject())) : this); ? (ClassfileSet) (getRef(getProject())) : this);
} }


protected synchronized void dieOnCircularReference(Stack stk, Project p) {
if (isChecked()) {
return;
}

// takes care of nested selectors
super.dieOnCircularReference(stk, p);

if (!isReference()) {
for (Enumeration e = rootFileSets.elements();
e.hasMoreElements();) {
FileSet additionalRootSet = (FileSet) e.nextElement();
pushAndInvokeCircularReferenceCheck(additionalRootSet, stk, p);
}
setChecked(true);
}
}
} }

+ 30
- 2
src/main/org/apache/tools/ant/types/resources/AbstractClasspathResource.java View File

@@ -17,6 +17,7 @@
*/ */
package org.apache.tools.ant.types.resources; package org.apache.tools.ant.types.resources;


import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.Resource; import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.Path; import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference; import org.apache.tools.ant.types.Reference;
@@ -24,6 +25,7 @@ import org.apache.tools.ant.util.FileUtils;


import java.io.InputStream; import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Stack;


/** /**
* *
@@ -48,6 +50,7 @@ public abstract class AbstractClasspathResource extends Resource {
} else { } else {
this.classpath.append(classpath); this.classpath.append(classpath);
} }
setChecked(false);
} }


/** /**
@@ -59,6 +62,7 @@ public abstract class AbstractClasspathResource extends Resource {
if (classpath == null) { if (classpath == null) {
classpath = new Path(getProject()); classpath = new Path(getProject());
} }
setChecked(false);
return classpath.createPath(); return classpath.createPath();
} }


@@ -77,8 +81,11 @@ public abstract class AbstractClasspathResource extends Resource {
* @return The classpath * @return The classpath
*/ */
public Path getClasspath() { public Path getClasspath() {
return isReference()
? ((JavaResource) getCheckedRef()).getClasspath() : classpath;
if (isReference()) {
return ((AbstractClasspathResource) getCheckedRef()).getClasspath();
}
dieOnCircularReference();
return classpath;
} }


/** /**
@@ -86,6 +93,10 @@ public abstract class AbstractClasspathResource extends Resource {
* @return the loader. * @return the loader.
*/ */
public Reference getLoader() { public Reference getLoader() {
if (isReference()) {
return ((AbstractClasspathResource) getCheckedRef()).getLoader();
}
dieOnCircularReference();
return loader; return loader;
} }


@@ -125,6 +136,7 @@ public abstract class AbstractClasspathResource extends Resource {
if (isReference()) { if (isReference()) {
return ((Resource) getCheckedRef()).isExists(); return ((Resource) getCheckedRef()).isExists();
} }
dieOnCircularReference();
InputStream is = null; InputStream is = null;
try { try {
is = getInputStream(); is = getInputStream();
@@ -145,6 +157,7 @@ public abstract class AbstractClasspathResource extends Resource {
if (isReference()) { if (isReference()) {
return ((Resource) getCheckedRef()).getInputStream(); return ((Resource) getCheckedRef()).getInputStream();
} }
dieOnCircularReference();
ClassLoader cl = null; ClassLoader cl = null;
if (loader != null) { if (loader != null) {
cl = (ClassLoader) loader.getReferencedObject(); cl = (ClassLoader) loader.getReferencedObject();
@@ -170,4 +183,19 @@ public abstract class AbstractClasspathResource extends Resource {
* @throws IOException if an error occurs. * @throws IOException if an error occurs.
*/ */
protected abstract InputStream openInputStream(ClassLoader cl) throws IOException; protected abstract InputStream openInputStream(ClassLoader cl) throws IOException;

protected synchronized void dieOnCircularReference(Stack stk, Project p) {
if (isChecked()) {
return;
}
if (isReference()) {
super.dieOnCircularReference(stk, p);
} else {
if (classpath != null) {
pushAndInvokeCircularReferenceCheck(classpath, stk, p);
}
setChecked(true);
}
}

} }

+ 17
- 0
src/main/org/apache/tools/ant/types/resources/ArchiveResource.java View File

@@ -18,8 +18,10 @@
package org.apache.tools.ant.types.resources; package org.apache.tools.ant.types.resources;


import java.io.File; import java.io.File;
import java.util.Stack;


import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.Resource; import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.ResourceCollection; import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.Reference; import org.apache.tools.ant.types.Reference;
@@ -241,6 +243,7 @@ public abstract class ArchiveResource extends Resource {
} }


private synchronized void checkEntry() throws BuildException { private synchronized void checkEntry() throws BuildException {
dieOnCircularReference();
if (haveEntry) { if (haveEntry) {
return; return;
} }
@@ -266,4 +269,18 @@ public abstract class ArchiveResource extends Resource {
* fetches information from the named entry inside the archive. * fetches information from the named entry inside the archive.
*/ */
protected abstract void fetchEntry(); protected abstract void fetchEntry();

protected synchronized void dieOnCircularReference(Stack stk, Project p) {
if (isChecked()) {
return;
}
if (isReference()) {
super.dieOnCircularReference(stk, p);
} else {
if (archive != null) {
pushAndInvokeCircularReferenceCheck(archive, stk, p);
}
setChecked(true);
}
}
} }

+ 16
- 5
src/main/org/apache/tools/ant/types/resources/FileResource.java View File

@@ -104,7 +104,11 @@ public class FileResource extends Resource implements Touchable, FileProvider,
* @return the File. * @return the File.
*/ */
public File getFile() { public File getFile() {
return isReference() ? ((FileResource) getCheckedRef()).getFile() : file;
if (isReference()) {
return ((FileResource) getCheckedRef()).getFile();
}
dieOnCircularReference();
return file;
} }


/** /**
@@ -121,8 +125,11 @@ public class FileResource extends Resource implements Touchable, FileProvider,
* @return the basedir as File. * @return the basedir as File.
*/ */
public File getBaseDir() { public File getBaseDir() {
return isReference()
? ((FileResource) getCheckedRef()).getBaseDir() : baseDir;
if (isReference()) {
return ((FileResource) getCheckedRef()).getBaseDir();
}
dieOnCircularReference();
return baseDir;
} }


/** /**
@@ -322,8 +329,11 @@ public class FileResource extends Resource implements Touchable, FileProvider,
* @return whether this Resource is a FileResource. * @return whether this Resource is a FileResource.
*/ */
public boolean isFilesystemOnly() { public boolean isFilesystemOnly() {
return !isReference()
|| ((FileResource) getCheckedRef()).isFilesystemOnly();
if (isReference()) {
return ((FileResource) getCheckedRef()).isFilesystemOnly();
}
dieOnCircularReference();
return true;
} }


/** /**
@@ -347,6 +357,7 @@ public class FileResource extends Resource implements Touchable, FileProvider,
if (getFile() == null) { if (getFile() == null) {
throw new BuildException("file attribute is null!"); throw new BuildException("file attribute is null!");
} }
dieOnCircularReference();
return getFile(); return getFile();
} }




+ 13
- 16
src/main/org/apache/tools/ant/types/resources/Files.java View File

@@ -36,14 +36,13 @@ import org.apache.tools.ant.types.selectors.AbstractSelectorContainer;
* @since Ant 1.7 * @since Ant 1.7
*/ */
public class Files extends AbstractSelectorContainer public class Files extends AbstractSelectorContainer
implements Cloneable, ResourceCollection {
implements ResourceCollection {


private static final Iterator EMPTY_ITERATOR private static final Iterator EMPTY_ITERATOR
= Collections.EMPTY_SET.iterator(); = Collections.EMPTY_SET.iterator();


private PatternSet defaultPatterns = new PatternSet(); private PatternSet defaultPatterns = new PatternSet();
private Vector additionalPatterns = new Vector(); private Vector additionalPatterns = new Vector();
private Vector selectors = new Vector();


private boolean useDefaultExcludes = true; private boolean useDefaultExcludes = true;
private boolean caseSensitive = true; private boolean caseSensitive = true;
@@ -67,7 +66,6 @@ public class Files extends AbstractSelectorContainer
protected Files(Files f) { protected Files(Files f) {
this.defaultPatterns = f.defaultPatterns; this.defaultPatterns = f.defaultPatterns;
this.additionalPatterns = f.additionalPatterns; this.additionalPatterns = f.additionalPatterns;
this.selectors = f.selectors;
this.useDefaultExcludes = f.useDefaultExcludes; this.useDefaultExcludes = f.useDefaultExcludes;
this.caseSensitive = f.caseSensitive; this.caseSensitive = f.caseSensitive;
this.followSymlinks = f.followSymlinks; this.followSymlinks = f.followSymlinks;
@@ -90,7 +88,7 @@ public class Files extends AbstractSelectorContainer
if (!additionalPatterns.isEmpty()) { if (!additionalPatterns.isEmpty()) {
throw noChildrenAllowed(); throw noChildrenAllowed();
} }
if (!selectors.isEmpty()) {
if (hasSelectors()) {
throw noChildrenAllowed(); throw noChildrenAllowed();
} }
super.setRefid(r); super.setRefid(r);
@@ -107,6 +105,7 @@ public class Files extends AbstractSelectorContainer
PatternSet patterns = new PatternSet(); PatternSet patterns = new PatternSet();
additionalPatterns.addElement(patterns); additionalPatterns.addElement(patterns);
ds = null; ds = null;
setChecked(false);
return patterns; return patterns;
} }


@@ -353,6 +352,7 @@ public class Files extends AbstractSelectorContainer
if (isReference()) { if (isReference()) {
return getRef().hasPatterns(); return getRef().hasPatterns();
} }
dieOnCircularReference();
if (hasPatterns(defaultPatterns)) { if (hasPatterns(defaultPatterns)) {
return true; return true;
} }
@@ -408,19 +408,14 @@ public class Files extends AbstractSelectorContainer
if (isReference()) { if (isReference()) {
return getRef().clone(); return getRef().clone();
} }
try {
Files f = (Files) super.clone();
f.defaultPatterns = (PatternSet) defaultPatterns.clone();
f.additionalPatterns = new Vector(additionalPatterns.size());
for (Iterator iter = additionalPatterns.iterator(); iter.hasNext();) {
PatternSet ps = (PatternSet) iter.next();
f.additionalPatterns.add(ps.clone());
}
f.selectors = new Vector(selectors);
return f;
} catch (CloneNotSupportedException e) {
throw new BuildException(e);
Files f = (Files) super.clone();
f.defaultPatterns = (PatternSet) defaultPatterns.clone();
f.additionalPatterns = new Vector(additionalPatterns.size());
for (Iterator iter = additionalPatterns.iterator(); iter.hasNext();) {
PatternSet ps = (PatternSet) iter.next();
f.additionalPatterns.add(ps.clone());
} }
return f;
} }


/** /**
@@ -453,6 +448,7 @@ public class Files extends AbstractSelectorContainer
if (isReference()) { if (isReference()) {
return getRef().mergePatterns(p); return getRef().mergePatterns(p);
} }
dieOnCircularReference();
PatternSet ps = new PatternSet(); PatternSet ps = new PatternSet();
ps.append(defaultPatterns, p); ps.append(defaultPatterns, p);
final int count = additionalPatterns.size(); final int count = additionalPatterns.size();
@@ -482,6 +478,7 @@ public class Files extends AbstractSelectorContainer
} }


private synchronized void ensureDirectoryScannerSetup() { private synchronized void ensureDirectoryScannerSetup() {
dieOnCircularReference();
if (ds == null) { if (ds == null) {
ds = new DirectoryScanner(); ds = new DirectoryScanner();
PatternSet ps = mergePatterns(getProject()); PatternSet ps = mergePatterns(getProject());


+ 1
- 1
src/main/org/apache/tools/ant/types/resources/JavaConstantResource.java View File

@@ -31,7 +31,7 @@ import java.lang.reflect.Field;


public class JavaConstantResource extends AbstractClasspathResource { public class JavaConstantResource extends AbstractClasspathResource {
/** /**
* open the inpout stream from a specific classloader
* open the input stream from a specific classloader
* *
* @param cl the classloader to use. Will be null if the system classloader is used * @param cl the classloader to use. Will be null if the system classloader is used
* @return an open input stream for the resource * @return an open input stream for the resource


+ 1
- 0
src/main/org/apache/tools/ant/types/resources/SizeLimitCollection.java View File

@@ -34,6 +34,7 @@ public abstract class SizeLimitCollection extends BaseResourceCollectionWrapper
* @param i the count as <code>int</count>. * @param i the count as <code>int</count>.
*/ */
public synchronized void setCount(int i) { public synchronized void setCount(int i) {
checkAttributesAllowed();
count = i; count = i;
} }




+ 5
- 3
src/main/org/apache/tools/ant/types/resources/Sort.java View File

@@ -141,9 +141,11 @@ public class Sort extends BaseResourceCollectionWrapper {
if (isChecked()) { if (isChecked()) {
return; return;
} }
if (isReference()) {
super.dieOnCircularReference(stk, p);
} else {
// check nested collection
super.dieOnCircularReference(stk, p);

if (!isReference()) {
DataType.pushAndInvokeCircularReferenceCheck(comp, stk, p); DataType.pushAndInvokeCircularReferenceCheck(comp, stk, p);
setChecked(true); setChecked(true);
} }


+ 5
- 3
src/main/org/apache/tools/ant/types/resources/Tokens.java View File

@@ -117,9 +117,11 @@ public class Tokens extends BaseResourceCollectionWrapper {
if (isChecked()) { if (isChecked()) {
return; return;
} }
if (isReference()) {
super.dieOnCircularReference(stk, p);
} else {

// check nested collection
super.dieOnCircularReference(stk, p);

if (!isReference()) {
if (tokenizer instanceof DataType) { if (tokenizer instanceof DataType) {
pushAndInvokeCircularReferenceCheck((DataType) tokenizer, stk, pushAndInvokeCircularReferenceCheck((DataType) tokenizer, stk,
p); p);


+ 19
- 0
src/main/org/apache/tools/ant/types/resources/comparators/Reverse.java View File

@@ -17,7 +17,10 @@
*/ */
package org.apache.tools.ant.types.resources.comparators; package org.apache.tools.ant.types.resources.comparators;


import java.util.Stack;
import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.DataType;
import org.apache.tools.ant.types.Resource; import org.apache.tools.ant.types.Resource;


/** /**
@@ -54,6 +57,7 @@ public class Reverse extends ResourceComparator {
throw new BuildException(ONE_NESTED); throw new BuildException(ONE_NESTED);
} }
nested = c; nested = c;
setChecked(false);
} }


/** /**
@@ -68,4 +72,19 @@ public class Reverse extends ResourceComparator {
? foo.compareTo(bar) : nested.compare(foo, bar)); ? foo.compareTo(bar) : nested.compare(foo, bar));
} }


protected void dieOnCircularReference(Stack stk, Project p)
throws BuildException {
if (isChecked()) {
return;
}
if (isReference()) {
super.dieOnCircularReference(stk, p);
} else {
if (nested instanceof DataType) {
pushAndInvokeCircularReferenceCheck((DataType) nested, stk,
p);
}
setChecked(true);
}
}
} }

+ 60
- 1
src/main/org/apache/tools/ant/types/selectors/AbstractSelectorContainer.java View File

@@ -19,8 +19,11 @@
package org.apache.tools.ant.types.selectors; package org.apache.tools.ant.types.selectors;


import java.util.Enumeration; import java.util.Enumeration;
import java.util.Iterator;
import java.util.Stack;
import java.util.Vector; import java.util.Vector;


import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project; import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.DataType; import org.apache.tools.ant.types.DataType;
import org.apache.tools.ant.types.selectors.modifiedselector.ModifiedSelector; import org.apache.tools.ant.types.selectors.modifiedselector.ModifiedSelector;
@@ -32,7 +35,7 @@ import org.apache.tools.ant.types.selectors.modifiedselector.ModifiedSelector;
* @since 1.7 * @since 1.7
*/ */
public abstract class AbstractSelectorContainer extends DataType public abstract class AbstractSelectorContainer extends DataType
implements SelectorContainer {
implements Cloneable, SelectorContainer {


private Vector selectorsList = new Vector(); private Vector selectorsList = new Vector();


@@ -41,6 +44,10 @@ public abstract class AbstractSelectorContainer extends DataType
* @return true if there are selectors * @return true if there are selectors
*/ */
public boolean hasSelectors() { public boolean hasSelectors() {
if (isReference()) {
return ((AbstractSelectorContainer) getCheckedRef()).hasSelectors();
}
dieOnCircularReference();
return !(selectorsList.isEmpty()); return !(selectorsList.isEmpty());
} }


@@ -49,6 +56,10 @@ public abstract class AbstractSelectorContainer extends DataType
* @return the number of selectors * @return the number of selectors
*/ */
public int selectorCount() { public int selectorCount() {
if (isReference()) {
return ((AbstractSelectorContainer) getCheckedRef()).selectorCount();
}
dieOnCircularReference();
return selectorsList.size(); return selectorsList.size();
} }


@@ -58,6 +69,11 @@ public abstract class AbstractSelectorContainer extends DataType
* @return an array of selectors * @return an array of selectors
*/ */
public FileSelector[] getSelectors(Project p) { public FileSelector[] getSelectors(Project p) {
if (isReference()) {
return ((AbstractSelectorContainer) getCheckedRef(p))
.getSelectors(p);
}
dieOnCircularReference(p);
FileSelector[] result = new FileSelector[selectorsList.size()]; FileSelector[] result = new FileSelector[selectorsList.size()];
selectorsList.copyInto(result); selectorsList.copyInto(result);
return result; return result;
@@ -68,6 +84,11 @@ public abstract class AbstractSelectorContainer extends DataType
* @return an enumerator for the selectors * @return an enumerator for the selectors
*/ */
public Enumeration selectorElements() { public Enumeration selectorElements() {
if (isReference()) {
return ((AbstractSelectorContainer) getCheckedRef())
.selectorElements();
}
dieOnCircularReference();
return selectorsList.elements(); return selectorsList.elements();
} }


@@ -99,7 +120,11 @@ public abstract class AbstractSelectorContainer extends DataType
* @param selector the new selector to add * @param selector the new selector to add
*/ */
public void appendSelector(FileSelector selector) { public void appendSelector(FileSelector selector) {
if (isReference()) {
throw noChildrenAllowed();
}
selectorsList.addElement(selector); selectorsList.addElement(selector);
setChecked(false);
} }


/** /**
@@ -119,6 +144,10 @@ public abstract class AbstractSelectorContainer extends DataType
* </ul> * </ul>
*/ */
public void validate() { public void validate() {
if (isReference()) {
((AbstractSelectorContainer) getCheckedRef()).validate();
}
dieOnCircularReference();
Enumeration e = selectorElements(); Enumeration e = selectorElements();
while (e.hasMoreElements()) { while (e.hasMoreElements()) {
Object o = e.nextElement(); Object o = e.nextElement();
@@ -293,4 +322,34 @@ public abstract class AbstractSelectorContainer extends DataType
appendSelector(selector); appendSelector(selector);
} }


protected synchronized void dieOnCircularReference(Stack stk, Project p) {
if (isChecked()) {
return;
}
if (isReference()) {
super.dieOnCircularReference(stk, p);
} else {
for (Iterator i = selectorsList.iterator(); i.hasNext(); ) {
Object o = i.next();
if (o instanceof DataType) {
pushAndInvokeCircularReferenceCheck((DataType) o, stk, p);
}
}
setChecked(true);
}
}

public synchronized Object clone() {
if (isReference()) {
return ((AbstractSelectorContainer) getCheckedRef()).clone();
}
try {
AbstractSelectorContainer sc =
(AbstractSelectorContainer) super.clone();
sc.selectorsList = new Vector(selectorsList);
return sc;
} catch (CloneNotSupportedException e) {
throw new BuildException(e);
}
}
} }

+ 3
- 0
src/main/org/apache/tools/ant/types/selectors/BaseSelector.java View File

@@ -89,6 +89,9 @@ public abstract class BaseSelector extends DataType implements FileSelector {
if (getError() != null) { if (getError() != null) {
throw new BuildException(errmsg); throw new BuildException(errmsg);
} }
if (!isReference()) {
dieOnCircularReference();
}
} }


/** /**


+ 27
- 0
src/main/org/apache/tools/ant/types/selectors/BaseSelectorContainer.java View File

@@ -20,10 +20,13 @@ package org.apache.tools.ant.types.selectors;


import java.io.File; import java.io.File;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Iterator;
import java.util.Stack;
import java.util.Vector; import java.util.Vector;


import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project; import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.DataType;
import org.apache.tools.ant.types.selectors.modifiedselector.ModifiedSelector; import org.apache.tools.ant.types.selectors.modifiedselector.ModifiedSelector;


/** /**
@@ -47,6 +50,7 @@ public abstract class BaseSelectorContainer extends BaseSelector
* @return true if there are selectors * @return true if there are selectors
*/ */
public boolean hasSelectors() { public boolean hasSelectors() {
dieOnCircularReference();
return !(selectorsList.isEmpty()); return !(selectorsList.isEmpty());
} }


@@ -55,6 +59,7 @@ public abstract class BaseSelectorContainer extends BaseSelector
* @return the number of selectors * @return the number of selectors
*/ */
public int selectorCount() { public int selectorCount() {
dieOnCircularReference();
return selectorsList.size(); return selectorsList.size();
} }


@@ -64,6 +69,7 @@ public abstract class BaseSelectorContainer extends BaseSelector
* @return an array of selectors * @return an array of selectors
*/ */
public FileSelector[] getSelectors(Project p) { public FileSelector[] getSelectors(Project p) {
dieOnCircularReference();
FileSelector[] result = new FileSelector[selectorsList.size()]; FileSelector[] result = new FileSelector[selectorsList.size()];
selectorsList.copyInto(result); selectorsList.copyInto(result);
return result; return result;
@@ -74,6 +80,7 @@ public abstract class BaseSelectorContainer extends BaseSelector
* @return an enumerator for the selectors * @return an enumerator for the selectors
*/ */
public Enumeration selectorElements() { public Enumeration selectorElements() {
dieOnCircularReference();
return selectorsList.elements(); return selectorsList.elements();
} }


@@ -85,6 +92,7 @@ public abstract class BaseSelectorContainer extends BaseSelector
* @return comma separated list of Selectors contained in this one * @return comma separated list of Selectors contained in this one
*/ */
public String toString() { public String toString() {
dieOnCircularReference();
StringBuffer buf = new StringBuffer(); StringBuffer buf = new StringBuffer();
Enumeration e = selectorElements(); Enumeration e = selectorElements();
if (e.hasMoreElements()) { if (e.hasMoreElements()) {
@@ -106,6 +114,7 @@ public abstract class BaseSelectorContainer extends BaseSelector
*/ */
public void appendSelector(FileSelector selector) { public void appendSelector(FileSelector selector) {
selectorsList.addElement(selector); selectorsList.addElement(selector);
setChecked(false);
} }


/** /**
@@ -126,6 +135,7 @@ public abstract class BaseSelectorContainer extends BaseSelector
*/ */
public void validate() { public void validate() {
verifySettings(); verifySettings();
dieOnCircularReference();
String errmsg = getError(); String errmsg = getError();
if (errmsg != null) { if (errmsg != null) {
throw new BuildException(errmsg); throw new BuildException(errmsg);
@@ -318,4 +328,21 @@ public abstract class BaseSelectorContainer extends BaseSelector
appendSelector(selector); appendSelector(selector);
} }


protected synchronized void dieOnCircularReference(Stack stk, Project p)
throws BuildException {
if (isChecked()) {
return;
}
if (isReference()) {
super.dieOnCircularReference(stk, p);
} else {
for (Iterator i = selectorsList.iterator(); i.hasNext();) {
Object o = i.next();
if (o instanceof DataType) {
pushAndInvokeCircularReferenceCheck((DataType) o, stk, p);
}
}
setChecked(true);
}
}
} }

Loading…
Cancel
Save