ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Matt Benson <gudnabr...@gmail.com>
Subject Re: svn commit: r893843 - /ant/core/trunk/src/main/org/apache/tools/ant/types/resources/ResourceList.java
Date Mon, 28 Dec 2009 03:59:35 GMT
I like it...

On Dec 25, 2009, at 2:46 AM, bodewig@apache.org wrote:

> Author: bodewig
> Date: Fri Dec 25 08:46:08 2009
> New Revision: 893843
>
> URL: http://svn.apache.org/viewvc?rev=893843&view=rev
> Log:
> a resource collection that reads its members from a list file/ 
> resource.  Untested and undocumented, likely to be pushed to 1.8.1  
> unless I'll finish it in time for the RC1
>
> Added:
>     ant/core/trunk/src/main/org/apache/tools/ant/types/resources/ 
> ResourceList.java   (with props)
>
> Added: ant/core/trunk/src/main/org/apache/tools/ant/types/resources/ 
> ResourceList.java
> URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/ 
> apache/tools/ant/types/resources/ResourceList.java? 
> rev=893843&view=auto
> ====================================================================== 
> ========
> --- ant/core/trunk/src/main/org/apache/tools/ant/types/resources/ 
> ResourceList.java (added)
> +++ ant/core/trunk/src/main/org/apache/tools/ant/types/resources/ 
> ResourceList.java Fri Dec 25 08:46:08 2009
> @@ -0,0 +1,219 @@
> +/*
> + *  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.resources;
> +
> +import java.io.BufferedInputStream;
> +import java.io.BufferedReader;
> +import java.io.IOException;
> +import java.io.InputStreamReader;
> +import java.io.Reader;
> +import java.util.Iterator;
> +import java.util.Stack;
> +import java.util.Vector;
> +
> +import org.apache.tools.ant.BuildException;
> +import org.apache.tools.ant.Project;
> +import org.apache.tools.ant.PropertyHelper;
> +import org.apache.tools.ant.filters.util.ChainReaderHelper;
> +import org.apache.tools.ant.types.DataType;
> +import org.apache.tools.ant.types.FilterChain;
> +import org.apache.tools.ant.types.Resource;
> +import org.apache.tools.ant.types.ResourceCollection;
> +import org.apache.tools.ant.util.FileUtils;
> +
> +/**
> + * Reads a resource as text document and creates a resource for each
> + * line.
> + * @since Ant 1.8.0
> + */
> +public class ResourceList extends DataType implements  
> ResourceCollection {
> +    private final Vector filterChains = new Vector();
> +    private final Union textDocuments = new Union();
> +    private final Union cachedResources = new Union();
> +    private volatile boolean cached = false;
> +    private String encoding = null;
> +
> +    public ResourceList() {
> +        textDocuments.setCache(true);
> +        cachedResources.setCache(true);
> +    }
> +
> +    /**
> +     * Adds a source.
> +     */
> +    public void add(ResourceCollection rc) {
> +        if (isReference()) {
> +            throw noChildrenAllowed();
> +        }
> +        textDocuments.add(rc);
> +    }
> +
> +    /**
> +     * Adds a FilterChain.
> +     */
> +    public final void addFilterChain(FilterChain filter) {
> +        if (isReference()) {
> +            throw noChildrenAllowed();
> +        }
> +        filterChains.add(filter);
> +    }
> +
> +    /**
> +     * Encoding to use for input, defaults to the platform's default
> +     * encoding. <p>
> +     *
> +     * For a list of possible values see
> +     * <a href="http://java.sun.com/j2se/1.5.0/docs/guide/intl/ 
> encoding.doc.html">
> +     * http://java.sun.com/j2se/1.5.0/docs/guide/intl/ 
> encoding.doc.html
> +     * </a>.</p>
> +     */
> +    public final void setEncoding(String encoding) {
> +        if (isReference()) {
> +            throw tooManyAttributes();
> +        }
> +        this.encoding = encoding;
> +    }
> +
> +    /**
> +     * 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.
> +     */
> +    public final synchronized Iterator iterator() {
> +        if (isReference()) {
> +            return ((ResourceList) getCheckedRef()).iterator();
> +        }
> +        dieOnCircularReference();
> +        return cache().iterator();
> +    }
> +
> +    /**
> +     * Fulfill the ResourceCollection contract.
> +     * @return number of elements as int.
> +     */
> +    public synchronized int size() {
> +        if (isReference()) {
> +            return ((ResourceList) getCheckedRef()).size();
> +        }
> +        dieOnCircularReference();
> +        return cache().size();
> +    }
> +
> +    /**
> +     * Fulfill the ResourceCollection contract.
> +     * @return whether this is a filesystem-only resource collection.
> +     */
> +    public synchronized boolean isFilesystemOnly() {
> +        if (isReference()) {
> +            return ((ResourceList) getCheckedRef 
> ()).isFilesystemOnly();
> +        }
> +        dieOnCircularReference();
> +        return cache().isFilesystemOnly();
> +    }
> +
> +    /**
> +     * 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.
> +     */
> +    protected synchronized void dieOnCircularReference(Stack stk,  
> Project p)
> +        throws BuildException {
> +        if (isChecked()) {
> +            return;
> +        }
> +        if (isReference()) {
> +            super.dieOnCircularReference(stk, p);
> +        } else {
> +            pushAndInvokeCircularReferenceCheck(textDocuments,  
> stk, p);
> +            for (Iterator iter = filterChains.iterator();  
> iter.hasNext(); ) {
> +                FilterChain fc = (FilterChain) iter.next();
> +                pushAndInvokeCircularReferenceCheck(fc, stk, p);
> +            }
> +            setChecked(true);
> +        }
> +    }
> +
> +    private synchronized ResourceCollection cache() {
> +        if (!cached) {
> +            for (Iterator iter = textDocuments.iterator();  
> iter.hasNext(); ) {
> +                cachedResources.add(read((Resource) iter.next()));
> +            }
> +            cached = true;
> +        }
> +        return cachedResources;
> +    }
> +
> +    private ResourceCollection read(Resource r) {
> +        BufferedInputStream bis = null;
> +        try {
> +            bis = new BufferedInputStream(r.getInputStream());
> +            Reader input = null;
> +            if (encoding == null) {
> +                input = new InputStreamReader(bis);
> +            } else {
> +                input = new InputStreamReader(bis, encoding);
> +            }
> +            ChainReaderHelper crh = new ChainReaderHelper();
> +            crh.setPrimaryReader(input);
> +            crh.setFilterChains(filterChains);
> +            crh.setProject(getProject());
> +            BufferedReader reader = new BufferedReader 
> (crh.getAssembledReader());
> +
> +            Union streamResources = new Union();
> +            streamResources.setCache(true);
> +
> +            String line = null;
> +            while ((line = reader.readLine()) != null) {
> +                streamResources.add(parse(line));
> +            }
> +
> +            return streamResources;
> +        } catch (final IOException ioe) {
> +            throw new BuildException("Unable to read resource " +  
> r.getName()
> +                                     + ": " + ioe, ioe, getLocation 
> ());
> +        } finally {
> +            FileUtils.close(bis);
> +        }
> +    }
> +
> +    private Resource parse(final String line) {
> +        PropertyHelper propertyHelper
> +            = (PropertyHelper) PropertyHelper.getPropertyHelper 
> (getProject());
> +        Object expanded = propertyHelper.parseProperties(line);
> +        if (expanded instanceof Resource) {
> +            return (Resource) expanded;
> +        }
> +        String expandedLine = expanded.toString();
> +        int colon = expandedLine.indexOf(":");
> +        if (colon != -1) {
> +            // could be an URL or an absolute file on an OS with  
> drives
> +            try {
> +                return new URLResource(expandedLine);
> +            } catch (BuildException mfe) {
> +                // a translated MalformedURLException
> +
> +                // probably it's an absolute path fall back to file
> +                // resource
> +            }
> +        }
> +        return new FileResource(getProject(), expandedLine);
> +    }
> +}
>
> Propchange: ant/core/trunk/src/main/org/apache/tools/ant/types/ 
> resources/ResourceList.java
> ---------------------------------------------------------------------- 
> --------
>     svn:eol-style = native
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Mime
View raw message