Browse Source

reference-usage audit on all classes that extend DataType directly

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@721976 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 16 years ago
parent
commit
cbe9978c14
9 changed files with 316 additions and 79 deletions
  1. +4
    -17
      src/main/org/apache/tools/ant/taskdefs/optional/extension/ExtensionAdapter.java
  2. +36
    -12
      src/main/org/apache/tools/ant/taskdefs/optional/extension/ExtensionSet.java
  3. +2
    -2
      src/main/org/apache/tools/ant/taskdefs/optional/junit/FailureRecorder.java
  4. +69
    -16
      src/main/org/apache/tools/ant/types/AbstractFileSet.java
  5. +36
    -16
      src/main/org/apache/tools/ant/types/AntFilterReader.java
  6. +112
    -10
      src/main/org/apache/tools/ant/types/FilterChain.java
  7. +5
    -0
      src/main/org/apache/tools/ant/types/FilterSet.java
  8. +51
    -3
      src/main/org/apache/tools/ant/types/PropertySet.java
  9. +1
    -3
      src/main/org/apache/tools/ant/types/RedirectorElement.java

+ 4
- 17
src/main/org/apache/tools/ant/taskdefs/optional/extension/ExtensionAdapter.java View File

@@ -160,23 +160,6 @@ public class ExtensionAdapter extends DataType {
|| null != implementationURL) { || null != implementationURL) {
throw tooManyAttributes(); throw tooManyAttributes();
} }
// change this to get the objects from the other reference
Object o = reference.getReferencedObject(getProject());
if (o instanceof ExtensionAdapter) {
final ExtensionAdapter other = (ExtensionAdapter) o;
extensionName = other.extensionName;
specificationVersion = other.specificationVersion;
specificationVendor = other.specificationVendor;
implementationVersion = other.implementationVersion;
implementationVendorID = other.implementationVendorID;
implementationVendor = other.implementationVendor;
implementationURL = other.implementationURL;
} else {
final String message =
reference.getRefId() + " doesn\'t refer to a Extension";
throw new BuildException(message);
}

super.setRefid(reference); super.setRefid(reference);
} }


