I like it...

On Dec 25, 2009, at 2:46 AM, bode...@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-unsubscr...@ant.apache.org
For additional commands, e-mail: dev-h...@ant.apache.org

Reply via email to