blob: f01636e2a5983bc6cd5e6dba61b892deb43fdf9e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.types;
import java.io.File;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.Iterator;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.resources.FileResourceIterator;
/**
* FileList represents an explicitly named list of files. FileLists
* are useful when you want to capture a list of files regardless of
* whether they currently exist. By contrast, FileSet operates as a
* filter, only returning the name of a matched file if it currently
* exists in the file system.
*/
public class FileList extends DataType implements ResourceCollection {
private Vector filenames = new Vector();
private File dir;
/**
* The default constructor.
*
*/
public FileList() {
super();
}
/**
* A copy constructor.
*
* @param filelist a <code>FileList</code> value
*/
protected FileList(FileList filelist) {
this.dir = filelist.dir;
this.filenames = filelist.filenames;
setProject(filelist.getProject());
}
/**
* Makes this instance in effect a reference to another FileList
* instance.
*
* <p>You must not set another attribute or nest elements inside
* this element if you make it a reference.</p>
* @param r the reference to another filelist.
* @exception BuildException if an error occurs.
*/
public void setRefid(Reference r) throws BuildException {
if ((dir != null) || (filenames.size() != 0)) {
throw tooManyAttributes();
}
super.setRefid(r);
}
/**
* Set the dir attribute.
*
* @param dir the directory this filelist is relative to.
* @exception BuildException if an error occurs
*/
public void setDir(File dir) throws BuildException {
checkAttributesAllowed();
this.dir = dir;
}
/**
* @param p the current project
* @return the directory attribute
*/
public File getDir(Project p) {
if (isReference()) {
return getRef(p).getDir(p);
}
return dir;
}
/**
* Set the filenames attribute.
*
* @param filenames a string contains filenames, separated by , or
* by whitespace.
*/
public void setFiles(String filenames) {
checkAttributesAllowed();
if (filenames != null && filenames.length() > 0) {
StringTokenizer tok = new StringTokenizer(
filenames, ", \t\n\r\f", false);
while (tok.hasMoreTokens()) {
this.filenames.addElement(tok.nextToken());
}
}
}
/**
* Returns the list of files represented by this FileList.
* @param p the current project
* @return the list of files represented by this FileList.
*/
public String[] getFiles(Project p) {
if (isReference()) {
return getRef(p).getFiles(p);
}
if (dir == null) {
throw new BuildException("No directory specified for filelist.");
}
if (filenames.size() == 0) {
throw new BuildException("No files specified for filelist.");
}
String[] result = new String[filenames.size()];
filenames.copyInto(result);
return result;
}
/**
* 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 &lt;file&gt; nested element.
*/
public static class FileName {
private String name;
/**
* The name attribute of the file element.
*
* @param name the name of a file to add to the file list.
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the name of the file for this element.
*/
public String getName() {
return name;
}
}
/**
* Add a nested &lt;file&gt; nested element.
*
* @param name a configured file element with a name.
* @since Ant 1.6.2
*/
public void addConfiguredFile(FileName name) {
if (name.getName() == null) {
throw new BuildException(
"No name specified in nested file element");
}
filenames.addElement(name.getName());
}
/**
* Fulfill the ResourceCollection contract.
* @return an Iterator of Resources.
* @since Ant 1.7
*/
public Iterator iterator() {
if (isReference()) {
return ((FileList) getRef(getProject())).iterator();
}
return new FileResourceIterator(dir,
(String[]) (filenames.toArray(new String[filenames.size()])));
}
/**
* Fulfill the ResourceCollection contract.
* @return number of elements as int.
* @since Ant 1.7
*/
public int size() {
if (isReference()) {
return ((FileList) getRef(getProject())).size();
}
return filenames.size();
}
/**
* Always returns true.
* @return true indicating that all elements will be FileResources.
* @since Ant 1.7
*/
public boolean isFilesystemOnly() {
return true;
}
}