@@ -194,6 +177,10 @@ public class ExtensionAdapter extends DataType {
*/ */
Extension toExtension() Extension toExtension()
throws BuildException { throws BuildException {
if (isReference()) {
return ((ExtensionAdapter) getCheckedRef()).toExtension();
}
dieOnCircularReference();
if (null == extensionName) { if (null == extensionName) {
final String message = "Extension is missing name."; final String message = "Extension is missing name.";
throw new BuildException(message); throw new BuildException(message);


+ 36
- 12
src/main/org/apache/tools/ant/taskdefs/optional/extension/ExtensionSet.java View File

@@ -19,6 +19,8 @@ package org.apache.tools.ant.taskdefs.optional.extension;


import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Iterator;
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.Project;
import org.apache.tools.ant.types.DataType; import org.apache.tools.ant.types.DataType;
@@ -49,6 +51,10 @@ public class ExtensionSet
* @param extensionAdapter an extension that this library requires. * @param extensionAdapter an extension that this library requires.
*/ */
public void addExtension(final ExtensionAdapter extensionAdapter) { public void addExtension(final ExtensionAdapter extensionAdapter) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
extensions.add(extensionAdapter); extensions.add(extensionAdapter);
} }


@@ -58,6 +64,10 @@ public class ExtensionSet
* @param fileSet a set of files about which extensions data will be extracted. * @param fileSet a set of files about which extensions data will be extracted.
*/ */
public void addLibfileset(final LibFileSet fileSet) { public void addLibfileset(final LibFileSet fileSet) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
extensionsFilesets.add(fileSet); extensionsFilesets.add(fileSet);
} }


@@ -67,6 +77,10 @@ public class ExtensionSet
* @param fileSet a set of files about which extensions data will be extracted. * @param fileSet a set of files about which extensions data will be extracted.
*/ */
public void addFileset(final FileSet fileSet) { public void addFileset(final FileSet fileSet) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
extensionsFilesets.add(fileSet); extensionsFilesets.add(fileSet);
} }


@@ -79,6 +93,10 @@ public class ExtensionSet
*/ */
public Extension[] toExtensions(final Project proj) public Extension[] toExtensions(final Project proj)
throws BuildException { throws BuildException {
if (isReference()) {
return ((ExtensionSet) getCheckedRef()).toExtensions(proj);
}
dieOnCircularReference();
final ArrayList extensionsList = ExtensionUtil.toExtensions(extensions); final ArrayList extensionsList = ExtensionUtil.toExtensions(extensions);
ExtensionUtil.extractExtensions(proj, extensionsList, extensionsFilesets); ExtensionUtil.extractExtensions(proj, extensionsList, extensionsFilesets);
return (Extension[]) extensionsList.toArray(new Extension[extensionsList.size()]); return (Extension[]) extensionsList.toArray(new Extension[extensionsList.size()]);
@@ -99,20 +117,26 @@ public class ExtensionSet
if (!extensions.isEmpty() || !extensionsFilesets.isEmpty()) { if (!extensions.isEmpty() || !extensionsFilesets.isEmpty()) {
throw tooManyAttributes(); throw tooManyAttributes();
} }
// change this to get the objects from the other reference
final Object object =
reference.getReferencedObject(getProject());
if (object instanceof ExtensionSet) {
final ExtensionSet other = (ExtensionSet) object;
extensions.addAll(other.extensions);
extensionsFilesets.addAll(other.extensionsFilesets);
super.setRefid(reference);
}

protected synchronized void dieOnCircularReference(Stack stk, Project p)
throws BuildException {
if (isChecked()) {
return;
}
if (isReference()) {
super.dieOnCircularReference(stk, p);
} else { } else {
final String message =
reference.getRefId() + " doesn\'t refer to a ExtensionSet";
throw new BuildException(message);
for (Iterator i = extensions.iterator(); i.hasNext(); ) {
pushAndInvokeCircularReferenceCheck((ExtensionAdapter) i.next(),
stk, p);
}
for (Iterator i = extensionsFilesets.iterator(); i.hasNext(); ) {
pushAndInvokeCircularReferenceCheck((FileSet) i.next(), stk, p);
}
setChecked(true);
} }

super.setRefid(reference);
} }


/** /**


+ 2
- 2
src/main/org/apache/tools/ant/taskdefs/optional/junit/FailureRecorder.java View File

@@ -36,7 +36,7 @@ import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.BuildListener; import org.apache.tools.ant.BuildListener;
import org.apache.tools.ant.Project; import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.DataType;
import org.apache.tools.ant.ProjectComponent;
import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.util.FileUtils;
/** /**
@@ -67,7 +67,7 @@ import org.apache.tools.ant.util.FileUtils;
* *
* @since Ant 1.8.0 * @since Ant 1.8.0
*/ */
public class FailureRecorder extends DataType implements JUnitResultFormatter, BuildListener {
public class FailureRecorder extends ProjectComponent implements JUnitResultFormatter, BuildListener {
/** /**
* This is the name of a magic System property ({@value}). The value of this * This is the name of a magic System property ({@value}). The value of this


+ 69
- 16
src/main/org/apache/tools/ant/types/AbstractFileSet.java View File

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


import java.io.File; import java.io.File;
import java.util.Vector;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.Iterator;
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.FileScanner; import org.apache.tools.ant.FileScanner;
@@ -147,7 +149,11 @@ public abstract class AbstractFileSet extends DataType
* @return <code>File</code>. * @return <code>File</code>.
*/ */
public synchronized File getDir(Project p) { public synchronized File getDir(Project p) {
return (isReference()) ? getRef(p).getDir(p) : dir;
if (isReference()) {
return getRef(p).getDir(p);
}
dieOnCircularReference();
return dir;
} }


/** /**
@@ -342,8 +348,11 @@ public abstract class AbstractFileSet extends DataType
* @since Ant 1.6.3 * @since Ant 1.6.3
*/ */
public synchronized boolean getDefaultexcludes() { public synchronized boolean getDefaultexcludes() {
return (isReference())
? getRef(getProject()).getDefaultexcludes() : useDefaultExcludes;
if (isReference()) {
return getRef(getProject()).getDefaultexcludes();
}
dieOnCircularReference();
return useDefaultExcludes;
} }


/** /**
@@ -368,8 +377,11 @@ public abstract class AbstractFileSet extends DataType
* @since Ant 1.7 * @since Ant 1.7
*/ */
public synchronized boolean isCaseSensitive() { public synchronized boolean isCaseSensitive() {
return (isReference())
? getRef(getProject()).isCaseSensitive() : caseSensitive;
if (isReference()) {
return getRef(getProject()).isCaseSensitive();
}
dieOnCircularReference();
return caseSensitive;
} }


/** /**
@@ -394,8 +406,11 @@ public abstract class AbstractFileSet extends DataType
* @since Ant 1.6 * @since Ant 1.6
*/ */
public synchronized boolean isFollowSymlinks() { public synchronized boolean isFollowSymlinks() {
return (isReference())
? getRef(getProject()).isFollowSymlinks() : followSymlinks;
if (isReference()) {
return getRef(getProject()).isCaseSensitive();
}
dieOnCircularReference();
return followSymlinks;
} }


/** /**
@@ -435,6 +450,7 @@ public abstract class AbstractFileSet extends DataType
if (isReference()) { if (isReference()) {
return getRef(p).getDirectoryScanner(p); return getRef(p).getDirectoryScanner(p);
} }
dieOnCircularReference();
DirectoryScanner ds = null; DirectoryScanner ds = null;
synchronized (this) { synchronized (this) {
if (directoryScanner != null && p == getProject()) { if (directoryScanner != null && p == getProject()) {
@@ -484,6 +500,7 @@ public abstract class AbstractFileSet extends DataType
getRef(p).setupDirectoryScanner(ds, p); getRef(p).setupDirectoryScanner(ds, p);
return; return;
} }
dieOnCircularReference(p);
if (ds == null) { if (ds == null) {
throw new IllegalArgumentException("ds cannot be null"); throw new IllegalArgumentException("ds cannot be null");
} }
@@ -523,8 +540,11 @@ public abstract class AbstractFileSet extends DataType
* @return whether any selectors are in this container. * @return whether any selectors are in this container.
*/ */
public synchronized boolean hasSelectors() { public synchronized boolean hasSelectors() {
return (isReference() && getProject() != null)
? getRef(getProject()).hasSelectors() : !(selectors.isEmpty());
if (isReference()) {
return getRef(getProject()).hasSelectors();
}
dieOnCircularReference();
return !(selectors.isEmpty());
} }


/** /**
@@ -536,6 +556,7 @@ public abstract class AbstractFileSet extends DataType
if (isReference() && getProject() != null) { if (isReference() && getProject() != null) {
return getRef(getProject()).hasPatterns(); return getRef(getProject()).hasPatterns();
} }
dieOnCircularReference();
if (defaultPatterns.hasPatterns(getProject())) { if (defaultPatterns.hasPatterns(getProject())) {
return true; return true;
} }
@@ -555,8 +576,11 @@ public abstract class AbstractFileSet extends DataType
* @return the number of selectors in this container as an <code>int</code>. * @return the number of selectors in this container as an <code>int</code>.
*/ */
public synchronized int selectorCount() { public synchronized int selectorCount() {
return (isReference() && getProject() != null)
? getRef(getProject()).selectorCount() : selectors.size();
if (isReference()) {
return getRef(getProject()).selectorCount();
}
dieOnCircularReference();
return selectors.size();
} }


/** /**
@@ -565,8 +589,11 @@ public abstract class AbstractFileSet extends DataType
* @return a <code>FileSelector[]</code> of the selectors in this container. * @return a <code>FileSelector[]</code> of the selectors in this container.
*/ */
public synchronized FileSelector[] getSelectors(Project p) { public synchronized FileSelector[] getSelectors(Project p) {
return (isReference())
? getRef(p).getSelectors(p) : (FileSelector[]) (selectors.toArray(
if (isReference()) {
return getRef(getProject()).getSelectors(p);
}
dieOnCircularReference(p);
return (FileSelector[]) (selectors.toArray(
new FileSelector[selectors.size()])); new FileSelector[selectors.size()]));
} }


@@ -576,8 +603,11 @@ public abstract class AbstractFileSet extends DataType
* @return an <code>Enumeration</code> of selectors. * @return an <code>Enumeration</code> of selectors.
*/ */
public synchronized Enumeration selectorElements() { public synchronized Enumeration selectorElements() {
return (isReference() && getProject() != null)
? getRef(getProject()).selectorElements() : selectors.elements();
if (isReference()) {
return getRef(getProject()).selectorElements();
}
dieOnCircularReference();
return selectors.elements();
} }


/** /**
@@ -591,6 +621,7 @@ public abstract class AbstractFileSet extends DataType
} }
selectors.addElement(selector); selectors.addElement(selector);
directoryScanner = null; directoryScanner = null;
setChecked(false);
} }


/* Methods below all add specific selectors */ /* Methods below all add specific selectors */
@@ -763,6 +794,10 @@ public abstract class AbstractFileSet extends DataType
* @return a <code>String</code> of included filenames. * @return a <code>String</code> of included filenames.
*/ */
public String toString() { public String toString() {
if (isReference()) {
return getRef(getProject()).toString();
}
dieOnCircularReference();
DirectoryScanner ds = getDirectoryScanner(getProject()); DirectoryScanner ds = getDirectoryScanner(getProject());
String[] files = ds.getIncludedFiles(); String[] files = ds.getIncludedFiles();
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
@@ -840,6 +875,7 @@ public abstract class AbstractFileSet extends DataType
if (isReference()) { if (isReference()) {
return getRef(p).mergePatterns(p); return getRef(p).mergePatterns(p);
} }
dieOnCircularReference();
PatternSet ps = (PatternSet) defaultPatterns.clone(); PatternSet ps = (PatternSet) defaultPatterns.clone();
final int count = additionalPatterns.size(); final int count = additionalPatterns.size();
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
@@ -849,4 +885,21 @@ public abstract class AbstractFileSet extends DataType
return ps; return ps;
} }


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

+ 36
- 16
src/main/org/apache/tools/ant/types/AntFilterReader.java View File

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


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;


/** /**
* An AntFilterReader is a wrapper class that encloses the classname * An AntFilterReader is a wrapper class that encloses the classname
@@ -39,6 +41,9 @@ public final class AntFilterReader
* @param className a <code>String</code> value * @param className a <code>String</code> value
*/ */
public void setClassName(final String className) { public void setClassName(final String className) {
if (isReference()) {
throw tooManyAttributes();
}
this.className = className; this.className = className;
} }


@@ -48,6 +53,10 @@ public final class AntFilterReader
* @return a <code>String</code> value * @return a <code>String</code> value
*/ */
public String getClassName() { public String getClassName() {
if (isReference()) {
return ((AntFilterReader) getCheckedRef()).getClassName();
}
dieOnCircularReference();
return className; return className;
} }


@@ -57,6 +66,9 @@ public final class AntFilterReader
* @param param a <code>Parameter</code> value * @param param a <code>Parameter</code> value
*/ */
public void addParam(final Parameter param) { public void addParam(final Parameter param) {
if (isReference()) {
throw noChildrenAllowed();
}
parameters.addElement(param); parameters.addElement(param);
} }


@@ -73,6 +85,7 @@ public final class AntFilterReader
} else { } else {
this.classpath.append(classpath); this.classpath.append(classpath);
} }
setChecked(false);
} }


