diff --git a/src/etc/testcases/taskdefs/tar.xml b/src/etc/testcases/taskdefs/tar.xml
index 2eda0b544..a78572ee9 100644
--- a/src/etc/testcases/taskdefs/tar.xml
+++ b/src/etc/testcases/taskdefs/tar.xml
@@ -172,6 +172,12 @@
+
+
+
+
+
+
extensionsList = ExtensionUtil.toExtensions(extensions);
@@ -141,6 +141,10 @@ public class ExtensionSet
}
}
+ private ExtensionSet getRef() {
+ return getCheckedRef(ExtensionSet.class);
+ }
+
/**
* @see java.lang.Object#toString()
* @return the extensions in a string.
diff --git a/src/main/org/apache/tools/ant/types/AbstractFileSet.java b/src/main/org/apache/tools/ant/types/AbstractFileSet.java
index 6258fa81f..e5cb4a87f 100644
--- a/src/main/org/apache/tools/ant/types/AbstractFileSet.java
+++ b/src/main/org/apache/tools/ant/types/AbstractFileSet.java
@@ -573,11 +573,17 @@ public abstract class AbstractFileSet extends DataType
/**
* Performs the check for circular references and returns the
* referenced FileSet.
+ * This method can overridden together with {@link ArchiveFileSet#getRef() getRef()}
+ * providing implementations containing the special support
+ * for FileSet references, which can be handled by all ArchiveFileSets.
+ * NB! This method must be overridden in subclasses such as FileSet and DirSet
+ * to distinguish between the data types.
+ * @return the dereferenced object.
* @param p the current project
* @return the referenced FileSet
*/
protected AbstractFileSet getRef(Project p) {
- return (AbstractFileSet) getCheckedRef(p);
+ return getCheckedRef(AbstractFileSet.class, getDataTypeName(), p);
}
// SelectorContainer methods
@@ -901,8 +907,7 @@ public abstract class AbstractFileSet extends DataType
return getRef(getProject()).toString();
}
dieOnCircularReference();
- DirectoryScanner ds = getDirectoryScanner(getProject());
- return String.join(";", ds.getIncludedFiles());
+ return String.join(";", getDirectoryScanner().getIncludedFiles());
}
/**
diff --git a/src/main/org/apache/tools/ant/types/AntFilterReader.java b/src/main/org/apache/tools/ant/types/AntFilterReader.java
index 154b86062..b30514930 100644
--- a/src/main/org/apache/tools/ant/types/AntFilterReader.java
+++ b/src/main/org/apache/tools/ant/types/AntFilterReader.java
@@ -55,7 +55,7 @@ public final class AntFilterReader extends DataType {
*/
public String getClassName() {
if (isReference()) {
- return ((AntFilterReader) getCheckedRef()).getClassName();
+ return getRef().getClassName();
}
dieOnCircularReference();
return className;
@@ -110,7 +110,7 @@ public final class AntFilterReader extends DataType {
*/
public Path getClasspath() {
if (isReference()) {
- ((AntFilterReader) getCheckedRef()).getClasspath();
+ getRef().getClasspath();
}
dieOnCircularReference();
return classpath;
@@ -135,7 +135,7 @@ public final class AntFilterReader extends DataType {
*/
public Parameter[] getParams() {
if (isReference()) {
- ((AntFilterReader) getCheckedRef()).getParams();
+ getRef().getParams();
}
dieOnCircularReference();
return parameters.toArray(new Parameter[parameters.size()]);
@@ -173,4 +173,8 @@ public final class AntFilterReader extends DataType {
setChecked(true);
}
}
+
+ private AntFilterReader getRef() {
+ return getCheckedRef(AntFilterReader.class);
+ }
}
diff --git a/src/main/org/apache/tools/ant/types/ArchiveFileSet.java b/src/main/org/apache/tools/ant/types/ArchiveFileSet.java
index eea603ddd..ff2e08d4c 100644
--- a/src/main/org/apache/tools/ant/types/ArchiveFileSet.java
+++ b/src/main/org/apache/tools/ant/types/ArchiveFileSet.java
@@ -189,7 +189,7 @@ public abstract class ArchiveFileSet extends FileSet {
*/
public File getSrc() {
if (isReference()) {
- return ((ArchiveFileSet) getCheckedRef()).getSrc();
+ return getCheckedRef(ArchiveFileSet.class).getSrc();
}
dieOnCircularReference();
if (src == null) {
@@ -201,18 +201,17 @@ public abstract class ArchiveFileSet extends FileSet {
/**
* Performs the check for circular references and returns the
* referenced object.
- * This is an override which does not delegate to the superclass; instead it invokes
- * {@link #getRef(Project)}, because that contains the special support for fileset
- * references, which can be handled by all ArchiveFileSets.
- * @param p the Ant Project instance against which to resolve references.
+ * This method must be overridden together with
+ * {@link AbstractFileSet#getRef(Project) getRef(Project)}
+ * providing implementations containing the special support
+ * for FileSet references, which can be handled by all ArchiveFileSets.
+ * NB! This method cannot be implemented in AbstractFileSet in order to allow
+ * FileSet and DirSet to implement it as a private method.
* @return the dereferenced object.
* @throws BuildException if the reference is invalid (circular ref, wrong class, etc).
- * @since Ant 1.8
*/
- // TODO is the above true? AFAICT the calls look circular :/
- @Override
- protected Object getCheckedRef(Project p) {
- return getRef(p);
+ protected AbstractFileSet getRef() {
+ return getCheckedRef(AbstractFileSet.class);
}
/**
@@ -286,7 +285,7 @@ public abstract class ArchiveFileSet extends FileSet {
*/
public String getEncoding() {
if (isReference()) {
- AbstractFileSet ref = getRef(getProject());
+ AbstractFileSet ref = getRef();
return ref instanceof ArchiveFileSet ? ((ArchiveFileSet) ref).getEncoding() : null;
}
return encoding;
@@ -339,13 +338,12 @@ public abstract class ArchiveFileSet extends FileSet {
@Override
public Iterator iterator() {
if (isReference()) {
- return ((ResourceCollection) (getRef(getProject()))).iterator();
+ return ((ResourceCollection) getRef()).iterator();
}
if (src == null) {
return super.iterator();
}
- ArchiveScanner as = (ArchiveScanner) getDirectoryScanner(getProject());
- return as.getResourceFiles(getProject());
+ return ((ArchiveScanner) getDirectoryScanner()).getResourceFiles(getProject());
}
/**
@@ -356,13 +354,12 @@ public abstract class ArchiveFileSet extends FileSet {
@Override
public int size() {
if (isReference()) {
- return ((ResourceCollection) (getRef(getProject()))).size();
+ return ((ResourceCollection) getRef()).size();
}
if (src == null) {
return super.size();
}
- ArchiveScanner as = (ArchiveScanner) getDirectoryScanner(getProject());
- return as.getIncludedFilesCount();
+ return getDirectoryScanner().getIncludedFilesCount();
}
/**
@@ -376,7 +373,7 @@ public abstract class ArchiveFileSet extends FileSet {
@Override
public boolean isFilesystemOnly() {
if (isReference()) {
- return ((ArchiveFileSet) getCheckedRef()).isFilesystemOnly();
+ return ((ArchiveFileSet) getRef()).isFilesystemOnly();
}
dieOnCircularReference();
return src == null;
@@ -427,7 +424,7 @@ public abstract class ArchiveFileSet extends FileSet {
*/
public boolean hasFileModeBeenSet() {
if (isReference()) {
- return ((ArchiveFileSet) getRef(getProject())).hasFileModeBeenSet();
+ return ((ArchiveFileSet) getRef()).hasFileModeBeenSet();
}
dieOnCircularReference();
return fileModeHasBeenSet;
@@ -478,7 +475,7 @@ public abstract class ArchiveFileSet extends FileSet {
*/
public boolean hasDirModeBeenSet() {
if (isReference()) {
- return ((ArchiveFileSet) getRef(getProject())).hasDirModeBeenSet();
+ return ((ArchiveFileSet) getRef()).hasDirModeBeenSet();
}
dieOnCircularReference();
return dirModeHasBeenSet;
@@ -507,8 +504,7 @@ public abstract class ArchiveFileSet extends FileSet {
@Override
public Object clone() {
if (isReference()) {
- return getCheckedRef(ArchiveFileSet.class, getDataTypeName(),
- getProject()).clone();
+ return getCheckedRef(ArchiveFileSet.class).clone();
}
return super.clone();
}
diff --git a/src/main/org/apache/tools/ant/types/DataType.java b/src/main/org/apache/tools/ant/types/DataType.java
index 6572a394d..a4234a491 100644
--- a/src/main/org/apache/tools/ant/types/DataType.java
+++ b/src/main/org/apache/tools/ant/types/DataType.java
@@ -196,24 +196,44 @@ public abstract class DataType extends ProjectComponent implements Cloneable {
/**
* Performs the check for circular references and returns the
* referenced object.
+ * @param required reference type
* @return the dereferenced object.
* @throws BuildException if the reference is invalid (circular ref, wrong class, etc).
* @since Ant 1.7
+ * @deprecated use getCheckedRef(Class)
*/
- protected Object getCheckedRef() {
+ @Deprecated
+ protected T getCheckedRef() {
return getCheckedRef(getProject());
}
/**
* Performs the check for circular references and returns the
* referenced object.
+ * @param required reference type
+ * @param requiredClass the class that this reference should be a subclass of.
+ * @return the dereferenced object.
+ * @throws BuildException if the reference is invalid (circular ref, wrong class, etc).
+ * @since Ant 1.10.6
+ */
+ protected T getCheckedRef(final Class requiredClass) {
+ return getCheckedRef(requiredClass, getDataTypeName(), getProject());
+ }
+
+ /**
+ * Performs the check for circular references and returns the
+ * referenced object.
+ * @param required reference type
* @param p the Ant Project instance against which to resolve references.
* @return the dereferenced object.
* @throws BuildException if the reference is invalid (circular ref, wrong class, etc).
* @since Ant 1.7
+ * @deprecated use getCheckedRef(Class)
*/
- protected Object getCheckedRef(Project p) {
- return getCheckedRef(getClass(), getDataTypeName(), p);
+ @Deprecated
+ @SuppressWarnings("unchecked")
+ protected T getCheckedRef(Project p) {
+ return getCheckedRef((Class) getClass(), getDataTypeName(), p);
}
/**
@@ -244,16 +264,15 @@ public abstract class DataType extends ProjectComponent implements Cloneable {
* or if project
is null
.
* @since Ant 1.7
*/
- @SuppressWarnings("unchecked")
protected T getCheckedRef(final Class requiredClass,
final String dataTypeName, final Project project) {
if (project == null) {
throw new BuildException("No Project specified");
}
dieOnCircularReference(project);
- Object o = ref.getReferencedObject(project);
+ T o = ref.getReferencedObject(project);
if (requiredClass.isAssignableFrom(o.getClass())) {
- return (T) o;
+ return o;
}
log("Class " + displayName(o.getClass())
+ " is not a subclass of "
diff --git a/src/main/org/apache/tools/ant/types/DirSet.java b/src/main/org/apache/tools/ant/types/DirSet.java
index 855d5c3d4..e9076e8ef 100644
--- a/src/main/org/apache/tools/ant/types/DirSet.java
+++ b/src/main/org/apache/tools/ant/types/DirSet.java
@@ -20,6 +20,7 @@ package org.apache.tools.ant.types;
import java.util.Iterator;
+import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.resources.FileResourceIterator;
/**
@@ -53,7 +54,7 @@ public class DirSet extends AbstractFileSet implements ResourceCollection {
@Override
public Object clone() {
if (isReference()) {
- return getRef(getProject()).clone();
+ return getRef().clone();
}
return super.clone();
}
@@ -66,10 +67,10 @@ public class DirSet extends AbstractFileSet implements ResourceCollection {
@Override
public Iterator iterator() {
if (isReference()) {
- return ((DirSet) getRef(getProject())).iterator();
+ return getRef().iterator();
}
return new FileResourceIterator(getProject(), getDir(getProject()),
- getDirectoryScanner(getProject()).getIncludedDirectories());
+ getDirectoryScanner().getIncludedDirectories());
}
/**
@@ -80,9 +81,9 @@ public class DirSet extends AbstractFileSet implements ResourceCollection {
@Override
public int size() {
if (isReference()) {
- return ((DirSet) getRef(getProject())).size();
+ return getRef().size();
}
- return getDirectoryScanner(getProject()).getIncludedDirsCount();
+ return getDirectoryScanner().getIncludedDirsCount();
}
/**
@@ -102,7 +103,16 @@ public class DirSet extends AbstractFileSet implements ResourceCollection {
*/
@Override
public String toString() {
- return String.join(";", getDirectoryScanner(getProject()).getIncludedDirectories());
+ return String.join(";", getDirectoryScanner().getIncludedDirectories());
+ }
+
+ @Override
+ protected AbstractFileSet getRef(Project p) {
+ return getCheckedRef(DirSet.class, getDataTypeName(), p);
+ }
+
+ private DirSet getRef() {
+ return getCheckedRef(DirSet.class);
}
}
diff --git a/src/main/org/apache/tools/ant/types/FileList.java b/src/main/org/apache/tools/ant/types/FileList.java
index 1461563f1..4f5376684 100644
--- a/src/main/org/apache/tools/ant/types/FileList.java
+++ b/src/main/org/apache/tools/ant/types/FileList.java
@@ -136,16 +136,6 @@ public class FileList extends DataType implements ResourceCollection {
return filenames.toArray(new String[filenames.size()]);
}
- /**
- * Performs the check for circular references and returns the
- * referenced FileList.
- * @param p the current project
- * @return the FileList represented by a referenced filelist.
- */
- protected FileList getRef(Project p) {
- return (FileList) getCheckedRef(p);
- }
-
/**
* Inner class corresponding to the <file> nested element.
*/
@@ -191,7 +181,7 @@ public class FileList extends DataType implements ResourceCollection {
@Override
public Iterator iterator() {
if (isReference()) {
- return getRef(getProject()).iterator();
+ return getRef().iterator();
}
return new FileResourceIterator(getProject(), dir,
filenames.toArray(new String[filenames.size()]));
@@ -205,7 +195,7 @@ public class FileList extends DataType implements ResourceCollection {
@Override
public int size() {
if (isReference()) {
- return getRef(getProject()).size();
+ return getRef().size();
}
return filenames.size();
}
@@ -220,4 +210,12 @@ public class FileList extends DataType implements ResourceCollection {
return true;
}
+ private FileList getRef() {
+ return getCheckedRef(FileList.class);
+ }
+
+ private FileList getRef(Project p) {
+ return getCheckedRef(FileList.class, getDataTypeName(), p);
+ }
+
}
diff --git a/src/main/org/apache/tools/ant/types/FileSet.java b/src/main/org/apache/tools/ant/types/FileSet.java
index 1887a161a..dea99e8d7 100644
--- a/src/main/org/apache/tools/ant/types/FileSet.java
+++ b/src/main/org/apache/tools/ant/types/FileSet.java
@@ -20,6 +20,7 @@ package org.apache.tools.ant.types;
import java.util.Iterator;
+import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.resources.FileResourceIterator;
/**
@@ -52,7 +53,7 @@ public class FileSet extends AbstractFileSet implements ResourceCollection {
@Override
public Object clone() {
if (isReference()) {
- return getRef(getProject()).clone();
+ return getRef().clone();
}
return super.clone();
}
@@ -65,10 +66,10 @@ public class FileSet extends AbstractFileSet implements ResourceCollection {
@Override
public Iterator iterator() {
if (isReference()) {
- return ((FileSet) getRef(getProject())).iterator();
+ return getRef().iterator();
}
return new FileResourceIterator(getProject(), getDir(getProject()),
- getDirectoryScanner(getProject()).getIncludedFiles());
+ getDirectoryScanner().getIncludedFiles());
}
/**
@@ -79,9 +80,9 @@ public class FileSet extends AbstractFileSet implements ResourceCollection {
@Override
public int size() {
if (isReference()) {
- return ((FileSet) getRef(getProject())).size();
+ return getRef().size();
}
- return getDirectoryScanner(getProject()).getIncludedFilesCount();
+ return getDirectoryScanner().getIncludedFilesCount();
}
/**
@@ -94,4 +95,13 @@ public class FileSet extends AbstractFileSet implements ResourceCollection {
return true;
}
+ @Override
+ protected AbstractFileSet getRef(Project p) {
+ return getCheckedRef(FileSet.class, getDataTypeName(), p);
+ }
+
+ private FileSet getRef() {
+ return getCheckedRef(FileSet.class);
+ }
+
}
diff --git a/src/main/org/apache/tools/ant/types/FilterChain.java b/src/main/org/apache/tools/ant/types/FilterChain.java
index ec4d88612..2e74c8c8d 100644
--- a/src/main/org/apache/tools/ant/types/FilterChain.java
+++ b/src/main/org/apache/tools/ant/types/FilterChain.java
@@ -68,7 +68,7 @@ public class FilterChain extends DataType {
*/
public Vector