FileDocCategorySizeDatePackage
BaseResourceCollectionContainer.javaAPI DocApache Ant 1.707816Wed Dec 13 06:16:24 GMT 2006org.apache.tools.ant.types.resources

BaseResourceCollectionContainer

public abstract class BaseResourceCollectionContainer extends org.apache.tools.ant.types.DataType implements Cloneable, org.apache.tools.ant.types.ResourceCollection
Base class for ResourceCollections that nest multiple ResourceCollections.
since
Ant 1.7

Fields Summary
private List
rc
private Collection
coll
private boolean
cache
Constructors Summary
Methods Summary
public synchronized voidadd(org.apache.tools.ant.types.ResourceCollection c)
Add a ResourceCollection to the container.

param
c the ResourceCollection to add.
throws
BuildException on error.

        if (isReference()) {
            throw noChildrenAllowed();
        }
        if (c == null) {
            return;
        }
        rc.add(c);
        FailFast.invalidate(this);
        coll = null;
        setChecked(false);
    
public synchronized voidaddAll(java.util.Collection c)
Add the Collection of ResourceCollections to the container.

param
c the Collection whose elements to add.
throws
BuildException on error.

        if (isReference()) {
            throw noChildrenAllowed();
        }
        try {
            for (Iterator i = c.iterator(); i.hasNext();) {
                add((ResourceCollection) i.next());
            }
        } catch (ClassCastException e) {
            throw new BuildException(e);
        }
    
private synchronized java.util.CollectioncacheCollection()

        if (coll == null || !isCache()) {
            coll = getCollection();
        }
        return coll;
    
public synchronized voidclear()
Clear the container.

throws
BuildException on error.

        if (isReference()) {
            throw noChildrenAllowed();
        }
        rc.clear();
        FailFast.invalidate(this);
        coll = null;
        setChecked(false);
    
public java.lang.Objectclone()
Implement clone. The set of nested resource collections is shallowly cloned.

return
a cloned instance.

        try {
            BaseResourceCollectionContainer c
                = (BaseResourceCollectionContainer) super.clone();
            c.rc = new ArrayList(rc);
            c.coll = null;
            return c;
        } catch (CloneNotSupportedException e) {
            throw new BuildException(e);
        }
   
protected synchronized voiddieOnCircularReference(java.util.Stack stk, org.apache.tools.ant.Project p)
Overrides the version of DataType to recurse on all DataType child elements that may have been added.

param
stk the stack of data types to use (recursively).
param
p the project to use to dereference the references.
throws
BuildException on error.

        if (isChecked()) {
            return;
        }
        if (isReference()) {
            super.dieOnCircularReference(stk, p);
        } else {
            for (Iterator i = rc.iterator(); i.hasNext();) {
                Object o = i.next();
                if (o instanceof DataType) {
                    stk.push(o);
                    invokeCircularReferenceCheck((DataType) o, stk, p);
                    stk.pop();
                }
            }
            setChecked(true);
        }
    
protected abstract java.util.CollectiongetCollection()
Template method for subclasses to return a Collection object of Resources.

return
Collection.

protected final synchronized java.util.ListgetResourceCollections()
Get the nested ResourceCollections.

return
List.

        dieOnCircularReference();
        return Collections.unmodifiableList(rc);
    
public synchronized booleanisCache()
Learn whether to cache collections. Default is true.

return
boolean cache flag.

        return cache;
    
public synchronized booleanisFilesystemOnly()
Fulfill the ResourceCollection contract.

return
whether this is a filesystem-only resource collection.

        if (isReference()) {
            return ((BaseResourceCollectionContainer) getCheckedRef()).isFilesystemOnly();
        }
        dieOnCircularReference();
        //first the easy way, if all children are filesystem-only, return true:
        boolean goEarly = true;
        for (Iterator i = rc.iterator(); goEarly && i.hasNext();) {
            goEarly &= ((ResourceCollection) i.next()).isFilesystemOnly();
        }
        if (goEarly) {
            return true;
        }
        /* now check each Resource in case the child only
           lets through files from any children IT may have: */
        for (Iterator i = cacheCollection().iterator(); i.hasNext();) {
            if (!(i.next() instanceof FileResource)) {
                return false;
            }
        }
        return true;
    
public final synchronized java.util.Iteratoriterator()
Fulfill the ResourceCollection contract. The Iterator returned will throw ConcurrentModificationExceptions if ResourceCollections are added to this container while the Iterator is in use.

return
a "fail-fast" Iterator.

        if (isReference()) {
            return ((BaseResourceCollectionContainer) getCheckedRef()).iterator();
        }
        dieOnCircularReference();
        return new FailFast(this, cacheCollection().iterator());
    
public synchronized voidsetCache(boolean b)
Set whether to cache collections.

param
b boolean cache flag.


                   
         
        cache = b;
    
public synchronized intsize()
Fulfill the ResourceCollection contract.

return
number of elements as int.

        if (isReference()) {
            return ((BaseResourceCollectionContainer) getCheckedRef()).size();
        }
        dieOnCircularReference();
        return cacheCollection().size();
    
public synchronized java.lang.StringtoString()
Format this BaseResourceCollectionContainer as a String.

return
a descriptive String.

        if (isReference()) {
            return getCheckedRef().toString();
        }
        if (cacheCollection().size() == 0) {
            return "";
        }
        StringBuffer sb = new StringBuffer();
        for (Iterator i = coll.iterator(); i.hasNext();) {
            if (sb.length() > 0) {
                sb.append(File.pathSeparatorChar);
            }
            sb.append(i.next());
        }
        return sb.toString();