/** /**
@@ -86,6 +99,7 @@ public final class AntFilterReader
if (this.classpath == null) { if (this.classpath == null) {
this.classpath = new Path(getProject()); this.classpath = new Path(getProject());
} }
setChecked(false);
return this.classpath.createPath(); return this.classpath.createPath();
} }


@@ -94,6 +108,10 @@ public final class AntFilterReader
* @return the classpath * @return the classpath
*/ */
public Path getClasspath() { public Path getClasspath() {
if (isReference()) {
((AntFilterReader) getCheckedRef()).getClasspath();
}
dieOnCircularReference();
return classpath; return classpath;
} }


@@ -115,6 +133,10 @@ public final class AntFilterReader
* @return a <code>Parameter[]</code> value * @return a <code>Parameter[]</code> value
*/ */
public Parameter[] getParams() { public Parameter[] getParams() {
if (isReference()) {
((AntFilterReader) getCheckedRef()).getParams();
}
dieOnCircularReference();
Parameter[] params = new Parameter[parameters.size()]; Parameter[] params = new Parameter[parameters.size()];
parameters.copyInto(params); parameters.copyInto(params);
return params; return params;
@@ -135,23 +157,21 @@ public final class AntFilterReader
|| classpath != null) { || classpath != null) {
throw tooManyAttributes(); throw tooManyAttributes();
} }
// change this to get the objects from the other reference
Object o = r.getReferencedObject(getProject());
if (o instanceof AntFilterReader) {
AntFilterReader afr = (AntFilterReader) o;
setClassName(afr.getClassName());
setClasspath(afr.getClasspath());
Parameter[] p = afr.getParams();
if (p != null) {
for (int i = 0; i < p.length; i++) {
addParam(p[i]);
}
}
super.setRefid(r);
}

protected synchronized void dieOnCircularReference(Stack stk, Project p)
throws BuildException {
if (isChecked()) {
return;
}
if (isReference()) {
super.dieOnCircularReference(stk, p);
} else { } else {
String msg = r.getRefId() + " doesn\'t refer to a FilterReader";
throw new BuildException(msg);
if (classpath != null) {
pushAndInvokeCircularReferenceCheck(classpath, stk, p);
}
setChecked(true);
} }

super.setRefid(r);
} }
} }

+ 112
- 10
src/main/org/apache/tools/ant/types/FilterChain.java View File

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


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.filters.ChainableReader; import org.apache.tools.ant.filters.ChainableReader;
import org.apache.tools.ant.filters.ClassConstants; import org.apache.tools.ant.filters.ClassConstants;
import org.apache.tools.ant.filters.EscapeUnicode; import org.apache.tools.ant.filters.EscapeUnicode;
@@ -52,6 +55,10 @@ public class FilterChain extends DataType
* @param filterReader an <code>AntFilterReader</code> value * @param filterReader an <code>AntFilterReader</code> value
*/ */
public void addFilterReader(final AntFilterReader filterReader) { public void addFilterReader(final AntFilterReader filterReader) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(filterReader); filterReaders.addElement(filterReader);
} }


@@ -61,6 +68,10 @@ public class FilterChain extends DataType
* @return a <code>Vector</code> value containing the filters * @return a <code>Vector</code> value containing the filters
*/ */
public Vector getFilterReaders() { public Vector getFilterReaders() {
if (isReference()) {
return ((FilterChain) getCheckedRef()).getFilterReaders();
}
dieOnCircularReference();
return filterReaders; return filterReaders;
} }


@@ -70,6 +81,10 @@ public class FilterChain extends DataType
* @param classConstants a <code>ClassConstants</code> value * @param classConstants a <code>ClassConstants</code> value
*/ */
public void addClassConstants(final ClassConstants classConstants) { public void addClassConstants(final ClassConstants classConstants) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(classConstants); filterReaders.addElement(classConstants);
} }


@@ -79,6 +94,10 @@ public class FilterChain extends DataType
* @param expandProperties an <code>ExpandProperties</code> value * @param expandProperties an <code>ExpandProperties</code> value
*/ */
public void addExpandProperties(final ExpandProperties expandProperties) { public void addExpandProperties(final ExpandProperties expandProperties) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(expandProperties); filterReaders.addElement(expandProperties);
} }


@@ -88,6 +107,10 @@ public class FilterChain extends DataType
* @param headFilter a <code>HeadFilter</code> value * @param headFilter a <code>HeadFilter</code> value
*/ */
public void addHeadFilter(final HeadFilter headFilter) { public void addHeadFilter(final HeadFilter headFilter) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(headFilter); filterReaders.addElement(headFilter);
} }


@@ -97,6 +120,10 @@ public class FilterChain extends DataType
* @param lineContains a <code>LineContains</code> value * @param lineContains a <code>LineContains</code> value
*/ */
public void addLineContains(final LineContains lineContains) { public void addLineContains(final LineContains lineContains) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(lineContains); filterReaders.addElement(lineContains);
} }


@@ -107,6 +134,10 @@ public class FilterChain extends DataType
*/ */
public void addLineContainsRegExp(final LineContainsRegExp public void addLineContainsRegExp(final LineContainsRegExp
lineContainsRegExp) { lineContainsRegExp) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(lineContainsRegExp); filterReaders.addElement(lineContainsRegExp);
} }


@@ -116,6 +147,10 @@ public class FilterChain extends DataType
* @param prefixLines a <code>PrefixLines</code> value * @param prefixLines a <code>PrefixLines</code> value
*/ */
public void addPrefixLines(final PrefixLines prefixLines) { public void addPrefixLines(final PrefixLines prefixLines) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(prefixLines); filterReaders.addElement(prefixLines);
} }


@@ -125,6 +160,10 @@ public class FilterChain extends DataType
* @param replaceTokens a <code>ReplaceTokens</code> value * @param replaceTokens a <code>ReplaceTokens</code> value
*/ */
public void addReplaceTokens(final ReplaceTokens replaceTokens) { public void addReplaceTokens(final ReplaceTokens replaceTokens) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(replaceTokens); filterReaders.addElement(replaceTokens);
} }


@@ -135,6 +174,10 @@ public class FilterChain extends DataType
*/ */
public void addStripJavaComments(final StripJavaComments public void addStripJavaComments(final StripJavaComments
stripJavaComments) { stripJavaComments) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(stripJavaComments); filterReaders.addElement(stripJavaComments);
} }


@@ -145,6 +188,10 @@ public class FilterChain extends DataType
*/ */
public void addStripLineBreaks(final StripLineBreaks public void addStripLineBreaks(final StripLineBreaks
stripLineBreaks) { stripLineBreaks) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(stripLineBreaks); filterReaders.addElement(stripLineBreaks);
} }


@@ -155,6 +202,10 @@ public class FilterChain extends DataType
*/ */
public void addStripLineComments(final StripLineComments public void addStripLineComments(final StripLineComments
stripLineComments) { stripLineComments) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(stripLineComments); filterReaders.addElement(stripLineComments);
} }


@@ -164,6 +215,10 @@ public class FilterChain extends DataType
* @param tabsToSpaces a <code>TabsToSpaces</code> value * @param tabsToSpaces a <code>TabsToSpaces</code> value
*/ */
public void addTabsToSpaces(final TabsToSpaces tabsToSpaces) { public void addTabsToSpaces(final TabsToSpaces tabsToSpaces) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(tabsToSpaces); filterReaders.addElement(tabsToSpaces);
} }


@@ -173,6 +228,10 @@ public class FilterChain extends DataType
* @param tailFilter a <code>TailFilter</code> value * @param tailFilter a <code>TailFilter</code> value
*/ */
public void addTailFilter(final TailFilter tailFilter) { public void addTailFilter(final TailFilter tailFilter) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(tailFilter); filterReaders.addElement(tailFilter);
} }


@@ -183,6 +242,10 @@ public class FilterChain extends DataType
* @since Ant 1.6 * @since Ant 1.6
*/ */
public void addEscapeUnicode(final EscapeUnicode escapeUnicode) { public void addEscapeUnicode(final EscapeUnicode escapeUnicode) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(escapeUnicode); filterReaders.addElement(escapeUnicode);
} }


@@ -193,6 +256,10 @@ public class FilterChain extends DataType
* @since Ant 1.6 * @since Ant 1.6
*/ */
public void addTokenFilter(final TokenFilter tokenFilter) { public void addTokenFilter(final TokenFilter tokenFilter) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(tokenFilter); filterReaders.addElement(tokenFilter);
} }


@@ -203,6 +270,10 @@ public class FilterChain extends DataType
* @since Ant 1.6 * @since Ant 1.6
*/ */
public void addDeleteCharacters(TokenFilter.DeleteCharacters filter) { public void addDeleteCharacters(TokenFilter.DeleteCharacters filter) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(filter); filterReaders.addElement(filter);
} }


@@ -213,6 +284,10 @@ public class FilterChain extends DataType
* @since Ant 1.6 * @since Ant 1.6
*/ */
public void addContainsRegex(TokenFilter.ContainsRegex filter) { public void addContainsRegex(TokenFilter.ContainsRegex filter) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(filter); filterReaders.addElement(filter);
} }


@@ -222,6 +297,10 @@ public class FilterChain extends DataType
* @param filter a <code>TokenFilter.ReplaceRegex</code> value * @param filter a <code>TokenFilter.ReplaceRegex</code> value
*/ */
public void addReplaceRegex(TokenFilter.ReplaceRegex filter) { public void addReplaceRegex(TokenFilter.ReplaceRegex filter) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(filter); filterReaders.addElement(filter);
} }


@@ -232,6 +311,10 @@ public class FilterChain extends DataType
* @since Ant 1.6 * @since Ant 1.6
*/ */
public void addTrim(TokenFilter.Trim filter) { public void addTrim(TokenFilter.Trim filter) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(filter); filterReaders.addElement(filter);
} }


@@ -243,6 +326,10 @@ public class FilterChain extends DataType
*/ */
public void addReplaceString( public void addReplaceString(
TokenFilter.ReplaceString filter) { TokenFilter.ReplaceString filter) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(filter); filterReaders.addElement(filter);
} }


@@ -254,6 +341,10 @@ public class FilterChain extends DataType
*/ */
public void addIgnoreBlank( public void addIgnoreBlank(
TokenFilter.IgnoreBlank filter) { TokenFilter.IgnoreBlank filter) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(filter); filterReaders.addElement(filter);
} }


@@ -272,16 +363,6 @@ public class FilterChain extends DataType
if (!filterReaders.isEmpty()) { if (!filterReaders.isEmpty()) {
throw tooManyAttributes(); throw tooManyAttributes();
} }
// change this to get the objects from the other reference
Object o = r.getReferencedObject(getProject());
if (o instanceof FilterChain) {
FilterChain fc = (FilterChain) o;
filterReaders = fc.getFilterReaders();
} else {
String msg = r.getRefId() + " doesn\'t refer to a FilterChain";
throw new BuildException(msg);
}

super.setRefid(r); super.setRefid(r);
} }


@@ -293,7 +374,28 @@ public class FilterChain extends DataType
*/ */


public void add(ChainableReader filter) { public void add(ChainableReader filter) {
if (isReference()) {
throw noChildrenAllowed();
}
setChecked(false);
filterReaders.addElement(filter); filterReaders.addElement(filter);
} }


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

+ 5
- 0
src/main/org/apache/tools/ant/types/FilterSet.java View File

@@ -218,6 +218,7 @@ public class FilterSet extends DataType implements Cloneable {
if (isReference()) { if (isReference()) {
return getRef().getFilters(); return getRef().getFilters();
} }
dieOnCircularReference();
//silly hack to avoid stack overflow... //silly hack to avoid stack overflow...
if (!readingFiles) { if (!readingFiles) {
readingFiles = true; readingFiles = true;
@@ -245,6 +246,10 @@ public class FilterSet extends DataType implements Cloneable {
* @return The hash of the tokens and values for quick lookup. * @return The hash of the tokens and values for quick lookup.
*/ */
public synchronized Hashtable getFilterHash() { public synchronized Hashtable getFilterHash() {
if (isReference()) {
return getRef().getFilterHash();
}
dieOnCircularReference();
if (filterHash == null) { if (filterHash == null) {
filterHash = new Hashtable(getFilters().size()); filterHash = new Hashtable(getFilters().size());
for (Enumeration e = getFilters().elements(); e.hasMoreElements();) { for (Enumeration e = getFilters().elements(); e.hasMoreElements();) {


+ 51
- 3
src/main/org/apache/tools/ant/types/PropertySet.java View File

@@ -23,6 +23,7 @@ import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.Stack;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Properties; import java.util.Properties;
@@ -181,6 +182,7 @@ public class PropertySet extends DataType implements ResourceCollection {
*/ */
public void addPropertyref(PropertyRef ref) { public void addPropertyref(PropertyRef ref) {
assertNotReference(); assertNotReference();
setChecked(false);
ptyRefs.addElement(ref); ptyRefs.addElement(ref);
} }


@@ -190,6 +192,7 @@ public class PropertySet extends DataType implements ResourceCollection {
*/ */
public void addPropertyset(PropertySet ref) { public void addPropertyset(PropertySet ref) {
assertNotReference(); assertNotReference();
setChecked(false);
setRefs.addElement(ref); setRefs.addElement(ref);
} }


@@ -203,6 +206,7 @@ public class PropertySet extends DataType implements ResourceCollection {
throw new BuildException("Too many <mapper>s!"); throw new BuildException("Too many <mapper>s!");
} }
mapper = new Mapper(getProject()); mapper = new Mapper(getProject());
setChecked(false);
return mapper; return mapper;
} }


@@ -245,7 +249,11 @@ public class PropertySet extends DataType implements ResourceCollection {
* @return true if the property set is to be evalulated each time it is used. * @return true if the property set is to be evalulated each time it is used.
*/ */
public boolean getDynamic() { public boolean getDynamic() {
return isReference() ? getRef().dynamic : dynamic;
if (isReference()) {
return getRef().dynamic;
}
dieOnCircularReference();
return dynamic;
} }


/** /**
@@ -253,7 +261,11 @@ public class PropertySet extends DataType implements ResourceCollection {
* @return the mapper attribute. * @return the mapper attribute.
*/ */
public Mapper getMapper() { public Mapper getMapper() {
return isReference() ? getRef().mapper : mapper;
if (isReference()) {
return getRef().mapper;
}
dieOnCircularReference();
return mapper;
} }


/** /**
@@ -279,6 +291,7 @@ public class PropertySet extends DataType implements ResourceCollection {
if (isReference()) { if (isReference()) {
return getRef().getProperties(); return getRef().getProperties();
} }
dieOnCircularReference();
Set names = null; Set names = null;
Project prj = getProject(); Project prj = getProject();
Hashtable props = Hashtable props =
@@ -343,6 +356,10 @@ public class PropertySet extends DataType implements ResourceCollection {
* avoid needless duplication of the Hashtable during recursion. * avoid needless duplication of the Hashtable during recursion.
*/ */
private void addPropertyNames(Set names, Hashtable properties) { private void addPropertyNames(Set names, Hashtable properties) {
if (isReference()) {
getRef().addPropertyNames(names, properties);
}
dieOnCircularReference();
// Add this PropertySet's property names. // Add this PropertySet's property names.
for (Enumeration e = ptyRefs.elements(); e.hasMoreElements();) { for (Enumeration e = ptyRefs.elements(); e.hasMoreElements();) {
PropertyRef r = (PropertyRef) e.nextElement(); PropertyRef r = (PropertyRef) e.nextElement();
@@ -453,6 +470,10 @@ public class PropertySet extends DataType implements ResourceCollection {
* @return a string rep of this object. * @return a string rep of this object.
*/ */
public String toString() { public String toString() {
if (isReference()) {
return getRef().toString();
}
dieOnCircularReference();
StringBuffer b = new StringBuffer(); StringBuffer b = new StringBuffer();
TreeMap sorted = new TreeMap(getProperties()); TreeMap sorted = new TreeMap(getProperties());
for (Iterator i = sorted.entrySet().iterator(); i.hasNext();) { for (Iterator i = sorted.entrySet().iterator(); i.hasNext();) {
@@ -473,6 +494,10 @@ public class PropertySet extends DataType implements ResourceCollection {
* @since Ant 1.7 * @since Ant 1.7
*/ */
public Iterator iterator() { public Iterator iterator() {
if (isReference()) {
return getRef().iterator();
}
dieOnCircularReference();
final Enumeration e = getProperties().propertyNames(); final Enumeration e = getProperties().propertyNames();
return new Iterator() { return new Iterator() {
public boolean hasNext() { public boolean hasNext() {
@@ -500,7 +525,30 @@ public class PropertySet extends DataType implements ResourceCollection {
* @return whether this is a filesystem-only resource collection. * @return whether this is a filesystem-only resource collection.
*/ */
public boolean isFilesystemOnly() { public boolean isFilesystemOnly() {
return isReference() && getRef().isFilesystemOnly();
if (isReference()) {
return getRef().isFilesystemOnly();
}
dieOnCircularReference();
return false;
}

protected synchronized void dieOnCircularReference(Stack stk, Project p)
throws BuildException {
if (isChecked()) {
return;
}
if (isReference()) {
super.dieOnCircularReference(stk, p);
} else {
if (mapper != null) {
pushAndInvokeCircularReferenceCheck(mapper, stk, p);
}
for (Iterator i = setRefs.iterator(); i.hasNext(); ) {
pushAndInvokeCircularReferenceCheck((PropertySet) i.next(), stk,
p);
}
setChecked(true);
}
} }


} }

+ 1
- 3
src/main/org/apache/tools/ant/types/RedirectorElement.java View File

@@ -592,9 +592,7 @@ public class RedirectorElement extends DataType {
if (v[i] != null) { if (v[i] != null) {
for (Iterator fci = v[i].iterator(); fci.hasNext();) { for (Iterator fci = v[i].iterator(); fci.hasNext();) {
FilterChain fc = (FilterChain) fci.next(); FilterChain fc = (FilterChain) fci.next();
stk.push(fc);
fc.dieOnCircularReference(stk, p);
stk.pop();
pushAndInvokeCircularReferenceCheck(fc, stk, p);
} }
} }
} }


Loading…
Cancel
Save